def get_event_content(event_id): #os.system('''export http_proxy=""''') print '获取id为[%d]的活动内容' % event_id http = Http('plogin.12580.com', 80) #para = {'act':'xml','id':event_id} #req_para = http.getparams(para) url = '%s%d' % ('/cmps/wapcms/wap/web_online_xml.php?id=', event_id) ret = http.request(url) #解析返回的xml报文 #om = parseString(ret) #field_node = dom.documentElement #content_node = field_node.getElementsByTagName('content')[0] #data = None #if content_node.nodeType in (content_node.TEXT_NODE,content_node.CDATA_SECTION_NODE): # data = content_node.data #else: # print content_node.nodeType print 'cms返回报文: %s ' % ret root = ET.fromstring(ret) msg = {} for node in root: msg[node.tag] = node.text data = msg['content'] print 'cms返回的活动内容为:%s' % (data or 'cms返回空') #os.system('''export http_proxy="http://127.0.0.1:8087/"''') return data
def upload(self, url, data): import json data = json.dumps(data) ip = Http.get("http://ip.6655.com/ip.aspx", datas={}, heads={'content-type': 'application/json'}) ip = ip.text headers = { 'content-type': 'application/json', 'ip': '%s' % (ip), 'Authorization': '258JWTAUTH %s' % (self.get_token()) } try: import json data = Http.post( 'http://%s:%s/%s' % (self.config()['domain'], self.config()['port'], url), data, headers) print "dfds" print data.text data = json.loads(data.text) print data if data['code'] == 400: return "上报数据失败" return True except Exception, e: print e return False
def doProcess(self, index, showInfo): try: mobile = Mobile() items = mobile.assemble( self._config.choiceDev(), int(self._config.getGlobal('count'))).__dict__ items.update(self._config.choiceAct()) data = package('password', json.dumps(items)) http = Http(self._config.getGlobal('host'), self._config.getGlobal('port')) data = http.request(data) size = hex2int(data[36:44]) body = data[44:45 + size] ret = None if showInfo: print 'start %s' % ("=" * 20) if ftype.isZIP(body): ret = "BINARY" print 'recv zip format data.' else: ret = "TEXT" print '%s' % ungzip(body) print 'End %s %s' % (index, "=" * 20) else: ret = body except: ret = None return ret
def get_event_content(event_id): #os.system('''export http_proxy=""''') print '获取id为[%d]的活动内容' % event_id http = Http('plogin.12580.com',80) #para = {'act':'xml','id':event_id} #req_para = http.getparams(para) url = '%s%d' % ('/cmps/wapcms/wap/web_online_xml.php?id=',event_id) ret = http.request(url) #解析返回的xml报文 #om = parseString(ret) #field_node = dom.documentElement #content_node = field_node.getElementsByTagName('content')[0] #data = None #if content_node.nodeType in (content_node.TEXT_NODE,content_node.CDATA_SECTION_NODE): # data = content_node.data #else: # print content_node.nodeType print 'cms返回报文: %s ' % ret root = ET.fromstring(ret) msg = {} for node in root: msg[node.tag] = node.text data = msg['content'] print 'cms返回的活动内容为:%s' % (data or 'cms返回空') #os.system('''export http_proxy="http://127.0.0.1:8087/"''') return data
def __init__(self, url, account=None, passwd=None, encoding='utf-8'): self.url = url.rstrip("/") self.account = account self.passwd = passwd self.encoding = encoding self.token = None self.uttpUtil = Http()
def __init__(self, name="0000000", count=0, makeRooms=[]): self.robot = Robot() self.http = Http() self.name = name self.count = count #编号 self.listMsgQue = [] #消息发送队列 self.timeDetaMsgSend = 1.1 #最小发送消息间隔s self.makeRooms = makeRooms self.roomIndex = {} #房间号 及其<用户>信息 self.roomMsg = {} #消息 记录 self.roomId = "" #当前房号 ############### 心情模块 self.statusMin = 20 self.statusMax = 95 self.statusDefault = 80 self.status = 90 #说话欲望值 0-100 self.statusOnDeta = 15 #开心 self.statusOffDeta = 15 #难过 self.statusDownDeta = 40 #闭嘴 self.getMsgDetaTime = 1 #抓取消息间隔 self.lastMsgTime = int( time.time() * 10000) * 1.0 / 10000 #上一次更新房间聊天记录时间 self.lastEchoTime = tool.getNowTime() #上次说话时间 self.maxDetaTime = 1000 * 60 * 3 # 最大沉默时间 self.lastMusicTime = tool.getNowTime() self.maxMusicTime = 1000 * 60 * 4 #音乐间隔 暂不解析音乐文件时长控制 self.musicNow = {} self.musicPlayType = -1 self.ifOnMusic = True self.tail = " の... "
def __init__(self, name="Test", id="18408249138", pwd="1234qwer"): reload(sys) sys.setdefaultencoding('utf8') #针对socket发送中文异常 self.detaTime = 3600 * 1000 #推送延时 60min self.detaTimeMin = 1200 * 1000 #推送延时 20min self.id = id self.pwd = pwd self.name = name self.robot = Robot() self.http = Http() self.db = Database('sqlite_' + self.id + '.db') self.socket = Socket() self.onConnect = False self.ifOk = False # sendTime添加时间, type消息类型, msg发送消息体, deta间隔发送时间, preTime预期发送时间节点 self.db.execute( ''' create table if not exists cochat( id text, sendTime text, sendTimeT text, deta text, preTime text, preTimeT text, type text, msg text, flag text ) ''' ) self.sendList = [] #发送队列 (time, deta, type, data) return
def __init__(self, name="0000000"): self.http = Http() self.name = name # https://console.bce.baidu.com/ai/?_=1533038198056&fromai=1#/ai/speech/app/detail~appId=464300 self.appId = "11615410" self.appKey = "zzTM1VXx7Edmj4QXqCcnhZfF" self.appSecret = "jekAAbrElm87rpMM7jVBFFuKrm8ZWbwy" self.loginRes = {} self.access_token = ""
def translate(msg, langpair): print msg #import pdb; pdb.set_trace() http = Http('ajax.googleapis.com', 443) params = {'v': '1.0', 'q': msg, 'langpair': langpair} #if http.request('/ajax/services/language/translate?v=1.0&q=%s&langpair=%s' % (msg, langpair)): if http.request('/ajax/services/language/translate', 'GET', params): response = http.parse() print response if response.get('responseStatus', None) == 200: result = response['responseData']['translatedText'] print 'TRANSLATION:', result return result
class Glance: def __init__(self, server, port, auth_token): self.__server = server self.__http = Http(server) self.__http.set_port(port) self.__auth_token = auth_token def get_image_ref(self, image_name=None): header = {"X-Auth-Token": self.__auth_token} data = self.__http.send_get('v2/images', {}, header) if image_name is None: return self.__server + data['images'][0]['self'] for i in range(0, len(data['images'])): if data['images'][0]['name'] == image_name: return self.__server + data['images'][i]['self']
class HttpProcessor(threading.Thread): """ Thread object to spawn multiple HTTP connection threads """ def __init__(self, queue, cookiejar, connection_pool): """ @param queue: The C{Queue.Queue} object that contains L{HttpRequest} objects. @param cookiejar: The C{LockableCookieJar} cookie object to share among requests. @param connection_pool: The C{ConnectionPool} object which contains connections to share among requests. """ threading.Thread.__init__(self) self.queue = queue self.http = Http(cookiejar=cookiejar, connection_pool=connection_pool) def run(self): # The Queue item is expected to either an HttpRequest object # or None (to shut down the thread) logging.debug('Thread started, waiting for requests.') while (True): item = self.queue.get() if item is None: logging.debug('Shutting down thread.') return try: item.data = self.http.request(*item.args, **item.kwargs) finally: if item.lock: item.lock.release()
class Network: def __init__(self, server, port, auth_token): self.__http = Http(server) self.__http.set_port(port) self.__auth_token = auth_token def get_network_id(self, network_name=''): header = {"X-Auth-Token": self.__auth_token} data = self.__http.send_get('v2.0/networks', {}, header) networks = data['networks'] for i in range(0, len(networks)): if networks[i]['name'] == network_name: return networks[i]['id'] return 0
def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.mimes = {'team': 'application/x-team-item', 'event': 'application/x-calendar-event', } self.rooms = [] self.tree = [] self.rfid_id = None self.http = Http(self) self.work_hours = (8, 24) self.schedule_quant = timedelta(minutes=30) self.menus = [] self.create_menus() self.setup_views() settings = QSettings() settings.beginGroup('network') host = settings.value('addressHttpServer', QVariant('WrongHost')) settings.endGroup() if 'WrongHost' == host.toString(): self.setupApp() self.baseTitle = _('Manager\'s interface') self.logoutTitle() self.statusBar().showMessage(_('Ready'), 2000) self.resize(640, 480)
def __init__(self, queue, cookiejar, connection_pool): """ @param queue: The C{Queue.Queue} object that contains L{HttpRequest} objects. @param cookiejar: The C{LockableCookieJar} cookie object to share among requests. @param connection_pool: The C{ConnectionPool} object which contains connections to share among requests. """ threading.Thread.__init__(self) self.queue = queue self.http = Http(cookiejar=cookiejar, connection_pool=connection_pool)
def run(self): self._debug('started') inmates = Inmates(Inmate, self._monitor) inmates_scraper = InmatesScraper(Http(), inmates, InmateDetails, self._monitor) search_commands = SearchCommands(inmates_scraper, self._monitor) controller = Controller(self._monitor, search_commands, inmates_scraper, inmates) controller.run() self._debug('waiting for processing to finish') controller.wait_for_finish() self._debug('finished')
def check_for_missing_inmates(self, start_date): self._debug('started check_for_missing_inmates') inmates = Inmates(Inmate, self._monitor) inmates_scraper = InmatesScraper(Http(), inmates, InmateDetails, self._monitor, workers_to_start=70) search_commands = SearchCommands(inmates_scraper, self._monitor) controller = Controller(self._monitor, search_commands, inmates_scraper, inmates) controller.find_missing_inmates(start_date) self._debug('waiting for check_for_missing_inmates processing to finish') controller.wait_for_finish() self._debug('finished check_for_missing_inmates')
def __init__(self, server, port, username, password, domain='default'): self.__http = Http(server) self.__http.set_port(port) self.__username = username self.__password = password self.__get_auth_token() self.__get_tenant_id()
def __init__(self, name="Test"): self.name = name self.http = Http() self.db = Database() self.db.execute(''' create table if not exists auto( url text, about text, time text, v1 text, v2 text, v3 text, v4 text, v5 text ) ''') return
class Auth: def __init__(self, server, port, username, password, domain='default'): self.__http = Http(server) self.__http.set_port(port) self.__username = username self.__password = password self.__get_auth_token() self.__get_tenant_id() def __get_auth_token(self): data_request = { "auth": { "tenantName": self.__username, "passwordCredentials": { "username": self.__username, "password": self.__password } } } data = self.__http.send_post('v2.0/tokens', data_request) self.__auth_token = data['access']['token']['id'] def __get_tenant_id(self): header = {"X-Auth-Token": self.__auth_token} data = self.__http.send_get('v2.0/tenants', {}, header) tenants = data['tenants'] for i in range(0, len(tenants), 1): if tenants[i]['name'] == self.__username: self.__tenant_id = tenants[i]['id'] def get_auth_token(self): return self.__auth_token def get_tenant_id(self): return self.__tenant_id
def dissect(tcp): """Runs all TCP dissectors. @param conn: connection. @param data: payload data. """ ptcp = {} # populate array of connections of Cuckoo default report ptcp["layer"] = 4 # Source port ptcp["protocol_name"] = "TCP" ptcp["sport"] = tcp.sport # Source port ptcp["dport"] = tcp.dport # Destination port ptcp["seqnum"] = tcp.seq # Sequence number ptcp["acknum"] = tcp.flags # Acknowledge number ptcp["off"] = tcp.off # Data offset ptcp["reserved"] = 0 # Reserved - always 0 ptcp["cb"] = Tcp.tcp_flags(tcp.data) # Verify flag of control bits ptcp["win"] = tcp.win # Window ptcp["cksum"] = tcp.sum # Checksum ptcp["urp"] = tcp.urp # Urgent Pointer ptcp["options"] = tcp.opts # Options ptcp["padding"] = '' # TODO not present in dpkt.ip.IP (maybe computed) # HTTP if http.check(tcp.data): ptcp["payload"] = http.dissect(tcp.data) # SMTP. elif smtp.check(tcp): ptcp["payload"] = smtp.dissect(tcp.data) # IRC elif irc.check(tcp): ptcp["payload"] = irc.dissect(tcp.data) # DNS elif dns.check(tcp): ptcp["payload"] = dns.dissect(tcp.data) # Unknown Protocol else: ptcp["payload"] = "unknown protocol on layer " + str( ptcp["layer"] + 1) return ptcp
def dissect(tcp): """Runs all TCP dissectors. @param conn: connection. @param data: payload data. """ ptcp = {} # populate array of connections of Cuckoo default report ptcp["layer"] = 4 # Source port ptcp["protocol_name"] = "TCP" ptcp["sport"] = tcp.sport # Source port ptcp["dport"] = tcp.dport # Destination port ptcp["seqnum"] = tcp.seq # Sequence number ptcp["acknum"] = tcp.flags # Acknowledge number ptcp["off"] = tcp.off # Data offset ptcp["reserved"] = 0 # Reserved - always 0 ptcp["cb"] = Tcp.tcp_flags(tcp.data) # Verify flag of control bits ptcp["win"] = tcp.win # Window ptcp["cksum"] = tcp.sum # Checksum ptcp["urp"] = tcp.urp # Urgent Pointer ptcp["options"] = tcp.opts # Options ptcp["padding"] = '' # TODO not present in dpkt.ip.IP (maybe computed) # HTTP if http.check(tcp.data): ptcp["payload"] = http.dissect(tcp.data) # SMTP. elif smtp.check(tcp): ptcp["payload"] = smtp.dissect(tcp.data) # IRC elif irc.check(tcp): ptcp["payload"] = irc.dissect(tcp.data) # DNS elif dns.check(tcp): ptcp["payload"] = dns.dissect(tcp.data) # Unknown Protocol else: ptcp["payload"] = "unknown protocol on layer " + str(ptcp["layer"]+1) return ptcp
def __init__(self, name="0000000",flowName="", count = 0, makeRooms=[]): self.robot = Robot() self.http = Http() self.name = name self.flowName = flowName self.count = count #编号 self.listMsgQue = [] #消息发送队列 self.timeDetaMsgSend = 1.5 #最小发送消息间隔s self.makeRooms = makeRooms self.userIndex = {} # 用户name -> 用户id self.userIndexRe = {} #id -> name self.roomIndex = {} #房间号 及其<用户>信息 self.roomMsg = {} #消息 记录 self.roomId = "" #当前房号 self.ifWelcom = False #是否迎客 self.ifTime = False #是否存货确认 self.admins = {} self.tripcodeIndex = {} #上次房间记录 的 用户名 绑定的 tc code self.linkStart = 0 #链接状态 self.init() self.tail = " の... "
def __init__(self): self.id = "test id" self.name = "test name" self.http = Http() self.auto163 = Auto163("Music") self.apiKey = "bfbf6432b655493b9e861b470bca9921" self.userId = "WalkerDust" self.db = Database() self.db.execute(''' create table if not exists music( url text primary key, name text, duration text, fromName text, count text ) ''') self.db.execute(''' create table if not exists user( name text primary key, id text, icon text, flag text ) ''') self.db.execute(''' create table if not exists msg( id text primary key, userName text, data text, time text ) ''') self.initMusic() self.palyHistoryMusic = [] return
def doProcess(self, index, showInfo): try: mobile = Mobile() items = mobile.assemble(self._config.choiceDev(), int(self._config.getGlobal('count'))).__dict__ items.update(self._config.choiceAct()) data = package('password', json.dumps(items)) http = Http(self._config.getGlobal('host'), self._config.getGlobal('port')) data = http.request(data) size = hex2int(data[36:44]) body = data[44:45 + size] ret = None if showInfo: print 'start %s' % ("=" * 20) if ftype.isZIP(body): ret = "BINARY" print 'recv zip format data.' else: ret = "TEXT" print '%s' % ungzip(body) print 'End %s %s' % (index, "=" * 20) else: ret = body except: ret = None return ret
def __init__(self, name="Test"): self.name = name self.http = Http() self.db = Database() self.db.execute(''' create table if not exists music( url text primary key, name text, fromName text, count text ) ''') return
def get(attraction): url = "{}{}".format("/attraction/get/", attraction['id']) res = Http.get(url, True) json = res.json() status = '' if json['ShortWaitTimeDisplay'] == 'Closed': status = attraction['closed_message'] else: status = "{} {} minutes".format(attraction['open_message'], json['PostedWaitTime']) if 'twitter_cfg' in attraction: Comm.tweet(status, attraction['twitter_cfg']) else: print status
def login(self): from http import Http import json data = {'username': self.username, 'password': self.password} headers = {'content-type': 'application/json'} try: data = Http.post( 'http://%s:%s/api/token/' % (self.config()['domain'], self.config()['port']), data, headers) if data.status_code == 400: return False data = json.loads(data.text) return data['token'] except Exception, e: return False
def log(): print e.get() number = e.get() if number == '': show_tip() else: key = Http.get_key(number) print key if key == '': show_code_error() else: print key root.withdraw() chrome = Chrome(key) chrome.open_web()
class Auto: def __init__(self, name="Test"): self.name = name self.http = Http() self.db = Database() self.db.execute( ''' create table if not exists auto( url text, about text, time text, v1 text, v2 text, v3 text, v4 text, v5 text ) ''' ) return # 日志输出 def out(self, obj): print(time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." + self.__module__ + self.name + "." + str(obj)) # tools.out(obj) return # 实时控制帮助 def help(self): self.out(dir(self)) return # doMethod([methodName arg1 arg2]) -> methodName(arg1,arg2) def doMethod(self, listArgs): size = len(listArgs) res = None if(size > 0): if(hasattr(self, listArgs[0])): method = getattr(self, listArgs[0]) if(callable(method)): if(size == 2): res = method(listArgs[1]) elif(size == 3): res = method(listArgs[1], listArgs[2]) elif(size == 4): res = method(listArgs[1], listArgs[2], listArgs[3]) elif(size == 5): res = method(listArgs[1], listArgs[2], listArgs[3], listArgs[4]) else: res = method() else: self.out(method) return res # 手动命令监控 def inputHello(self): self.out("开启输入监控!") self.help() while(True): try: cmd=raw_input("") if(cmd != ""): if(not self.doMethod(cmd.split(" "))): self.doCmd(cmd) time.sleep(1) except Exception as e: self.out(repr(e)) return # 测试用 def test(self): self.login() # 输入监控线程 ThreadRun( "InputHello." + str(self.name), self.inputHello ).start() tool.wait() return # 非函数调用 属性变量查看 其他的指令控制 def doCmd(self, cmd): self.out("其他指令." + str(cmd)) return # 认证登录 def login(self): self.out("访问主页 获取 token session") # http://content.icbc.com.cn/site1/a5f9ff6d068a46e68d363426ca69bd07/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=1548294412328 # "http://content.icbc.com.cn/site1/a5f9ff6d068a46e68d363426ca69bd07/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=1545268253550" #http://content.icbc.com.cn/site1/a5f9ff6d068a46e68d363426ca69bd07/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=1552005766720 ttt = str(tool.getNowTime()) kkk = 'a5f9ff6d068a46e68d363426ca69bd07' url = "http://content.icbc.com.cn/site1/" + kkk + "/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=" + ttt #BIGipServerwifi_ContextPlat_80_Pool 2097346570.20480.0000 N/A N/A N/A 59 #cmp_glb_param 98f7808c851a9f53da5f0c3f1639b678 N/A N/A N/A 46 #layerNettimeType true N/A N/A N/A 23 #layerPosterType true N/A N/A N/A 22 #layerSafeType true N/A N/A N/A 20 #Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 #Accept-Encoding: gzip, deflate #Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7 #Connection: keep-alive header = { "Cookie" : "BIGipServerwifi_ContextPlat_80_Pool=2097346570.20480.0000; layerSafeType=true; layerPosterType=true; layerNettimeType=true; cmp_glb_param=98f7808c851a9f53da5f0c3f1639b678" } self.http.addHeader(header) self.http.show() responce = self.http.doGet(url) re = responce.read() soup =BeautifulSoup.BeautifulSoup(re) nameList = soup.findAll('button',{'id':{'login_btn'}}) if(len(nameList) > 0): self.out(nameList) self.out("抓取成功: ") self.http.show(responce) self.out("模拟登录") # http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true url = "http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true" #{"msg":"GlbInfo检查不通过","retCode":1,"success":false,"data":{"needJump":"http%3A%2F%2Fwww.baidu.com%2F"}} json=self.http.doJson(url) self.out((json)) self.out(json["msg"]) self.out(json["data"]["needJump"]) else: self.out("error! 没能抓取到token") return False
def search_by_isbn(cls, isbn): # 根据isbn来查询书籍 url = cls.isbn_url.format(isbn) result = Http.get(url) return result
class Auto: def __init__(self, name="Test"): self.name = name self.http = Http() self.db = Database() self.db.execute( ''' create table if not exists auto( url text, about text, time text, v1 text, v2 text, v3 text, v4 text, v5 text ) ''' ) return # 日志输出 def out(self, obj): print(time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." + self.__module__ + self.name + "." + str(obj)) # tools.out(obj) return # 实时控制帮助 def help(self): self.out(dir(self)) return # doMethod([methodName arg1 arg2]) -> methodName(arg1,arg2) def doMethod(self, listArgs): size = len(listArgs) res = None if(size > 0): if(hasattr(self, listArgs[0])): method = getattr(self, listArgs[0]) if(callable(method)): if(size == 2): res = method(listArgs[1]) elif(size == 3): res = method(listArgs[1], listArgs[2]) elif(size == 4): res = method(listArgs[1], listArgs[2], listArgs[3]) elif(size == 5): res = method(listArgs[1], listArgs[2], listArgs[3], listArgs[4]) else: res = method() else: self.out(method) return res # 手动命令监控 def inputHello(self): self.out("开启输入监控!") self.help() while(True): try: cmd=raw_input("") if(cmd != ""): if(not self.doMethod(cmd.split(" "))): self.doCmd(cmd) time.sleep(1) except Exception as e: self.out(repr(e)) return # 测试用 def test(self): self.login() # 输入监控线程 ThreadRun( "InputHello." + str(self.name), self.inputHello ).start() tool.wait() return # 非函数调用 属性变量查看 其他的指令控制 def doCmd(self, cmd): self.out("其他指令." + str(cmd)) return # 认证登录 def login(self): self.out("访问主页 获取 token session") # "http://content.icbc.com.cn/site1/a5f9ff6d068a46e68d363426ca69bd07/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=1545268253550" ttt = '1545268253550' #str(tool.getNowTime()) kkk = 'a5f9ff6d068a46e68d363426ca69bd07' url = "http://content.icbc.com.cn/site1/" + kkk + "/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=" + ttt responce = self.http.doGet(url) re = responce.read() soup =BeautifulSoup.BeautifulSoup(re) nameList = soup.findAll('button',{'id':{'login_btn'}}) if(len(nameList) > 0): self.out(nameList) self.out("抓取成功: ") self.out("cookie\t " + tool.toString(self.http.getCookie())) self.out("模拟登录") # http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true url = "http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true" json=self.http.doJson(url) self.out((json)) else: self.out("error! 没能抓取到token") return False
class AutoSophia: def __init__(self, name="0000000", count=0, makeRooms=[]): self.robot = Robot() self.http = Http() self.name = name self.count = count #编号 self.listMsgQue = [] #消息发送队列 self.timeDetaMsgSend = 1.1 #最小发送消息间隔s self.makeRooms = makeRooms self.roomIndex = {} #房间号 及其<用户>信息 self.roomMsg = {} #消息 记录 self.roomId = "" #当前房号 ############### 心情模块 self.statusMin = 20 self.statusMax = 95 self.statusDefault = 80 self.status = 90 #说话欲望值 0-100 self.statusOnDeta = 15 #开心 self.statusOffDeta = 15 #难过 self.statusDownDeta = 40 #闭嘴 self.getMsgDetaTime = 1 #抓取消息间隔 self.lastMsgTime = int( time.time() * 10000) * 1.0 / 10000 #上一次更新房间聊天记录时间 self.lastEchoTime = tool.getNowTime() #上次说话时间 self.maxDetaTime = 1000 * 60 * 3 # 最大沉默时间 self.lastMusicTime = tool.getNowTime() self.maxMusicTime = 1000 * 60 * 4 #音乐间隔 暂不解析音乐文件时长控制 self.musicNow = {} self.musicPlayType = -1 self.ifOnMusic = True self.tail = " の... " def out(self, obj): print( time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." + self.name + "." + str(obj)) return def login(self): # tool.line() self.out("访问主页 获取 token session") responce = self.http.doGet('http://drrr.com/') re = responce.read() soup = BeautifulSoup.BeautifulSoup(re) # self.out soup.prettify() nameList = soup.findAll('input', {'name': {'token'}}) if (len(nameList) > 0): token = nameList[0]['data-value'] token = tool.encode(token) self.out("抓取成功: ") self.out("token\t " + token) self.out("cookie\t " + tool.toString(self.http.getCookie())) # tool.line() self.out("模拟登录") responce = self.http.doPost( 'http://drrr.com/', { "name": self.name, "login": "******", "token": token, "direct-join": "", "language": "zh-CN", "icon": "zaika-2x", }) else: self.out("error! 没能抓取到token") def createRoom(self, room=""): # tool.line() self.out("创建房间") if (room == ""): room = {} room["name"] = self.name + "'s room" responce = self.http.doPost( "http://drrr.com/create_room/?", { "name": room.get("name", ""), "description": room.get("description", ""), "limit": room.get("limit", 10), "music": room.get("music", True), "submit": room.get("music", "创建房间"), }) def help(self): self.out(dir(self)) def showUser(self, user, show=True): userInfo = "U " + tool.fill( user.get("device", ""), ' ', 15) + " " + tool.fill( user.get("icon", ""), ' ', 15) + " " + user.get("name", "") if (show): self.out(userInfo) return userInfo def showRoom(self, roomId, show=True, i=0): room = self.roomIndex.get(roomId, "") if (room == ""): self.getRooms() room = self.roomIndex.get(roomId, "") info = "" if (room != ""): info = ("##" + tool.fill(str(i), '#', 40) + "\n--G " + tool.fill( room["id"], ' ', 15) + " " + tool.fill( str(room["total"]) + "/" + str(room["limit"]), ' ', 15) + " " + room["name"]) + "\n" info = info + "music: " + str( room.get("music", False)) + " language:" + room.get( "language", "" ) + "\n" # " 静态房间: " + str(room.get("staticRoom", "")) + "" # info = info + " hiddenRoom: " + str(room.get("staticRoom", "")) + " 游戏房间: " + str(room.get("gameRoom", "")) + " 成人房间: " + str(room.get("adultRoom", "")) + "\n" info = info + "Host:" + room.get("host", {}).get("name", "") + "\n" info = info + "Users: " + "\n" for item in room.get("users", []): info = info + "--" + self.showUser(item, False) + "\n" if (show): self.out(info) return info def showAllRoom(self): if (self.roomIndex is None or self.roomIndex == "" or self.roomIndex == {}): self.getRooms() tool.line() self.out("展示所有房间信息") i = 0 for key in self.roomIndex: # room = self.roomIndex[key] self.showRoom(key, True, i) i = i + 1 tool.line() # 获取当前房间人员列表 def getRoomUsers(self, roomId=""): room = self.roomIndex.get(roomId, {}) users = room.get("users", []) return users # 获取用户所在房间 def getUserRoom(self, userName="******", userId="8f1b61e25098b0427f01d724716b70cb"): i = 0 res = [] for key in self.roomIndex: room = self.roomIndex[key] users = room.get("users", []) for user in users: if (user.get("name", "") == userName): # self.showRoom(key, True, i) res.append(room) if (user.get("id", "") == userId): self.showRoom(key, True, i) i = i + 1 if (len(res) <= 0): self.out("用户不在线" + userName) if (len(res) >= 2): self.out("该用户多次出现?????") for item in res: self.out(item) tool.line() return res def goRoomName(self, roomName): if (self.roomIndex is None or self.roomIndex == "" or self.roomIndex == {}): self.getRooms() tool.line() self.out("查找房间名字加入" + roomName) i = 0 for key in self.roomIndex: room = self.roomIndex[key] name = room.get("name", "") if (re.search(roomName, name) != None): self.goRoom(key) break i = i + 1 tool.line() def goRoom(self, roomId): # tool.line() self.out("加入房间:" + roomId) # self.showRoom(roomId) responce = self.http.doGet("http://drrr.com/room/?id=" + roomId) self.roomId = roomId # self.send("/me 大家好 我是暖手宝" + self.name + " 可以@ [点歌/turn/prev](*^_^*) @不一定会回 不@也不一定不会回(∩_∩) ") return def outRoom(self): self.out("离开房间:" + self.roomId) # self.send("/me " + self.name + "好无聊啊 "+self.name +"要出去溜达一会儿" + self.tail) # self.send("/me "+self.name+"一定会回来的" + self.tail) # self.send("/me 出去一下,马上回来" + self.tail) # self.showRoom(self.roomId) time.sleep(self.timeDetaMsgSend * len(self.listMsgQue) + 1) #等待一会儿消息发送 responce = self.http.doPost("http://drrr.com/room/?ajax=1", { "leave": "leave", }) self.roomId = "" if (responce == "error"): return False return True def getRooms(self, detail=False): # tool.line() self.out("获取房间列表") responce = self.http.doGet("http://drrr.com/lounge?api=json") jsonObj = tool.makeObj(json.loads(responce.read())) rooms = jsonObj["rooms"] if (len(rooms) > 0): self.roomIndex.clear() count = 0 userCount = 0 for i in range(len(rooms)): room = rooms[i] self.roomIndex[room["id"]] = room count = count + 1 userCount = userCount + int(room.get("total", 0)) # self.out("#" + str(i) + "\t" + room["id"] + " " + str(room["total"]) + "/" + str(room["limit"]) + "\t " + room["name"]) self.out("共计房间" + tool.fill(str(count), ' ', 5) + " 用户" + tool.fill(str(userCount), ' ', 5)) # self.out("解析完毕") return rooms # 定时消息发送队列 def doHello(self): while (True): if (self.roomId != ""): self.out("开启消息发送队列 deta=" + str(self.timeDetaMsgSend) + "ms") # self.listMsgQue = [] while (self.roomId != ""): try: detaTime = tool.getNowTime() - self.lastEchoTime if (detaTime > self.timeDetaMsgSend): # 发送时差大于最小发送间隔 if (len(self.listMsgQue) > 0): msg = self.listMsgQue.pop(0) self.doSend(msg) time.sleep(self.timeDetaMsgSend) except Exception as e: self.out("消息发送异常 消息队列:") self.out(self.listMsgQue) self.out(traceback.format_exc()) # self.out("当前房间roomId:" + self.roomId + " 未加入房间 暂时停止sayHello ") time.sleep(3) # 定时发送消息 def sayHello(self): while (True): if (self.roomId != ""): self.out("开启定时发言,最大发言间隔" + str(self.maxDetaTime / 1000) + "s") dt = 0 while (self.roomId != ""): try: # message = "Now Time is "+ time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) detaTime = tool.getNowTime() - self.lastEchoTime # ms if (detaTime > self.maxDetaTime): message = "/me " + time.strftime("%Y%m%d %H:%M:%S") self.send(message) self.out(str(i) + "\t" + message) detaTime = tool.getNowTime() - self.lastMusicTime # ms if (self.ifOnMusic and detaTime > self.maxMusicTime and len(self.getRoomUsers(self.roomId)) > 1): #音乐开启 且 太久没放歌曲 且当前房间有至少两个人(包括自己robot) self.playMusic() if (dt % 300 == 0): self.getRooms() #定时获取房间最新信息 time.sleep(10) dt = dt + 10 dt = dt % 3600 except Exception as e: self.out(traceback.format_exc()) # self.out("当前房间roomId:" + self.roomId + " 未加入房间 暂时停止sayHello ") time.sleep(3) # 定时抓取消息########################## def getHello(self): tt = self.getMsgDetaTime while (True): if (self.roomId != ""): self.out("开启抓取发言," + str(tt) + "s/次") while (self.roomId != ""): try: obj = self.rece() if (obj != ""): self.makeHello(obj) except Exception as e: self.out(traceback.format_exc()) time.sleep(tt) # self.out("当前房间roomId:" + self.roomId + " 未加入房间 暂时停止getHello ") time.sleep(3) # 抓取发言 json Obj def rece(self): # 获取最新时间的消息1530004210 157 s秒 res = "" url = "http://drrr.com/json.php?update=" + str(self.lastMsgTime) # self.out(url) responce = self.http.doGet(url) if (responce != "" and type(responce) != str): jsonStr = responce.read() if (jsonStr != ""): res = tool.makeObj(json.loads(jsonStr)) else: res = "" else: self.out("请求异常:" + str(responce)) return res # 发送消息-添加队列 def send(self, message): if (message != None and message != ""): self.listMsgQue.append(message) return # 发送消息 def doSend(self, message): if (message == ""): return self.out("Send." + message) responce = self.http.doPost( "http://drrr.com/room/?ajax=1", { "message": message, # [0:self.musicPlayType * 4], "url": "", }) # self.out("发送[" + message + "]" + re[0:66]) self.lastEchoTime = tool.getNowTime() return # 用户权限 def getUserAuth(selfself, name=""): res = "" return res # 分享音乐 def playMusic(self, url="", name="", fromName=""): self.musicPlayType = 0 #重置为随机播放 if (url[0:4] != "http"): #无地址url则是定向点播 if (name == ""): #无名字 则自动换 music = self.robot.turnMusic(self.musicPlayType) else: self.send("/me 正在搜索歌曲[" + name + "]" + self.tail) music = self.robot.getMusic(name, fromName) url = music.get("url", "") name = music.get("name", "") fromName = music.get("fromName", "") if (fromName != ""): msg = "" rooms = self.getUserRoom(fromName) if (len(rooms) > 0): room = rooms[0] if (room.get("id", "") == self.roomId): #在当前房间 pass # msg = "/me 一首[" + name + "]送给" + fromName + "" + self.tail else: pass # msg = "/me Share " + room.get("name")[0:4] + "/" + fromName + "'s[" + name + "]" + "" + self.tail else: #不在线 pass # msg = "/me Then play" + fromName + " ordered [" + name + "]" + "" + self.tail self.send(msg) self.out("分享歌曲url=" + url + " name=" + name + " fromName=" + fromName) if (url == ""): # self.send("/me 怼不起,没有找到类似的歌曲,瑟瑟发抖"+self.tail) return responce = self.http.doPost("http://drrr.com/room/?ajax=1", { "music": "music", "name": name, "url": url, }) self.musicNow = {"url": url, "name": name, "fromName": fromName} self.lastMusicTime = tool.getNowTime() return def listMusic(self): self.out(self.robot.listMusic) # 切歌控制 on/off/turn/prev/next/remove def music(self, cmd="on"): self.out("music:" + cmd) if (cmd == "on"): self.ifOnMusic = True self.send("/me 已经打开音乐点播" + self.tail) elif (cmd == "off"): self.ifOnMusic = False self.send("/me 已经关闭音乐点播" + self.tail) elif (cmd == "turn"): self.ifOnMusic = True self.musicPlayType = 0 self.playMusic() elif (cmd == "prev"): self.ifOnMusic = True self.musicPlayType = -1 self.playMusic() elif (cmd == "next"): self.ifOnMusic = True self.musicPlayType = 1 self.playMusic() elif (cmd == "remove"): self.robot.removeMusic(self.musicNow.get("url", "")) self.send("/me 降低音乐" + self.musicNow.get("name") + "播放频率 " + self.tail) return # 手动控制 def inputHello(self): self.out("开启输入监控!") self.help() while (True): try: cmd = raw_input("") if (cmd != ""): if (not self.doMethod(cmd.split(" "))): self.out("手动发送:" + cmd) self.send(cmd) time.sleep(1) except Exception as e: self.out(traceback.format_exc()) return # 抓取到消息的auto回复 def makeHello(self, obj): res = "" try: # tool.line() # self.out("抓取到消息obj") # self.out(obj) newTime = obj.get("update", self.lastMsgTime) newTime = int(newTime) # print(newTime) self.lastMsgTime = newTime talks = obj.get('talks', "") users = obj.get('users', "") if (users != ""): room = self.roomIndex.get(self.roomId, "") if (room != ""): self.roomIndex[self.roomId]['users'] = users else: self.roomIndex[self.roomId] = obj if (talks != ""): onceDocount = 0 for item in talks: # self.out(item) msgTime = item.get("time", tool.getNowTime()) msgId = item.get('id', " ") msgType = item.get('type', 'message') msgData = "" msgFromName = item.get('from', {}).get('name', "") if (msgFromName == ""): msgFromName = item.get('user', {}).get('name', "") if (msgType == 'me'): msgData = item.get('content', "") elif (msgType == 'message'): msgData = item.get('message', "") elif (msgType == 'join'): # msgFromName = item.get('user', {}).get('name', "") msgData = '欢迎' + msgFromName + self.tail elif (msgType == 'leave'): msgData = ' ' + msgFromName + ' 默默的离开了 ' + self.tail elif (msgType == 'music'): music = item.get('music', {}) name = music.get('name', '') url = music.get('url', '') # msgData = '悄悄的的把[' + name + ']给记在小本子上 ' + self.tail ######################################################## 不处理 if (self.roomMsg.get(msgId, "") != ""): #已经处理过 或者是自己发送的 或者取出发送者失败 # self.out("旧消息 " + msgId + " type:" + msgType + " data:" + msgData) break if (msgType == "me" or msgType == "message"): #只记录聊天消息 self.robot.addMsg(msgId, msgFromName, msgData, msgTime) if (msgFromName == self.name or msgFromName == ""): break ############################################################# if (msgType == 'music'): music = { "name": name, "url": url, "fromName": msgFromName } res = self.robot.addMusic(music) #添加用户分享记录 if (res == 1): #更新则不提示 msgData = "" self.musicNow = music self.lastMusicTime = tool.getNowTime() self.roomMsg[msgId] = item #标记未已经处理 历史消息 if (self.status > self.statusMax): self.status = self.statusMax elif (self.status < self.statusMin): self.status = self.statusMin detaTime = tool.getNowTime() - self.lastEchoTime # ms 60s olRan = tool.getRandom( 0, self.maxDetaTime) / 1000 #0-180 过于久没有发过消息了 权重高则可能自回复 weight = (self.maxDetaTime - detaTime) / 1000 #多久没说话了 最大多长时间必须说话 ran = int(1.0 * olRan * (1 + 1.0 * (self.status - 60) / 100)) self.out("新消息 " + msgId + " 发言权" + tool.fill(str(weight) + "", ' ', 6) + " 随机数" + tool.fill(str(olRan) + "->" + str(ran), ' ', 6) + " from:" + tool.fill(msgFromName, ' ', 12) + " type:" + tool.fill(msgType, ' ', 6) + " data:" + msgData) flag = 0 #不回复 if (msgType == 'message' or msgType == 'me'): #普通聊天消息 if (re.search('@' + self.name + " ", msgData) != None): #有@自己 且权重不太低 msgData = re.sub('@' + self.name + " ", "", msgData) #摘除@自己 ran = tool.getRandom(0, 100) if (ran < self.status): flag = 1 else: self.out("@me 随机数=" + str(ran) + " 小于 说话欲望=" + str(self.status) + " ") flag = 2 msg = "生气程度:" + str( 100 - self.status) + "%,不想搭理" + self.tail elif (ran > weight and re.search('@', msgData) == None): # 没有@ 且 权重高 主动搭话概率 flag = 1 else: #事件 flag = 2 res = "" if (self.filterFlag(msgData, msgFromName)): #最高级 权限是否黑名单过滤 if (flag == 1): if (self.robot.getUser(msgFromName).get( "flag", "0") != "0"): self.out("不想搭理" + msgFromName) else: if (self.filterCmd( msgData, msgFromName)): #若过滤器未处理 则继续交由下面处理 robotRes = self.robot.do( msgData, self.name) code = str(robotRes.get("code", "")) if (code[0:1] != '4'): res = '@' + str( msgFromName) + " " + robotRes.get( "text", "") else: self.out("robot接口调用失败 code=" + code) elif (flag == 2): res = msg if (res != "" and flag != 0 and onceDocount < 6): # 最多一次抓取发送3个 res = '/me ' + res onceDocount = onceDocount + 1 self.send(res) except Exception as e: self.out("Exception:" + str(e)) # tool.line() return res # /do help 指令控制行为 def filterCmd(self, msgData="", fromName=""): res = True msgData = msgData.strip() flag = False size = len(msgData) pr = ['放音乐', '播放音乐', '放歌', '开启放歌'] if (not flag): for item in pr: if (msgData == item): msgData = "" self.music("on") flag = True break pr = ['不要放音乐', '停止放歌', '停止音乐', '别放歌', '关闭放歌', '关闭音乐', '别放了'] if (not flag): for item in pr: if (msgData == item): msgData = "" self.music("off") flag = True break pr = ['prev', '上一曲', '上一首', '换回去'] if (not flag): for item in pr: if (msgData == item): msgData = "" self.musicPlayType = -1 flag = True break nnn = [ '下一曲', '下一首', '切歌', '换', '换歌', '不好听', '难听', '难听死了', '换换换', '换一首', 'next', 'turn' ] if (not flag): for item in nnn: if (msgData == item): msgData = "" flag = True break ppp = [ '点歌', 'music', '歌曲', '点播', '下面播放', '想听', '播放', '放', 'play', 'mp3' ] if (not flag): for item in ppp: itemLen = len(item) index = msgData.find(item) if (index == 0): #头命中 msgData = msgData[itemLen:9999].strip() flag = True break elif (index > 0 and index == size - itemLen): # 尾命中 msgData = msgData[0:size - itemLen].strip() flag = True break ooo = [ ('一首', '献给大家'), ('一首', '送给大家'), ('点', '这首歌'), ] if (not flag): for before, after in ooo: index = msgData.find(before) if (index == 0): index1 = msgData.find(after) if (index1 + len(after) == size): flag = True msgData = msgData[len(before):index1].strip() break if (flag): #抽离点歌 名字 self.out('filterCmd.' + str(flag) + "." + msgData) res = False self.playMusic(url="", name=msgData, fromName=fromName) elif (re.search('/do ', msgData) != None): res = False cmd = msgData[4:9999] cmd = cmd.strip() cmds = cmd.split(' ') if (len(cmds) > 0 and cmds[0] == ""): cmds.pop(0) if (not self.doMethod(cmds)): self.send("/me ########## @" + self.name + " /do music <on/off/turn/prev/next> ########") return res # [methodName arg1 arg2] def filterFlag(self, msgData="", fromName=""): res = True msgData = msgData.strip() flag = False size = len(msgData) msg = "" keys = ["别说话", "你别说话", "闭嘴", "shutup"] statusOn = ['笨蛋', '傻逼', 'sb', 'SB', 'Sb', 'sB', '傻b', '傻'] statusOff = [ '开心一点', '开心点', '我错了', '求你了', '后悔', '收回', '我收回', '对不起', '悔恨', '不要生气' ] if (not flag): for item in statusOff: if (msgData == item): self.robot.turnUser(fromName, "0") self.status = self.status + self.statusOnDeta if (self.status >= self.statusMax + self.statusOnDeta): msg = self.name + "现在没有生气(╯▔皿▔)╯" elif (self.status >= self.statusDefault): msg = self.name + "心情好转了 不生气了﹏" else: msg = self.name + "气消了一点点,生气值-" + str( self.statusOnDeta) + self.tail flag = True break if (self.robot.getUser(fromName).get("flag", "0") != "0"): #限制黑名单只接受道歉 res = True self.out("黑名单只接受道歉 不想搭理" + fromName) return res if (not flag): for item in keys: if (msgData == item): self.status = self.status - self.statusDownDeta msg = "好的" + ",生气值陡升" + str( self.statusDownDeta) + ",当前" + str(100 - self.status) + "% " flag = True break if (not flag): for item in statusOn: if (msgData == item): self.robot.turnUser(fromName, "1") self.status = self.status - self.statusOffDeta if (self.status <= self.statusMin - self.statusOffDeta): msg = self.name + "已经气死了 没这号robot 😕" elif (self.status <= self.statusMin): msg = self.name + "已经气炸了 不想再说话了 ε=( o`ω′)ノ " else: msg = self.name + "生气值暴涨" + str( self.statusOffDeta ) + ",不想再搭理" + fromName + "了" + self.tail flag = True break if (flag): #状态控制 self.out('filterFlag.' + str(flag) + "." + msgData) res = False self.send("/me " + msg) return res def doMethod(self, listArgs): size = len(listArgs) res = False if (size > 0): if (hasattr(self, listArgs[0])): method = getattr(self, listArgs[0]) #获取的是个对象 if (callable(method)): if (size == 2): method(listArgs[1]) elif (size == 3): method(listArgs[1], listArgs[2]) elif (size == 4): method(listArgs[1], listArgs[2], listArgs[3]) elif (size == 5): method(listArgs[1], listArgs[2], listArgs[3], listArgs[4]) else: method() res = True else: self.out(method) return res def test(self): self.login() self.getRooms() # self.goRoom("YfdWkQ1lEs") self.goRoomName("上帝") ThreadRun("DoSend." + str(self.count), self.doHello).start() ThreadRun("SayHello." + str(self.count), self.sayHello).start() ThreadRun("GetHello." + str(self.count), self.getHello).start() ThreadRun("InputHello." + str(self.count), self.inputHello).start() tool.wait() return def test2(self): self.login() self.getRooms() self.createRoom() # self.goRoom("YfdWkQ1lEs") # self.goRoomName("上帝") ThreadRun("DoSend." + str(self.count), self.doHello).start() ThreadRun("SayHello." + str(self.count), self.sayHello).start() ThreadRun("GetHello." + str(self.count), self.getHello).start() ThreadRun("InputHello." + str(self.count), self.inputHello).start() tool.wait()
class Auto: def __init__(self, name="Test"): self.name = name self.http = Http() self.db = Database() self.db.execute(''' create table if not exists auto( url text, about text, time text, v1 text, v2 text, v3 text, v4 text, v5 text ) ''') return # 日志输出 def out(self, obj): print( time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." + self.__module__ + self.name + "." + str(obj)) # tools.out(obj) return # 实时控制帮助 def help(self): self.out(dir(self)) return # doMethod([methodName arg1 arg2]) -> methodName(arg1,arg2) def doMethod(self, listArgs): size = len(listArgs) res = None if (size > 0): if (hasattr(self, listArgs[0])): method = getattr(self, listArgs[0]) if (callable(method)): if (size == 2): res = method(listArgs[1]) elif (size == 3): res = method(listArgs[1], listArgs[2]) elif (size == 4): res = method(listArgs[1], listArgs[2], listArgs[3]) elif (size == 5): res = method(listArgs[1], listArgs[2], listArgs[3], listArgs[4]) else: res = method() else: self.out(method) return res # 手动命令监控 def inputHello(self): self.out("开启输入监控!") self.help() while (True): try: cmd = raw_input("") if (cmd != ""): if (not self.doMethod(cmd.split(" "))): self.doCmd(cmd) time.sleep(1) except Exception as e: self.out(repr(e)) return # 测试用 def test(self): self.login() # 输入监控线程 ThreadRun("InputHello." + str(self.name), self.inputHello).start() tool.wait() return # 非函数调用 属性变量查看 其他的指令控制 def doCmd(self, cmd): self.out("其他指令." + str(cmd)) return # 认证登录 def login(self): self.out("访问主页 获取 token session") responce = self.http.doGet('http://drrr.com/') re = responce.read() soup = BeautifulSoup.BeautifulSoup(re) nameList = soup.findAll('input', {'name': {'token'}}) if (len(nameList) > 0): token = nameList[0]['data-value'] token = tool.encode(token) self.out("抓取成功: ") self.out("token\t " + token) self.out("cookie\t " + tool.toString(self.http.getCookie())) self.out("模拟登录") responce = self.http.doPost( 'http://drrr.com/', { "name": name, "login": "******", "token": token, "direct-join": "", "language": "zh-CN", "icon": icon, }) if (responce != "error"): return True else: return False else: self.out("error! 没能抓取到token") return False
# coding:utf-8 from http import Http from chrome import Chrome key = Http.get_key_new() print key if key == '': print "验证码错误" else: print key chrome = Chrome(key) chrome.open_web_up() input("wait....")
class AutoCochat: def __init__(self, name="Test", id="18408249138", pwd="1234qwer"): reload(sys) sys.setdefaultencoding('utf8') #针对socket发送中文异常 self.detaTime = 3600 * 1000 #推送延时 60min self.detaTimeMin = 1200 * 1000 #推送延时 20min self.id = id self.pwd = pwd self.name = name self.robot = Robot() self.http = Http() self.db = Database('sqlite_' + self.id + '.db') self.socket = Socket() self.onConnect = False self.ifOk = False # sendTime添加时间, type消息类型, msg发送消息体, deta间隔发送时间, preTime预期发送时间节点 self.db.execute( ''' create table if not exists cochat( id text, sendTime text, sendTimeT text, deta text, preTime text, preTimeT text, type text, msg text, flag text ) ''' ) self.sendList = [] #发送队列 (time, deta, type, data) return # 日志输出 def out(self, obj): print(time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." + self.name + "." + str(obj)) return # 实时控制帮助 def help(self): self.out(dir(self)) return # doMethod([methodName arg1 arg2]) -> methodName(arg1,arg2) def doMethod(self, listArgs): size = len(listArgs) res = None if(size > 0): if(hasattr(self, listArgs[0])): method = getattr(self, listArgs[0]) if(callable(method)): if(size == 2): res = method(listArgs[1]) elif(size == 3): res = method(listArgs[1], listArgs[2]) elif(size == 4): res = method(listArgs[1], listArgs[2], listArgs[3]) elif(size == 5): res = method(listArgs[1], listArgs[2], listArgs[3], listArgs[4]) else: res = method() else: self.out(method) return res # 手动命令监控 def inputHello(self): self.out("开启输入监控!") self.help() while(True): try: cmd=raw_input("") if(cmd != ""): if(not self.doMethod(cmd.split(" "))): # self.out("exm???") # self.out(cmd) pass time.sleep(1) except Exception as e: self.out(traceback.format_exc()) return def send(self, ttt, data, deta=-1): if(deta == -1): deta = tools.getRandom(self.detaTime, self.detaTimeMin) sendTime = tool.getNowTime() preTime = sendTime + deta sendTimeT = tool.parseTime(sendTime/1000, "%D %H:%M:%S") preTimeT = tool.parseTime(preTime/1000, "%D %H:%M:%S") # self.sendList1.append((sendTime, deta, preTime, type, data)) # sendTime添加时间, type消息类型, msg发送消息体, deta间隔发送时间, preTime预期发送时间节点 self.db.execute("insert into cochat values(?,?,?,?,?,?,?,?,?)", str(self.id), str(sendTime),str(sendTimeT), str(deta), str(preTime),str(preTimeT), str(ttt), str(data),'0') return # 定时任务 def timeSend(self): self.out("开启定时任务 发送队列!") self.nowNight = 0 while(True): time.sleep(5) #每分钟扫描 只对非凌晨时间处理 延时一小时发送 timeNow = tool.getNowTime() hour = tool.parseTime(timeNow/1000, "%H:%M") if(hour >= "23:30" or hour <= "07:20" or self.ifOk == False): if(self.nowNight != 1): self.out("不是白天 或者 没有登录 now:" + str(hour) ) self.nowNight = 1 continue self.nowNight = 0 try: # self.sendList1.append((sendTime, deta, preTime, type, data)) self.sendList = self.db.executeQuery("select * from cochat where preTime<=? and flag=0 and id=?", timeNow, str(self.id) ) i = len(self.sendList) - 1 while(i >= 0): obj = self.sendList[i] sendTime = int(obj.get("sendTime", 0)) deta = int(obj.get("deta", 0)) preTime = int(obj.get("preTime", 0)) type = str(obj.get("type", "")) data = ast.literal_eval((str(obj.get("msg", "")))) info = "" hour = tool.parseTime(preTime/1000, "%D %H:%M:%S") info = str(timeNow) + "->" + str(preTime) + " 推送时刻:" + str(hour) if(timeNow >= preTime): info += " 触发" self.sendTrue(type, data) # self.sendList.pop(i) else: info += " " self.out(tool.parseTime(timeNow/1000, "%D %H:%M:%S") + "." + str(type) + "." + str(data) + "." + info) i = i - 1 self.db.execute("update cochat set flag='1' where preTime<=? and flag=0 and id=? ", timeNow, str(self.id)) except Exception as e: self.out(traceback.format_exc()) return # 定时任务 def timeHello(self): self.out("开启定时任务!") self.help() while(True): time.sleep(3600 * 3) try: self.out("定时重新连接") self.login() except Exception as e: self.out(repr(e)) return # 测试用 def test(self): self.login() ThreadRun( "TimeHello." + str(self.name), self.timeHello ).start() # ThreadRun( "TimeCtrl." + str(self.name), self.inputHello ).start() ThreadRun( "TimeSend." + str(self.name), self.timeSend ).start() self.socket.waitRead(self.onException) #异常回调 tool.wait() return # 监控执行 def doCmd(self, cmd): self.send({"data":cmd}) return def login(self): i = 0 while(self.ifOk == False or i <= 0): try: self.whileLogin() i = i + 1 except Exception as e: self.out(traceback.format_exc()) self.out("登录异常,5s后重试 try:" + str(i)) time.sleep(5) return # 认证登录 def whileLogin(self): self.ifOk = False if(self.onConnect): self.out("已经在尝试登录") return self.socket.close() self.onConnect = True self.out("尝试登录:") # {CONF_V ARS: "*", ORG_VARS: true, logintype: "mobile", id: "18408249138", password: "******"} # Request URL:http://picc.cochat.cn/SY_ORG_LOGIN.login.do?DESKTOP_OS=Win10&USER_LAST_BROWSER=Win32&USER_LAST_CLIENT=2.5.1&USER_LAST_OS=DESKTOP&USER_LAST_PCNAME=%7B%7D # request Cookie:JSESSIONID=abcb0skaQYCGs6lvy9orw obj = self.http.doJson("http://picc.cochat.cn/SY_ORG_LOGIN.login.do?DESKTOP_OS=Win10&USER_LAST_BROWSER=Win32&USER_LAST_CLIENT=2.5.1&USER_LAST_OS=DESKTOP&USER_LAST_PCNAME=%7B%7D",{ "CONF_VARS":"*", "ORG_VARS":"true", "logintype":"mobile", "id":self.id, "password":self.pwd }) if(obj.get("error","") != ""): self.onConnect = False return self.loginUser = obj token = obj.get("USER_TOKEN", "") self.out("登录结果 token:" + token) urlWithPort = obj.get("CONF_VARS", {}).get("@C_SY_COMM_SOCKET_SERV_V1.0@", "http://cochat.cn:9091") uus = urlWithPort.split(':') port = int(uus[2]) url = uus[1][2:999] #cochat.cn 不需要ws http 只需要ip 域名 self.socketServerUrl = urlWithPort self.socketUrl = url self.socketPort = port self.showUser() self.config = { "transports":['websocket', 'polling'], # websocket优先 "timeout":5 * 1000, # 超时时间 "forceNew": True, "reconnection" : False }; self.out("socket开始") self.socket.connect(url,port) # , params=self.config) self.out("socket连接完成,开始初始化事件") socketMsgTypes = ("connect", "disconnect","error","connect_error","connect_timeout","connecting","reconnecting","message", "event") # socketMsgTypes = ("connect", "disconnect","message", "event") for item in socketMsgTypes: if(hasattr(self, item)): method = getattr(self, item) if(callable(method)): self.socket.on(item, method) else: self.out("变量而非方法" + item + "回调?") else: self.out("属性" + item + "不存在,是否写错了名字?") # self.socket.on("message", self.message) self.out("socket初始化事件完成,开始发送认证") self.data = { "userName":obj.get("USER_CODE", ""), "displayName": tool.encode(obj.get("ORG_VARS", {}).get("@USER_NAME@", "") ), #"ccc",# "odept":obj.get("ORG_VARS", {}).get("@ODEPT_CODE@", ""), "token":obj.get("USER_TOKEN", ""), "uuid":"" + str(uuid.uuid1()), "version":obj.get("USER_CODE", "") + "_LAST_MSG" } self.out(self.data) self.socket.emit('loginv17', self.data, self.onSocketLogin) self.out("已发送认证信息") self.ifOk = True self.onConnect = False return def connect(self, *args): print("connect") print(args) # self.login() return def disconnect(self, *args): print("disconnect") print(args) self.login() return def error(self, *args): print("error") print(args) self.login() return def connect_error(self, *args): print("connect_error") print(args) return def connect_timeout(self, *args): print("connect_timeout") print(args) return def connecting(self, *args): print("connecting") print(args) return def reconnect(self, *args): print("reconnect") print(args) return def reconnecting(self, *args): print("reconnecting") print(args) return def onException(self, *args): tool.line() self.out("onexception") print(args) def turnArray(self, args): if(len(args) == 1): args = args[0] reg = re.match(r'^\d+', args) #25[xxxx] -> [xxxxx] if(reg is not None): start = reg.group() args = args[len(start):999999] # reg = re.match(r'^\["\w+",', args) #["message", {"to":{"id":" -> {"to":xxxx # if(reg is not None): # start = reg.group() # args = args[len(start):999999] # mtype = start[2:-2] res = tool.toJson(args) else: res = list(args) if(len(res) <= 1): res = ( 'null', res[0]) elif(callable(res[1])): res = ( 'fun', res[0]) return res def message(self, *args): # 普通消息 try: # print("收到message ") # print(args) # tool.line() # print("转换") args = self.turnArray(args) # print(args[0]) # print(args[1]) if(len(args) <= 1): return data = args[1] #{} mtype = args[0] #message null fun if(mtype == 'message'): data = tool.toJson(data) fro = data.get("from", {}) to = data.get("to", {}) contact = data.get("contact", {}) msg = data.get("body") fullId = contact.get("fullId") sessionName = contact.get("nickName", "") uid = self.data.get("uuid") tTag = data.get("timeMillis", tool.getNowTime()) tool.line() self.out("Msg:" + fro.get("nickName","from") + ">>" + msg + ">>" + to.get("nickName","to") + " time:" + data.get("time")) # self.out(msg); # 自发消息不需要处理 if(fro.get("nickName","from").find(self.loginUser.get("ORG_VARS", {}).get("@USER_NAME@", "")) >= 0): return ttt = self.detaTime reg = re.match(r'^\d+$', str(msg)) if(reg is not None): ttt = int(msg) * 1000 self.send("updateConversationStatus", { 'contactFullId': fullId, 'clientId': uid, 'timeTag': tTag }, ttt) self.send("updateMsgStatus", { "messages":data.get("id","") }, ttt) # 自发言 且 只有自己auto回复 if(self.id != "18408249138"): return # 过滤 ff = sessionName.find("陈鹏辉") hh = fro.get("nickName","from").find("许欢") zz = fro.get("nickName","from").find("赵振国") cdf = fro.get("nickName","from").find("迪") d1 = sessionName.find("迪") d2 = sessionName.find("祝") d3 = sessionName.find("纯") if(ff < 0 or d1 >= 0 or d2 >= 0 or d3 >= 0): self.out("未命中自己title 命中特殊 不回复") return point = 76 if(hh >= 0 or zz >= 0): point = 33 self.sendTrue("updateMsgStatus", { "messages":data.get("id","") }) if(tool.getRandom(0,100) < point): self.out("概率不自动回复" + str(point)) return # data["body"] = str(data["body"]) + "." # self.send("message", data) obj = {} # if(contact.get("type") == "GROUP"): # unicode(self.robot.do(msg, fro.get("nickName"))) msg = self.robot.do(msg, fro.get("nickName")) msg = msg.get("text", ''); if(msg == ''): return obj["body"] = msg #"666" + str(tool.getNowTime()) obj["bodyType"] = "text" obj["clientId"] = str(uuid.uuid1()) obj["retry"] = 1 obj["from"] = {} obj["from"]["fullId"] = "u__" + self.data.get("userName") obj["from"]["id"] = self.data.get("userName") obj["from"]["nickName"] = "fromnickname" obj["to"] = {} if(contact.get("type") == "GROUP"): obj["to"]["fullId"] = contact.get("fullId") else: obj["to"]["fullId"] = fro.get("fullId") obj["to"]["nickName"] = "tonickname" obj["from"]["nickName"] = self.loginUser["ORG_VARS"]["@USER_NAME@"] # "from-nickName" obj["to"]["nickName"] = "to-nickName" self.sendTrue("message", obj) elif(str(mtype) == 'fun'): pass elif(str(mtype) == 'event'): pass else: self.out("其他:" + str(mtype)) print(data) # print(args) # tool.line() except Exception as e: self.out(traceback.format_exc()) return def event(self, *args): # 事件消息 群创建? print("event") print(args) return def onSocketLogin(self, *data): self.out("socket登录回调:") print(data) return def sendTrue(self, type, data): self.socket.send(type, data) return def showUser(self): tool.line() obj = self.loginUser user = obj.get("ORG_VARS", {}) self.out(user.get("@USER_NAME@", "")) self.out(user.get("@USER_POST@", "")) self.out(user.get("@LOGIN_NAME@", "")) self.out("USER_CODE:" + obj.get("USER_CODE", "")) self.out("USER_TOKEN:" + user.get("UESR_TOKEN", "")) self.out("socketServerUrl:" + self.socketServerUrl) self.out("to url:" + self.socketUrl) self.out("to port:" + str(self.socketPort)) tool.line() return
def get_ip(self): response = Http.get("http://ip.6655.com/ip.aspx") return response.text
def __init__(self,option={}): self.__http=Http(option) self.__tools=Tools()
class Server: __http=() __requestHeader={} __tools=() def __init__(self,option={}): self.__http=Http(option) self.__tools=Tools() def run(self): while True: self.__http.request() self.dealRequest() res=self.dealResponse() self.__http.response(option=res['option'],content=res['content']) self.__http.close() def dealRequest(self): self.__requestHeader={} buf=self.__http.getBuf().splitlines() new_buf = [b.split(':',1) for b in buf] # print buf if len(new_buf)<=0: self.__requestHeader['resources']='404' return False header=new_buf[0][0].split(' ') new_buf.pop(0) self.__requestHeader['method']=header[0] self.__requestHeader['resources']=header[1].split('?')[0] if '?' in header[1]: self.__requestHeader['param']=header[1].split('?')[1] self.__requestHeader['protocol']=header[2] for b in new_buf: if b[0].strip(' ') != '': self.__requestHeader[b[0].strip(' ').replace('-','_').lower()]=b[1].strip(' ') # print self.__requestHeader return new_buf def dealResponse(self): root='E:/users/huajie/documents/python/http/lightSnake/htdocs' defaultFile='index.html' path=root+self.__requestHeader['resources'] if self.__requestHeader['resources'].strip('/')=='': path=path.strip('/')+'/'+defaultFile # print path defaultOption= copy.deepcopy(self.__http.getResponseOption()) data={'option':defaultOption,'content':' '} print data # <h1>Hello World</h1> # (fileExtension,name)=mimetypes.guess_extension(path) (responseType,name)=mimetypes.guess_type(path) print os.path.exists(path) if os.path.exists(path): if 'text/' in responseType: file = open(path) else: file = open(path,'rb') try: fileText = file.read() data['content']= fileText data['option']['responseType']=responseType data['charset']='' # file.close() except IOError: print IOError.message finally: file.close() print "if" else: print "else" data['option']['status']='404 Not Found' return data def getFileType(self,fileName): return os.path.splitext(fileName)
class AutoSophia: def __init__(self, name="0000000",flowName="", count = 0, makeRooms=[]): self.robot = Robot() self.http = Http() self.name = name self.flowName = flowName self.count = count #编号 self.listMsgQue = [] #消息发送队列 self.timeDetaMsgSend = 1.5 #最小发送消息间隔s self.makeRooms = makeRooms self.userIndex = {} # 用户name -> 用户id self.userIndexRe = {} #id -> name self.roomIndex = {} #房间号 及其<用户>信息 self.roomMsg = {} #消息 记录 self.roomId = "" #当前房号 self.ifWelcom = False #是否迎客 self.ifTime = False #是否存货确认 self.admins = {} self.tripcodeIndex = {} #上次房间记录 的 用户名 绑定的 tc code self.linkStart = 0 #链接状态 self.init() self.tail = " の... " def init(self): ############### 心情模块 self.statusMin = 5 self.statusMax = 95 self.statusDefault = 80 self.status = 10 #说话欲望值 0-100 self.statusOnDeta = 15 #开心 self.statusOffDeta = 15 #难过 self.statusDownDeta = 40 #闭嘴 self.lastOtherSay = tool.getNowTime() #上次其他人说话时间 self.getMsgDetaTime = 1 #抓取消息间隔 self.lastMsgTime = int(time.time() * 10000 ) * 1.0 / 10000 #上一次更新房间聊天记录时间 self.lastEchoTime = tool.getNowTime() #上次说话时间 self.lastEchoTimeQuene = tool.getNowTime() self.maxDetaOtherSay = 1000 * 60 * 15 #最大没人说话时间 换房 self.maxDetaTime = 1000 * 60 * 5 # 最大沉默时间 self.lastMusicTime = tool.getNowTime() #上次放歌时间 self.maxMusicTime = 1000 * 60 * 4 #音乐间隔 暂不解析音乐文件时长控制 self.maxMusicTimeDefault = 1000 * 60 * 4 #默认时间 self.musicNow = {} self.nextNames = [] #下一首序列 self.musicPlayType = -1 self.ifOnMusic = False self.notWait = True self.adminRes = "" self.adminDeta = 2 self.adminDetaDefault = 2 self.toIdNow = "" #当前处理消息 self.toNameNow = "" #当前处理消息 self.fromIdNow = "" #当前处理消息 self.fromNameNow = "" #当前处理消息 def out(self, obj): print(time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." + self.name + "." + str(obj)) return def login(self): # tool.line() self.out("访问主页 获取 token session") responce = self.http.doGet('http://drrr.com/') re = responce.read() soup =BeautifulSoup.BeautifulSoup(re) # self.out soup.prettify() nameList = soup.findAll('input',{'name':{'token'}}) if(len(nameList) > 0): token = nameList[0]['data-value'] token = tool.encode(token) self.out("抓取成功: ") self.out("token\t " + token) self.out("cookie\t " + tool.toString(self.http.getCookie())) # tool.line() self.out("模拟登录") responce=self.http.doPost('http://drrr.com/', { "name":self.name, "login":"******", "token":token, "direct-join":"", "language":"zh-CN", "icon":"tanaka", }) else: self.out("error! 没能抓取到token") def showHelp(self): self.send("@" + self.name + " \n 0.help \n 0.play/next name \n 0.play music/stop music \n 1.del/rm xxx \n 2.host \n <0.admin> ") self.help() def nobody(self): self.showHelp() def showAdmin(self): res = "#Admins:" items = sorted(self.admins.items(), cmp=lambda x,y: cmp(y[1], x[1]) ) i = 0 for key,value in items: # id value res = res + "\na" + str(i) + " " + str(self.userIndexRe.get(key)) + " " + str(value) i = i+1 self.send("" + res) def addAdmin(self, fromId, value=0): if(self.admins.get(fromId, 0) > 2**31): self.send(self.name + "被玩坏了orz" + self.tail) self.admins = {} return if(value>0): self.adminDeta = value self.admins[fromId] = int(self.admins.get(fromId,0)) + int(self.adminDeta) #认证加权 if(self.admins[fromId] <= 0): self.admins.pop(fromId) self.adminRes = "" self.adminDeta = self.adminDetaDefault # self.showAdmin() def getAdmin(self, name=""): level = self.admins.get(self.userIndex.get(name, ""), 0) # self.adminRes = 0 # self.adminDeta = 2 # self.adminDetaDefault = 2 # <2 <4 <8 <16 <32 #i:1 2 3 4 5 # +2 +4 +8 +16 +32 i = 1 weight = 1 while(True): weight = weight * self.adminDetaDefault # *= 2 if(level < weight): break i = i + 1 # level=0-2 -> i=1 weight=2 res = "" ranres = "" for j in range(i): ran = tool.getRandom(1000, 9999) # 2843 = 287 = 35 = 8 ans = ran while(ans >= 10): ans = ans % 10 + ans / 10 res = res + str(ans) ranres = ranres + str(ran) + " " self.adminRes = res self.adminDeta = weight # self.showAdmin() self.send("#Admin认证 lv." + str(i) + "\nF(" + str(ranres) + ") = ? " ) #管理员权限认证 10次 def ifAdminName(self, name="", lev=0, ifRedu=True): return self.ifAdmin(self.userIndex.get(name, ""), lev, ifRedu) def ifAdmin(self, id="", lev=0, ifRedu=True): if(self.admins.get(id, 0) > 2**lev-1): if(ifRedu): self.admins[id] = self.admins[id] * 2 / 3 # 每次认证消减1/3生命值 if(self.admins[id] <= 0): self.admins.pop(id) return True return False def host(self, name=""): # new_host:5a1da324d5e68e6712725a50046f4b75 name = str(name) if(name == ""): return self.getRooms() # 刷新最新房间信息 if(not self.ifHost): self.send("不是房主,没有权限") return userId = self.userIndex.get(name, "") if(self.ifAdmin(userId) ): if(self.getRoomUser(name).get("name","") != ""): self.send("转移房主权限给[" + name + "] ") responce=self.http.doPost('http://drrr.com/room/?ajax=1', { "new_host":userId }) else: self.send("用户[" + name + "]不在当前房间") else: self.send("用户[" + name + "]未认证admin权限") self.getAdmin(name) def rm(self, name="", pwd=""): name = str(name) if(name == ""): return self.getRooms() # 刷新最新房间信息 if(not self.ifHost): self.send("不是房主,没有权限") return userId = self.userIndex.get(name,"") if(self.ifAdmin(userId) ): self.send("禁止踢出admin") else: if(self.getRoomUser(name).get("name","") != ""): self.send("踢出[" + name + "]" ) # id:" + str(self.userIndex.get(name, "")) + " tripcode:" + str(item.get("tripcode", "")) + " device:" + str(item.get("device", "")) responce=self.http.doPost('http://drrr.com/room/?ajax=1', { "kick":userId }) else: self.send("用户[" + name + "]不在当前房间") return def help(self): self.out(dir(self)) def showUser(self, user, show=True): userInfo ="U " + user.get("device", "")[0:4] + " " + user.get("icon", "")[0:4] + " " + user.get("name", "")[0:6] + " " + user.get("id", "")[0:4] + " "+ user.get("tripcode", "")[0:4] if(show): self.out(userInfo) return userInfo def showRoom(self, roomId="", show=True, i=0): if(roomId == ""): roomId = self.roomId room = self.roomIndex.get(roomId, "") if(room == ""): self.getRooms() room = self.roomIndex.get(roomId, "") info = "" if(room != ""): info = ("##" + tool.fill(str(i), '#', 10) + "\n--G " + tool.fill(room["id"], ' ', 10) + " " + tool.fill(str(room["total"]) + "/" + str(room["limit"]), ' ', 7) + " " + room["name"][0:10]) + "\n" info = info + "music: " + str(room.get("music", False)) + " language:" + room.get("language","")+" game:"+ str(room.get("gameRoom", "")) +" adult:"+ str(room.get("adultRoom", ""))+"\n" # " 静态房间: " + str(room.get("staticRoom", "")) + "" # info = info + " hiddenRoom: " + str(room.get("staticRoom", "")) + " 游戏房间: " + str(room.get("gameRoom", "")) + " 成人房间: " + str(room.get("adultRoom", "")) + "\n" info = info + "Host:" + room.get("host", {}).get("name", "") + "\n" info = info + "Users: " + "\n" for item in room.get("users", []): # print(item) info = info + "--" + self.showUser(item, False) + "\n" if(show): self.out(info) return info def showRoomList(self, roomId=""): if(roomId == ""): rooms = self.roomIndex.values() rooms = sorted(rooms, cmp=lambda y,x: cmp(x.get("total",0), y.get("total", 0))) i = 0 res = "#Rooms list:" for room in rooms: i = i + 1 #+ "" + room["id"] res = res + "\n" + tool.fill(str(i)," ",2) + "." + tool.fill(str(room["total"]) + "/" + str(room["limit"]), ' ', 4) + " " + room["name"][0:6] + " " + room["id"] else: room = self.roomIndex.get(roomId, "") if(room != ""): res = "" #Rooms info: res = res + "-G." + tool.fill(str(room["total"]) + "/" + str(room["limit"]), ' ', 4) + " " + room["name"][0:6] + " " + room["id"] res = res + "\n-Music: " + str(room.get("Music", False)) + " " + room.get("language","") # +" game:"+ str(room.get("gameRoom", "")) +" adult:"+ str(room.get("adultRoom", "")) # " 静态房间: " + str(room.get("staticRoom", "")) + "" # info = info + " hiddenRoom: " + str(room.get("staticRoom", "")) + " 游戏房间: " + str(room.get("gameRoom", "")) + " 成人房间: " + str(room.get("adultRoom", "")) + "\n" res = res + "\n-Host:" + room.get("host", {}).get("name", "") # res = res + "\n Users: " + "\n" i = 0 for item in room.get("users", []): res = res + "\n -" + self.showUser(item, False) # item.get("name", "")[0:6] i = i + 1 self.send(res) def showAllRoom(self): if(self.roomIndex is None or self.roomIndex == "" or self.roomIndex == {}): self.getRooms() tool.line() self.out("展示所有房间信息") i = 0 for key in self.roomIndex: # room = self.roomIndex[key] self.showRoom(key, True, i) i = i+1 tool.line() # 获取当前房间人员列表 def getRoomUsers(self, roomId=""): if(roomId == ""): roomId = self.roomId room = self.roomIndex.get(roomId, {}) users = room.get("users", []) return users # 按照名字获取当前房间用户 def getRoomUser(self, name=""): users = self.getRoomUsers() for user in users: if(user.get("name", "") == name): return user return {} # 获取用户所在房间 def getUserRoom(self, userName="******", userId="8f1b61e25098b0427f01d724716b70cb"): i=0 res = [] for key in self.roomIndex: room = self.roomIndex[key] users = room.get("users", []) for user in users: if(user.get("name", "") == userName): # self.showRoom(key, True, i) res.append(room) if(user.get("id", "") == userId): self.showRoom(key, True, i) i = i+1 if(len(res) <= 0): self.out("用户不在线"+userName) if(len(res) >= 2): self.out("该用户多次出现?????") for item in res: self.out(item) tool.line() return res def goRoomName(self, roomName): if(self.roomIndex is None or self.roomIndex == "" or self.roomIndex == {}): self.getRooms() tool.line() self.out("查找房间名字加入" + roomName) i = 0 for key in self.roomIndex: room = self.roomIndex[key] name = room.get("name", "") if(re.search(roomName, name) != None): self.goRoom(key) break i = i+1 tool.line() def goRoom(self, roomId): if(self.roomId == roomId): self.out("已经处于当前房间") return if(self.roomId != ""): self.outRoom() time.sleep(10) # tool.line() self.out("加入房间:" + roomId) # self.showRoom(roomId) responce=self.http.doGet("http://drrr.com/room/?id=" + roomId) if(responce != "error"): self.roomId = roomId self.init() # self.send("大家好 我是暖手宝" + self.name + " 可以@ [点歌/turn/prev](*^_^*) @不一定会回 不@也不一定不会回(∩_∩) ") self.initRoom() return def initRoom(self, roomId=""): if(roomId == ""): roomId = self.roomId room = self.roomIndex.get(roomId, "") if(room != ""): for item in room.get("users", []): # print(item) id = item.get("id", "") if(id != ""): self.userIndex[item.get("name", "")] = item.get("id", "") self.userIndexRe[item.get("id")] = item.get("name", "") self.tripcodeIndex[item.get("name", "")] = item.get("tripcode", "") # self.out(str(self.tripcodeIndex)) def outRoom(self): self.out("离开房间:" + self.roomId) # self.send("" + self.name + "好无聊啊 "+self.name +"要出去溜达一会儿" + self.tail) # self.send(""+self.name+"一定会回来的" + self.tail) # self.send("出去一下,马上回来" + self.tail) self.showRoom(self.roomId) time.sleep(self.timeDetaMsgSend * len(self.listMsgQue) + 1) #等待一会儿消息发送 responce=self.http.doPost("http://drrr.com/room/?ajax=1", { "leave":"leave", }) if(responce == "error"): return False self.roomId = "" time.sleep(1) return True def createRoom(self, room=""): # tool.line() self.out("创建房间") if(room == ""): room = {} room["name"] = self.name + "'s room" responce=self.http.doPost("http://drrr.com/create_room/?", { "name":room.get("name",""), "description":room.get("description",""), "limit":room.get("limit",10), "music":room.get("music",True), "submit":room.get("music","创建房间"), }) if(responce == "error"): return False self.roomId = "" time.sleep(1) def getRooms(self, detail=False): tool.line() self.out("获取房间列表") responce=self.http.doGet("http://drrr.com/lounge?api=json") jsonObj = tool.makeObj(json.loads(responce.read())) rooms = jsonObj["rooms"] makeRooms = [] if(len(rooms) > 0): self.roomIndex.clear() i = 0 count = 0 userCount = 0 for room in rooms: id = room.get("id","") if(room.get("language","") == "zh-CN"): # root.showRoom(id, show=True, i=i) makeRooms.append(room) self.roomIndex[room["id"]] = room count = count + 1 userCount = userCount + int(room.get("total", 0)) self.out("#" + tool.fill(str(i),' ',4) + "" + room["id"] + " " + str(room["total"]) + "/" + str(room["limit"]) + "\t " + room["name"]) # for item in room.get("users", []): # if(item.get("id", "") != ""): # self.userIndex[item.get("name", "")] = item.get("id", "") # self.userIndexRe[item.get("id")] = item.get("name", "") i = i + 1 self.out("共计房间" + tool.fill(str(count), ' ', 5) + " 用户" + tool.fill(str(userCount), ' ', 5) ) self.out("解析完毕") roomId = self.roomId room = self.roomIndex.get(roomId, {}) if(room.get("host", {}).get("name", "") == self.name): self.ifHost = True else: self.ifHost = False self.initRoom() return makeRooms # 太久没人发言 时 退出 并 进入一个新的 活跃的房间 def goARoom(self): # self.out("#" + str(i) + "\t" + room["id"] + " " + str(room["total"]) + "/" + str(room["limit"]) + "\t " + room["name"]) lastRoomId = self.roomId nowRoom = self.roomIndex.get(self.roomId, {}) if(nowRoom.get("total", 0) > 1): #当前房间人数 还有其他人 # self.send(self.name + "也无法忍受这样的寂静了 债见了各位" + self.tail) pass if(self.roomId != ""): self.outRoom() self.getRooms() self.out("选择最活跃房间") i = 0 maxNum = 0 maxKey = "" for key in self.roomIndex: exist = True room = self.roomIndex[key] total = room.get("total", 0) limit = room.get("limit", 0) music = room.get("music", False) for item in room.get("users", []): if(item.get("name", "") == self.name): tool.line() self.out("异常! 该房间存在同名用户 无法加入 ") self.showRoom(room.get("id", "")) exist = False break if(item.get("name", "") == self.flowName): #跟随 self.out("跟随触发 增大权重选中") maxNum = 99 + int(total) maxKey = key i = i+1 if(maxKey != ""): self.out("选中房间:") self.showRoom(maxKey) tool.line() self.goRoom(maxKey) else: tool.line() self.out("异常!!!!!!!!! 居然无可用房间?") time.sleep(2) return # 定时消息发送队列 def doHello(self): while(True): if(self.roomId != ""): self.out("开启消息发送队列 deta=" + str(self.timeDetaMsgSend) + "ms") # self.listMsgQue = [] while(self.roomId != ""): try: detaTime = tool.getNowTime() - self.lastEchoTime if(detaTime > self.timeDetaMsgSend): # 发送时差大于最小发送间隔 if(len(self.listMsgQue) > 0): msg = self.listMsgQue.pop(0) if(type(msg) == tuple): self.doSendId(msg[0], msg[1]) else: self.doSend(msg) time.sleep(self.timeDetaMsgSend) except Exception as e: self.out("消息发送异常 消息队列:") self.out(self.listMsgQue) self.out(traceback.format_exc()) # self.out("当前房间roomId:" + self.roomId + " 未加入房间 暂时停止sayHello ") time.sleep(3) # 定时操作 def sayHello(self): while(True): if(self.roomId != ""): self.out("开启定时发言,最大发言间隔" + str(self.maxDetaTime / 1000) + "s") sleepTime = 3 dt = 0 theI = 0 self.lastEchoTimeQuene = tool.getNowTime() while(self.roomId != ""): try: # message = "Now Time is "+ time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) detaTime = tool.getNowTime() - self.lastEchoTime # ms if(detaTime > self.maxDetaTime): # message = "存活确认." + str(theI) + "." + ttt = time.strftime("%H時%M分%S秒") message = "現在時間是" + ttt + ",每隔5分鐘免費派送一座冰山:△,一間冰窟酒吧:♜,一棟冰窟豪宅:▌,一缸冰:,一缸涼水:,附加贈送一個月的南極大陸度假旅遊服務(可免費觀看地下冰花:✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋。)。" self.doSendId(message) self.out(str(theI) + "\t" + message) theI = theI + 1 self.lastEchoTime = tool.getNowTime() detaTime = tool.getNowTime() - self.lastOtherSay # ms if(detaTime > self.maxDetaOtherSay): #不不停留True self.goARoom() #10分钟没处理过消息 互动 则换房间 if(detaTime > self.maxDetaOtherSay * 2): #若一小时没信息 则 是否掉线? self.shutdown() #等待系统重启 if(dt % 600 == 0): self.getRooms() #定时5分钟获取房间最新信息 if(dt % 120 == 0): roomsAdmin = self.getUserRoom(self.flowName); if(len(roomsAdmin) > 0): self.out("跟随 触发") self.goRoom(roomsAdmin[tool.getRandom(0, len(roomsAdmin))].get("id", "")) time.sleep(sleepTime) dt = dt + sleepTime dt = dt % 3600 except Exception as e: self.out(traceback.format_exc()) # self.out("当前房间roomId:" + self.roomId + " 未加入房间 暂时停止sayHello ") time.sleep(10) if(self.roomId == ""): #无房间则自动加入 self.goARoom() # 定时抓取消息########################## def getHello(self): tt = self.getMsgDetaTime while(True): if(self.roomId != ""): self.out("开启抓取发言," + str(tt) + "s/次") while(self.roomId != ""): try: obj = self.rece() if(obj != ""): self.makeHello(obj) except Exception as e: self.out(traceback.format_exc()) time.sleep(tt) # self.out("当前房间roomId:" + self.roomId + " 未加入房间 暂时停止getHello ") time.sleep(3) # 抓取发言 json Obj def rece(self): # 获取最新时间的消息1530004210 157 s秒 res = "" url = "" if(self.linkStart == 0): #正常 url = "http://drrr.com/json.php?update="+str(self.lastMsgTime) else: url = "http://drrr.com/json.php?fast=1&update="+str(self.lastMsgTime) url = "http://drrr.com/json.php?update="+str(self.lastMsgTime) # self.out(url) responce=self.http.doGet(url) if(responce != "" and type(responce) != str ): jsonStr = responce.read() if(jsonStr != ""): res = tool.makeObj(json.loads(jsonStr)) else: res = "" self.linkStart = 0 else: self.out("请求异常:" + str(responce) ) self.linkStart = 1 return res # 发送消息-添加队列 def send(self, message, id=""): if(message != None and message != ""): if(id == "" and self.toIdNow != ""): #若是别人发给自己 id = self.fromIdNow msg = message # maxl = 131 # while(len(msg) > maxl): # sm = msg[0:maxl] # msg = msg[maxl:99999] # self.listMsgQue.append( (sm + "", id) ) self.listMsgQue.append( (msg,id)) self.lastEchoTimeQuene = tool.getNowTime() return # 发送消息 def doSend(self, message=""): if(message == ""): return self.out("Send." + message) responce=self.http.doPost("http://drrr.com/room/?ajax=1", { "message":message, # [0:4], "url":"", # to:5a1da324d5e68e6712725a50046f4b75 私聊 }) # self.out("发送[" + message + "]" + re[0:66]) self.lastEchoTime = tool.getNowTime() return def doSendId(self, message="", id=""): if(message == ""): return if(id == ""): self.doSend(message) return self.out("SendTo." + self.userIndexRe.get(id,"") + "."+ message) responce=self.http.doPost("http://drrr.com/room/?ajax=1", { "message":message, # [0:4], "url":"", "to":id }) # self.out("发送[" + message + "]" + re[0:66]) self.lastEchoTime = tool.getNowTime() return def addNextMusic(self, name="", fromName=""): if(fromName == ""): fromName = self.fromNameNow self.nextNames.append( (name,fromName) ) def showNexts(self): res = "" if(len(self.nextNames) > 0): res = "#Play list: " i = 1 for name,fromName in self.nextNames: res = res + " \nNo." + str(i) + " " + str(name) + " by " + str(fromName) i = i+1 else: res = "接下来随机播放" self.send(res) def play(self, name=""): self.playMusic("aaa", name) def playurl(self, url=""): self.playMusic(url) # 分享音乐 def playMusic(self, url="", name="", fromName=""): if(self.roomIndex.get(self.roomId, {}).get("music", False) == False): self.send("当前房间禁止音乐播放" + self.tail) return duration = self.maxMusicTimeDefault music = {} if(url[0:4] != "http"): #无地址url则是定向点播 if(name == ""): #无名字 则自动换 则考虑下一首序列 (name,fromName) while(len(self.nextNames) > 0): (name,fromName) = self.nextNames.pop(0) if(name != ""): self.send("接下来播放歌曲[" + name + "]" + self.tail) music = self.robot.getMusic(name, fromName) if(music.get("url","") != ""): break else: self.send("没有找到可播放歌曲[" + str(name) + "]") if(music.get("url", "") == ""): music = self.robot.turnMusic(self.musicPlayType) else: self.send("正在搜索歌曲[" + name + "]" + self.tail) music = self.robot.getMusic(name, fromName) url = music.get("url", "") name = music.get("name", "") fromName = music.get("fromName", "") duration = int(music.get("duration", 0)) if(duration < 100): duration = self.maxMusicTimeDefault self.musicPlayType = 0 #重置为随机播放 if(fromName != ""): msg = "" rooms = self.getUserRoom(fromName) if(len(rooms) > 0): room = rooms[0] if(room.get("id","") == self.roomId): #在当前房间 msg = "一首[" + name + "]送给" + fromName + "" + self.tail else: pass # msg = "Share " + room.get("name")[0:4] + "/" + fromName + "'s[" + name + "]" + "" + self.tail else: #不在线 pass # msg = "Then play" + fromName + " ordered [" + name + "]" + "" + self.tail self.send(msg) self.out("分享歌曲url=" + url + " name=" + name + " fromName=" + fromName + " time=" + str(tool.calcTime(duration)) ) if(url == ""): self.send("怼不起,没有找到类似的歌曲,瑟瑟发抖"+self.tail) return responce=self.http.doPost("http://drrr.com/room/?ajax=1", { "music":"music", "name":name, "url":url, }) self.musicNow = {"url":url, "name":name, "fromName":fromName, "duration":duration} self.maxMusicTime = duration - 6000 self.lastMusicTime = tool.getNowTime() return def listMusic(self): self.showNexts() # 切歌控制 on/off/turn/prev/next/remove def music(self, cmd="on"): self.out("music:" + cmd) if(cmd == "on"): self.ifOnMusic = True self.send("已经打开音乐点播" + self.tail) elif(cmd == "off"): self.ifOnMusic = False self.send("已经关闭音乐点播" + self.tail) elif(cmd == "turn"): # self.ifOnMusic = True self.musicPlayType = 0 self.playMusic() elif(cmd == "prev"): # self.ifOnMusic = True self.musicPlayType = -1 self.playMusic() elif(cmd == "next"): # self.ifOnMusic = True self.musicPlayType = 1 self.playMusic() elif(cmd == "remove"): self.robot.removeMusic(self.musicNow.get("url", "")) self.send("降低音乐" + self.musicNow.get("name") + "播放频率 " + self.tail) return # 手动控制 def inputHello(self): self.out("开启输入监控!") self.help() while(True): try: cmd=raw_input("") if(cmd != ""): if(not self.doMethod(cmd)): self.out("手动发送:" + cmd) self.send(cmd) time.sleep(1) except Exception as e: self.out(traceback.format_exc()) return # 抓取到消息的auto回复 def makeHello(self, obj): res = "" try: # tool.line() # self.out("抓取到消息obj") # self.out(obj) newTime = obj.get("update", self.lastMsgTime) newTime = int(newTime) # print(newTime) self.lastMsgTime = newTime talks = obj.get('talks', "") users = obj.get('users', "") if(users != ""): room = self.roomIndex.get(self.roomId, "") if(room != ""): self.roomIndex[self.roomId]['users'] = users else: self.roomIndex[self.roomId] = obj if(talks != ""): onceDocount = 0 for item in talks: # self.out(item) msgTime = item.get("time", tool.getNowTime()) msgId = item.get('id', " ") secret = item.get('secret', False) toId = item.get('to', {}).get('id', '') toName = item.get('to', {}).get('name', '') msgType = item.get('type', 'message') msgData = "" msgFromName = item.get('from', {}).get('name', "") fromId = item.get('from', {}).get('id', "") fromCode = item.get('from', {}).get('tripcode', '') if(msgFromName == ""): msgFromName = item.get('user', {}).get('name', "") fromId = item.get('user', {}).get('id', "") fromCode = item.get('user', {}).get('tripcode', '') turnFlag = 0 if(msgFromName != "" and fromId != "" and self.roomMsg.get(msgId, "") == ""): self.userIndex.get(msgFromName) # 处理同名 tripcode认证继承 异id问题 名字对应id不一样了 该房间里的cc不是原来记录的了 则删除原来的admin 顶替 n:id--1:名字 if(self.userIndex.get(msgFromName, fromId) != fromId): #非同id oldId = self.userIndex.pop(msgFromName) if(self.userIndexRe.get(oldId, "") != ""): self.userIndexRe.pop(oldId) # 判定和上次记录 的 zk#aa zk# 是否匹配 绑定用户名和code lastCode = self.tripcodeIndex.get(msgFromName, "") if(lastCode == fromCode): #但是 tc code 正常 则转移 if(self.admins.get(oldId,"") != ""): #若有admin则继承 oldValue = self.admins.pop(oldId) self.addAdmin(fromId, int(oldValue)) turnFlag = 1 #欢迎回来 else: # 否则 没有tc 同名 覆盖 都有tc 但不同 则也覆盖 if(self.admins.get(oldId,"") != ""): #若有admin则继承 oldValue = self.admins.pop(oldId) self.tripcodeIndex[msgFromName] = fromCode self.send("[" + msgFromName + "] tc变更[" + str(lastCode) + " - " + str(fromCode) ) self.userIndex[msgFromName] = fromId self.userIndexRe[fromId] = msgFromName if(msgType == 'me'): msgData = item.get('content', "") elif(msgType == 'message'): msgData = item.get('message', "") elif(msgType == 'join' and self.ifWelcom): # msgFromName = item.get('user', {}).get('name', "") if(turnFlag == 0): msgData = '欢迎' + msgFromName + self.tail else: msgData = '欢迎回来 ' + msgFromName + self.tail elif(msgType == 'leave'): msgData = '' + msgFromName + '' + self.tail msgData = '' elif(msgType == 'music'): music = item.get('music', {}) name = music.get('name', '') url = music.get('url', '') # msgData = '悄悄的的把[' + name + ']给记在小本子上 ' + self.tail ######################################################## 不处理 if( self.roomMsg.get(msgId, "") != ""): #已经处理过 或者是自己发送的 或者取出发送者失败 # self.out("旧消息 " + msgId + " type:" + msgType + " data:" + msgData) continue self.roomMsg[msgId] = item #标记未已经处理 历史消息 if( msgFromName == self.name or msgFromName == ""): continue if(msgType == "me" or msgType == "message"): #只记录聊天消息 self.robot.addMsg(msgId, msgFromName, msgData, msgTime) ############################################################# #当前消息信息记录 self.fromNameNow = msgFromName self.fromIdNow = fromId self.fromNameNow = msgFromName self.toIdNow = toId self.toNameNow = toName if(msgType == 'music'): music = { "name":name, "url":url, "fromName":msgFromName } res = self.robot.addMusic(music) #添加用户分享记录 if(res): self.robot.addHistory(music) self.musicNow = music self.lastMusicTime = tool.getNowTime() # self.roomMsg[msgId] = item #标记未已经处理 历史消息 if(self.status>self.statusMax): self.status = self.statusMax elif(self.status < self.statusMin): self.status = self.statusMin detaTime = tool.getNowTime() - self.lastEchoTimeQuene # ms 60s olRan = tool.getRandom(0,self.maxDetaTime) / 1000 #0-180 过于久没有发过消息了 权重高则可能自回复 weight = (self.maxDetaTime - detaTime) / 1000 #多久没说话了 最大多长时间必须说话 ran = int(1.0 * olRan * (1+ 1.0 * (self.status-90) / 100) ) # self.out("Msg." + msgId[0:4] + "." + tool.fill(str(weight) + "" , ' ', 5) + " " + tool.fill(str(olRan) + "->" + str(ran),' ', 5) + "." + tool.fill(msgFromName,' ',8) + "."+tool.fill(msgType,' ',4) + "." + msgData + " ." + str(fromId)) self.out("Msg." + msgId[0:4] + " " + msgFromName[0:10] + "->" + toName[0:10]+ " "+msgType[0:4] + " " + msgData ) msgData = msgData.strip() flag = 0 #不回复 if(msgType == 'message' or msgType == 'me' ): #普通聊天消息 if( re.search('@' + self.name + " ", msgData) != None): #有@自己 且权重不太低 msgData = re.sub('@' + self.name + "", "", msgData) #摘除@自己 flag = 1 msgData = msgData.strip() # else: # self.out("@me 随机数=" + str(ran) + " 小于 说话欲望=" + str(self.status) + " ") # flag = 2 # msg = "生气程度:" + str(100-self.status) + "%,不想搭理"+self.tail elif(ran > weight and re.search('@', msgData) == None): # 没有@ 且 权重高 主动搭话概率 flag = 1 elif(toId != ""): #私聊 flag = 1 else: flag = 10 #admin权限认证 if(self.adminRes != "" and str(msgData) == str(self.adminRes)): self.out("触发权限admin认证." + str(self.adminRes) + "=" + str(msgData) + "." + msgFromName + "." + fromId) self.send("认证成功[" + str(msgFromName) + "]") self.addAdmin(fromId) flag = 0 msgData = "" else: #事件 flag = 2 res = "" self.lastOtherSay = tool.getNowTime() #重置处理时间 黑名单消息不计入消息 if(self.filterFlag(msgData, msgFromName)): #最高级 权限是否黑名单过滤 if(flag == 1 or flag == 10): if(flag == 1 and self.robot.getUser(msgFromName).get("flag", "0") != "0"): self.out("不想搭理" + msgFromName) else: if(flag == 1 and self.filterCmd(msgData, msgFromName)): #若过滤器未处理 则继续交由下面处理 pass elif(flag == 10): #让普通消息也接入 cmd 不过没有后续处理 self.filterCmd(msgData, msgFromName) res = "" elif(flag == 2): res = msgData if(res != "" and flag != 0 and onceDocount < 6): # 最多一次抓取发送3个 res = '' + res onceDocount = onceDocount + 1 # self.send(res) #当前消息信息清空 self.fromNameNow = "" self.fromIdNow = "" self.fromNameNow = "" self.toIdNow = "" self.toNameNow = "" except Exception as e: self.out("Exception:" + str(e)) # tool.line() return res # /do help 指令控制行为 /do send 你们好 def filterCmd(self, msgData="", fromName=""): res = True msgData = msgData.strip() flag = False size = len(msgData) # self.out("filterCmd." + msgData + "." + fromName) if( re.search('/do', msgData) != None and self.toIdNow != "" ): # /do指令1阶 且只接受私聊控制 if( self.ifAdminName(fromName, 0) ): res = False cmd = msgData[3:9999] self.out(" do method." + str(cmd)) if(not self.doMethod(cmd)): self.help() # res = self.doControl(res, msgData, ['管理员', 'admin', 'Admin'], self.getAdmin, fromName, False, 0) # res = self.doControl(res, msgData, ['help', '帮助'], self.showHelp, fromName, False, 0) # res = self.doControl(res, msgData, ['nexts', '歌单', '歌单列表'], self.showNexts, fromName, False, 0) # res = self.doControl(res, msgData, ['next', '接下来播放', '下一首播放'], self.addNextMusic, fromName, True, 0) # # res = self.doControl(res, msgData, ['rooms', '房间列表'], self.showRoomList, fromName, True, 0) # # res = self.doControl(res, msgData, ['管理员', 'admin', 'Admin'], self.getAdmin, fromName, False, 0) # res = self.doControl(res, msgData, ['admins', 'score', 'Admins'], self.showAdmin, fromName, False, 0) # res = self.doControl(res, msgData, ['踢出', 'kick', 'del', '删除','rm'], self.rm, fromName, True,0) # res = self.doControl(res, msgData, ['host', '房主'], self.host, fromName, True, 2) # res = self.doControl(res, msgData, ['out', 'leave'], self.outRoom, fromName, False, 0) # # # 295796671 # res = self.doSetControl(res, msgData, ['wait', 'stay'], "notWait", False, echoStr="决定在这里住下来") # res = self.doSetControl(res, msgData, ['开始迎客', 'start hello'], "ifWelcom", True, echoStr="开始迎客") # res = self.doSetControl(res, msgData, ['停止迎客', 'stop hello'], "ifWelcom", False, echoStr="保持沉默") # res = self.doSetControl(res, msgData, ['开始存活确认', 'start live'], "ifTime", True, echoStr="开始存活确认") # res = self.doSetControl(res, msgData, ['停止存活确认', 'stop live'], "ifTime", False, echoStr="停止存活确认") return res #设置值类处理链 def doSetControl(self, ifDo, msgData, cmds, attrName, value, echoStr=""): if(not ifDo): #False 则不处理 且继续返回False return ifDo res = True for item in cmds: if(msgData == item): self.out("命中:" + str(item) ) res = False self.let(attrName, value) self.send("" + self.name + str(echoStr) + self.tail) break return res # 处理链 def doControl(self, ifDo, msgData, cmds, callback, fromName, argType=False, adminLevel=0): if(not ifDo): #False 则不处理 且继续返回False return ifDo res = True if(argType): for item in cmds: itemLen = len(item) index = msgData.find(item) if(index == 0): #头命中 msgData = msgData[itemLen:9999].strip() self.out("命中:" + str(item) + " 参数:" + str(msgData)) if(adminLevel > 0): if(self.ifAdminName(fromName, adminLevel)): callback(msgData) res = False else: callback(msgData) res = False break else: for item in cmds: if(msgData == item): self.out("命中:" + str(item) ) callback() res = False break return res def addBad(self, fromName): self.robot.turnUser(fromName, "1") # [methodName arg1 arg2] def filterFlag(self, msgData="", fromName=""): res = True msgData = msgData.strip() flag = False size = len(msgData) msg = "" keys = ["别说话", "你别说话", "闭嘴", "shutup"] statusOn = ['笨蛋', '傻逼', 'sb', 'SB', 'Sb','sB', '傻b', '傻', 'bad'] statusOff = ['开心一点','开心点','我错了', '求你了', '后悔', '收回','我收回','对不起', '悔恨', '不要生气'] if(not flag): for item in statusOff: if(msgData == item): self.robot.turnUser(fromName, "0") self.status = self.status + self.statusOnDeta if(self.status >= self.statusMax + self.statusOnDeta): msg = self.name + "现在没有生气(╯▔皿▔)╯" elif(self.status >= self.statusDefault): msg = self.name + "心情好转了 不生气了﹏" else: msg = self.name + "气消了一点点,生气值-" + str(self.statusOnDeta) + self.tail flag = True break if(self.robot.getUser(fromName).get("flag", "0") != "0"): #限制黑名单只接受道歉 self.out("黑名单只接受道歉 不想搭理" + fromName) return False if(not flag): for item in keys: if(msgData == item): self.status = self.status - self.statusDownDeta msg = "好的" + ",生气值陡升" + str(self.statusDownDeta) + ",当前" + str(100-self.status) + "% " flag = True break if(not flag): for item in statusOn: if(msgData == item): self.robot.turnUser(fromName, "1") self.status = self.status - self.statusOffDeta if(self.status <= self.statusMin - self.statusOffDeta): msg = self.name + "已经气死了 没这号robot 😕" elif(self.status <= self.statusMin): msg = self.name + "已经气炸了 不想再说话了 ε=( o`ω′)ノ " else: msg = self.name + "生气值暴涨" + str(self.statusOffDeta) + ",不想再搭理" + fromName + "了" + self.tail flag = True break if(flag):#状态控制 self.out('filterFlag.' + str(flag) + "." + msgData) res = False self.send("" + msg) return res # methodName args eg: 'send aaaaa' 第一个空格分开函数名 def doMethod(self, cmd): #music <on/off/turn/prev/next> cmd = cmd.strip() cmds = cmd.split(' ') if(len(cmds) > 0 and cmds[0] == ""): cmds.pop(0) listArgs = cmds size = len(listArgs) res = False if(size > 0): if(hasattr(self, listArgs[0])): method = getattr(self, listArgs[0])#获取的是个对象 if(callable(method)): if(size == 2): method(listArgs[1]) elif(size == 3): method(listArgs[1], listArgs[2]) elif(size == 4): method(listArgs[1], listArgs[2], listArgs[3]) elif(size == 5): method(listArgs[1], listArgs[2], listArgs[3], listArgs[4]) else: method() res = True else: res = True self.out(method) return res def let(self, attrName="", value=""): self.out("变量赋值." + str(attrName) + "." + str(value)) if(hasattr(self, attrName)): method = getattr(self, attrName)#获取的是个对象 if(callable(method)): self.out("该属性为方法") else: setattr(self, attrName, value) else: self.out("该属性不存在") def shutdown(self): self.outRoom() self.out("3秒后关闭程序") # time.sleep(2) tool.line() # sys.exit() # os.kill() os._exit(0) def restart(self): # self.shutdown() # self.login() self.outRoom() tool.line() self.out("3秒后重启程序") # time.sleep(3) #重启程序 python = sys.executable os.execl(python, python, * sys.argv) def test(self): self.login() self.getRooms() # self.goRoom("QGSNLntBvK") # self.goRoomName("深海") self.goARoom() ThreadRun( "DoSend." + str(self.count), self.doHello ).start() ThreadRun( "SayHello." + str(self.count), self.sayHello ).start() ThreadRun( "GetHello." + str(self.count), self.getHello ).start() # ThreadRun( "InputHello." + str(self.count), self.inputHello ).start() # for i in range(len(self.roomIndex.keys())): # self.goRoom( self.roomIndex.keys()[i] ) # self.music("turn") # time.sleep(7) # self.outRoom() # time.sleep(3) return def test2(self): self.login() self.getRooms() # self.goRoom("QGSNLntBvK") # self.goRoomName("深海") # self.goARoom() # ThreadRun( "DoSend." + str(self.count), self.doHello ).start() ThreadRun( "SayHello." + str(self.count), self.sayHello ).start() ThreadRun( "GetHello." + str(self.count), self.getHello ).start() # ThreadRun( "InputHello." + str(self.count), self.inputHello ).start() return
def __init__(self, name="0000000"): self.http = Http() self.name = name
class MainWindow(QMainWindow): ''' Describes main window of a client application. ''' def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.mimes = {'team': 'application/x-team-item', 'event': 'application/x-calendar-event', } self.rooms = [] self.tree = [] self.rfid_id = None self.http = Http(self) self.work_hours = (8, 24) self.schedule_quant = timedelta(minutes=30) self.menus = [] self.create_menus() self.setup_views() settings = QSettings() settings.beginGroup('network') host = settings.value('addressHttpServer', QVariant('WrongHost')) settings.endGroup() if 'WrongHost' == host.toString(): self.setupApp() self.baseTitle = _('Manager\'s interface') self.logoutTitle() self.statusBar().showMessage(_('Ready'), 2000) self.resize(640, 480) def loggedTitle(self, name): ''' Appends name of a manager to basic title of main window. Indended to be called after successful L{log in<???>}. @type name: string @param name: Name of a manager, that have logged in. ''' self.setWindowTitle('%s : %s' % (self.baseTitle, name)) def logoutTitle(self): ''' Appends 'Log in to start session' to basic title of main window. Indended to be used on L{logout<>} and when application L{starts<__init__>}. ''' self.setWindowTitle('%s : %s' % (self.baseTitle, _('Login to start session'))) def get_dynamic(self): ''' Updates L{labels<create_views>} bpMonday and bpSunday, that show date of beginning and end of the week, that is currently displayed by L{QtSchedule} widget. ''' self.bpMonday.setText(self.schedule.model().getMonday().strftime('%d/%m/%Y')) self.bpSunday.setText(self.schedule.model().getSunday().strftime('%d/%m/%Y')) def get_static(self): """ Gets static information from server. First, all present rooms are L{retrieved<Http.request>}. They are returned as a dict in the following format:: {'rows': [{'color': 'FFAAAA', 'text': 'red', 'id': 1}, {'color': 'AAFFAA', 'text': 'green', 'id': 2}, ...]} Then, other static info is retrieved??? """ # get rooms if not self.http.request('/manager/get_rooms/', {}): QMessageBox.critical(self, _('Room info'), _('Unable to fetch: %s') % self.http.error_msg) return default_response = {'rows': []} response = self.http.parse(default_response) self.rooms = tuple( [ (a['title'], a['color'], a['id']) for a in response['rows'] ] ) self.schedule.update_static( {'rooms': self.rooms} ) # static info if not self.http.request('/manager/static/', {}): QMessageBox.critical(self, _('Static info'), _('Unable to fetch: %s') % self.http.error_msg) return response = self.http.parse() self.static = response print 'Static is', self.static.keys() #import pprint; pprint.pprint(self.static) #self.tree = TreeModel(self.static.get('styles', None)) def update_interface(self): """ This method updates application's interface using static information obtained in previous method. """ # rooms if self.rooms and len(self.rooms) > 0: for title, color, id in self.rooms: buttonFilter = QPushButton(title) buttonFilter.setCheckable(True) buttonFilter.setDisabled(True) # BUG #28 self.panelRooms.addWidget(buttonFilter) self.connect(buttonFilter, SIGNAL('clicked()'), self.prepare_filter(id, title)) def prepare_filter(self, id, title): def handler(): self.statusBar().showMessage(_('Filter: Room "%s" is changed its state') % title) return handler def setup_views(self): ''' This method sets up layout of main window, except for dropdown menus. At the center of the window there is a custon L{QtSchedule} widget, which shows timetable of some week or of particular day. Under it there are widgets for navigation: two labels bpMonday and bpSunday display information on what date range is displayed in schedule widget, and buttons buttonPrev, buttonNext and buttonToday are used to tell schedule to show previous week, next week and current week respectively. ''' self.panelRooms = QHBoxLayout() schedule_params = { 'http': self.http, 'work_hours': self.work_hours, 'quant': self.schedule_quant, 'rooms': self.rooms, } self.schedule = QtSchedule(self, schedule_params) self.bpMonday = QLabel('--/--/----') self.bpSunday = QLabel('--/--/----') self.buttonPrev = QPushButton(_('<<')) self.buttonNext = QPushButton(_('>>')) self.buttonToday = QPushButton(_('Today')) self.buttonPrev.setDisabled(True) self.buttonNext.setDisabled(True) self.buttonToday.setDisabled(True) # callback helper function def prev_week(): week_range = self.schedule.model().showPrevWeek() self.showWeekRange(week_range) def next_week(): week_range = self.schedule.model().showNextWeek() self.showWeekRange(week_range) def today(): week_range = self.schedule.model().showCurrWeek() self.showWeekRange(week_range) self.connect(self.buttonPrev, SIGNAL('clicked()'), prev_week) self.connect(self.buttonNext, SIGNAL('clicked()'), next_week) self.connect(self.buttonToday, SIGNAL('clicked()'), today) bottomPanel = QHBoxLayout() bottomPanel.addWidget(QLabel(_('Week:'))) bottomPanel.addWidget(self.bpMonday) bottomPanel.addWidget(QLabel('-')) bottomPanel.addWidget(self.bpSunday) bottomPanel.addStretch(1) bottomPanel.addWidget(self.buttonPrev) bottomPanel.addWidget(self.buttonToday) bottomPanel.addWidget(self.buttonNext) mainLayout = QVBoxLayout() mainLayout.addLayout(self.panelRooms) mainLayout.addWidget(self.schedule) mainLayout.addLayout(bottomPanel) mainWidget = QWidget() mainWidget.setLayout(mainLayout) self.setCentralWidget(mainWidget) def showWeekRange(self, week_range): if self.schedule.model().getShowMode() == 'week': monday, sunday = week_range self.bpMonday.setText(monday.strftime('%d/%m/%Y')) self.bpSunday.setText(sunday.strftime('%d/%m/%Y')) def getMime(self, name): return self.mimes.get(name, None) def create_menus(self): """ This method generates the application dropdown menu. Menu items are specified in 'data' variable inside the method. Format is as follows: - data is list of tuples of form (menu_title, list_of_submenus), where menu_name is the name of a given menu (e.g. 'File') and list_of_submenus contains menu items, that drop down, when you click on menu_name. - submenu items are tuples (title, shortcut, handler function, comment) Current menu structure is as follows: - File. - L{Log in<login>}. - L{Log out<logout>}. - L{Application settings<setupApp>}. - Exit. - Client. - L{New<client_new>}. - L{Search by RFID<client_search_rfid>}. - L{Search by name<client_search_name>}. - Renter. - L{New<renterNew>}. - L{Search by name<renterSearchName>}. - Calendar. - L{Fill week<fillWeek>}. @important: Style of naming of functions is mixed!!! """ data = [ (_('File'), [ (_('Log in'), 'Ctrl+I', 'login', _('Start user session.')), (_('Log out'), '', 'logout', _('End user session.')), None, (_('Application settings'), 'Ctrl+G', 'setupApp', _('Manage the application settings.')), None, (_('Exit'), '', 'close', _('Close the application.')), ] ), (_('Client'), [ (_('New'), 'Ctrl+N', 'client_new', _('Register new client.')), (_('Search by RFID'), 'Ctrl+D', 'client_search_rfid', _('Search a client with its RFID card.')), (_('Search by name'), 'Ctrl+F', 'client_search_name', _('Search a client with its name.')), ] ), (_('Renter'), [ (_('New'), '', 'renterNew', _('Register new renter.')), (_('Search by name'), '', 'renterSearchName', _('Search a renter with its name.')), ] ), # (_('Event'), [ # (_('Training'), 'Ctrl+T', # 'eventTraining', _('Assign a training event.')), # (_('Rent'), 'Ctrl+R', # 'eventRent', _('Assign a rent event.')), # ] # ), (_('Calendar'), [ (_('Fill week'), 'Ctrl+L', 'fillWeek', _('Fill current week.')), # (_('Copy week'), 'Ctrl+W', # 'copyWeek', _('Copy current week into other.')), ] ), # (_('Accounting'), [ # (_('Add resources'), '', # 'addResources', _('Add new set of resources into accounting.')), # ] # ), ] for topic, info in data: menu = self.menuBar().addMenu(topic) # Disable the following menu actions, until user will be authorized. if topic != _('File'): menu.setDisabled(True) for item in info: if item is None: menu.addSeparator() continue title, short, name, desc = item setattr(self, 'act_%s' % name, QAction(title, self)) action = getattr(self, 'act_%s' % name) action.setShortcut(short) action.setStatusTip(desc) self.connect(action, SIGNAL('triggered()'), getattr(self, name)) menu.addAction(action) self.menus.append(menu) def interface_disable(self, state): # True = disabled, False = enabled ''' This method is to be invoked on L{log out<logout>} or when the application L{starts<__init__>}. It disables schedule navigation buttons and L{all dropdown menus except File<create_menus>}. ''' # Enable menu's action for menu in self.menus: if menu.title() != _('File'): menu.setDisabled(state) # Enable the navigation buttons self.buttonPrev.setDisabled(state) self.buttonNext.setDisabled(state) self.buttonToday.setDisabled(state) def refresh_data(self): """ This method gets current timetable from the server using L{update<QtSchedule.update>} method of L{QtSchedule} widget. It is called periodically using timer. Interaction with server only occurs if manager is logged in. """ # Do nothing until user authoruized if not self.http.is_session_open(): return # Just refresh the calendar's model self.schedule.model().update # Menu handlers: The begin def login(self): ''' Shows log in dialog, where manager is asked to provide login/password pair. If 'Ok' button is clicked, authentication L{request<Http.request>} is made to the server, which is then L{parsed<Http.parse>}. On success: - information about schedule is retrieved from the server and and L{QtSchedule} widget is L{updated<update_interface>}. - controls are L{activated<interface_disable>}. - window title is L{updated<loggedTitle>} - schedule information is being L{refreshed<refresh_data>} from now on. In case of failure to authenticate a message is displayed. ''' def callback(credentials): self.credentials = credentials self.dialog = DlgLogin(self) self.dialog.setCallback(callback) self.dialog.setModal(True) dlgStatus = self.dialog.exec_() if QDialog.Accepted == dlgStatus: if not self.http.request('/manager/login/', self.credentials): QMessageBox.critical(self, _('Login'), _('Unable to login: %s') % self.http.error_msg) return default_response = None response = self.http.parse(default_response) if response and 'user_info' in response: self.loggedTitle(response['user_info']) # update application's interface self.get_static() self.get_dynamic() self.update_interface() self.schedule.model().showCurrWeek() # run refresh timer self.refreshTimer = QTimer(self) from settings import SCHEDULE_REFRESH_TIMEOUT self.refreshTimer.setInterval(SCHEDULE_REFRESH_TIMEOUT) self.connect(self.refreshTimer, SIGNAL('timeout()'), self.refresh_data) self.refreshTimer.start() self.interface_disable(False) else: QMessageBox.warning(self, _('Login failed'), _('It seems you\'ve entered wrong login/password.')) def logout(self): ''' Performs sequence of clean up actions when manager logs out: - L{disables controls<interface_disable>}; - Deletes information about schedule and rooms, that are present. ''' self.interface_disable(True) self.setWindowTitle('%s : %s' % (self.baseTitle, _('Login to start session'))) self.schedule.model().storage_init() # clear rooms layout layout = self.panelRooms while layout.count() > 0: item = layout.takeAt(0) if not item: continue w = item.widget() if w: w.deleteLater() def setupApp(self): ''' Displays dialog with settings for client application. After that date range, that is being displayed is refreshed and L{reconnect<Http.reconnect>} to server is performed (just in case network settings) had been altered. ''' self.dialog = DlgSettings(self) self.dialog.setModal(True) self.dialog.exec_() self.get_dynamic() self.http.reconnect() def client_new(self): ''' Opens empty client information L{dialog<ClientInfo>} for adding new client to the database. Class for L{accessing server<Http>} and static information (???) are passed as parameters. ''' params = { 'http': self.http, 'static': self.static, } self.dialog = ClientInfo(self, params) self.dialog.setModal(True) self.dialog.exec_() def client_search_rfid(self): ''' Search client in the database by RFID (Radio Frequency IDentificator). After RFID was successfully read from card, server is L{requested<Http.request>} client info. If user is found in database, L{dialog<ClientInfo>} with information about client is displayed. Otherwise, messageboxes with warnings are displayed. ''' if not self.http or not self.http.is_session_open(): return # login first def callback(rfid): self.rfid_id = rfid params = { 'http': self.http, 'static': self.static, 'mode': 'client', 'callback': callback, } dialog = WaitingRFID(self, params) dialog.setModal(True) dlgStatus = dialog.exec_() if QDialog.Accepted == dlgStatus and self.rfid_id is not None: params = {'rfid_code': self.rfid_id, 'mode': 'client'} if not self.http.request('/manager/get_client_info/', params): QMessageBox.critical(self, _('Client info'), _('Unable to fetch: %s') % self.http.error_msg) return default_response = None response = self.http.parse(default_response) if not response or response['info'] is None: QMessageBox.warning(self, _('Warning'), _('This RFID belongs to nobody.')) else: user_info = response['info'] params = { 'http': self.http, 'static': self.static, } self.dialog = ClientInfo(self, params) self.dialog.setModal(True) self.dialog.initData(user_info) self.dialog.exec_() self.rfid_id = None def client_search_name(self): ''' Search client in the database by name. First it launches client search L{dialog<Searching>}, which tries to fetch unique user_id from the server based on information provided. If that succeeds, user_id-based search then Works analogously to L{RFID-based<client_search_rfid>} search. ''' if not self.http or not self.http.is_session_open(): return # login first def callback(user_id): self.user_id = user_id params = { 'http': self.http, 'static': self.static, 'mode': 'client', 'apply_title': _('Show'), } self.dialog = Searching(self, params) self.dialog.setModal(True) self.dialog.setCallback(callback) dlgStatus = self.dialog.exec_() if QDialog.Accepted == dlgStatus: if not self.http.request('/manager/get_client_info/', {'user_id': self.user_id, 'mode': 'client'}): QMessageBox.critical(self, _('Client info'), _('Unable to fetch: %s') % self.http.error_msg) return default_response = None response = self.http.parse(default_response) if not response or response['info'] is None: QMessageBox.warning(self, _('Warning'), _('This RFID belongs to nobody.')) else: params = { 'http': self.http, 'static': self.static, } self.dialog = ClientInfo(self, params) self.dialog.setModal(True) self.dialog.initData(response['info']) self.dialog.exec_() def renterNew(self): ''' Adding new renter. ''' self.dialog = DlgRenterInfo(self) self.dialog.setModal(True) self.dialog.exec_() def renterSearchName(self): ''' Search renter by his name. @important: by some strange reason, HttpAjax class is used instead of Http to fetch information from the server. ''' def callback(id): self.user_id = id params = { 'http': self.http, 'static': self.static, 'mode': 'client', } self.dialog = Searching(self, params) self.dialog.setModal(True) self.dialog.setCallback(callback) dlgStatus = self.dialog.exec_() if QDialog.Accepted == dlgStatus: ajax = HttpAjax(self, '/manager/get_renter_info/', {'user_id': self.user_id, 'mode': 'renter'}, self.session_id) response = ajax.parse_json() self.dialog = DlgRenterInfo(self) self.dialog.setModal(True) self.dialog.initData(response['info']) self.dialog.exec_() def eventTraining(self): def callback(e_date, e_time, room_tuple, team): room, ok = room_tuple title, team_id, count, price, coach, duration = team begin = datetime.combine(e_date, e_time) duration = timedelta(minutes=int(duration * 60)) ajax = HttpAjax(self, '/manager/cal_event_add/', {'event_id': team_id, 'room_id': room, 'begin': begin, 'ev_type': 0}, self.session_id) response = ajax.parse_json() id = int(response['saved_id']) event_info = {'id': id, 'title': title, 'price': price, 'count': count, 'coach': coach, 'duration': duration, 'groups': _('Waiting for update.')} eventObj = Event({}) # FIXME self.schedule.insertEvent(room, eventObj) self.dialog = DlgEventAssign('training', self) self.dialog.setModal(True) self.dialog.setCallback(callback) self.dialog.setModel(self.tree) self.dialog.setRooms(self.rooms) self.dialog.exec_() def eventRent(self): def callback(e_date, e_time, e_duration, room_tuple, rent): room, ok = room_tuple rent_id = rent['id'] begin = datetime.combine(e_date, e_time) duration = timedelta(hours=e_duration.hour, minutes=e_duration.minute) params = { 'event_id': rent_id, 'room_id': room, 'begin': begin, 'ev_type': 1, 'duration': float(duration.seconds) / 3600 } ajax = HttpAjax(self, '/manager/cal_event_add/', params, self.session_id) response = ajax.parse_json() id = int(response['saved_id']) eventObj = Event({}) # FIXME self.schedule.insertEvent(room, eventObj) self.dialog = DlgEventAssign('rent', self) self.dialog.setModal(True) self.dialog.setCallback(callback) self.dialog.setRooms(self.rooms) self.dialog.exec_() def fillWeek(self): def callback(selected_date): model = self.schedule.model() from_range = model.weekRange to_range = model.date2range(selected_date) if not self.http.request('/manager/fill_week/', {'to_date': to_range[0]}): QMessageBox.critical(self, _('Fill week'), _('Unable to fill: %s') % self.http.error_msg) return default_response = None response = self.http.parse(default_response) if response and 'saved_id' in response: # inform user info = response['saved_id'] msg = _('The week has been filled sucessfully. Copied: %(copied)i. Passed: %(passed)i.') self.statusBar().showMessage(msg % info, 3000) # FIXME: pause here, but not just sleep, use timer # update view self.schedule.model().update() self.dialog = DlgCopyWeek(self) self.dialog.setModal(True) self.dialog.setCallback(callback) self.dialog.exec_() def copyWeek(self): def callback(selected_date): model = self.scheduleModel from_range = model.weekRange to_range = model.date2range(selected_date) ajax = HttpAjax(self, '/manager/copy_week/', {'from_date': from_range[0], 'to_date': to_range[0]}, self.session_id) response = ajax.parse_json() self.statusBar().showMessage(_('The week has been copied sucessfully.')) self.dialog = DlgCopyWeek(self) self.dialog.setModal(True) self.dialog.setCallback(callback) self.dialog.exec_() def addResources(self): def callback(count, price): # ajax = HttpAjax(self, '/manager/add_resource/', # {'from_date': from_range[0], # 'to_date': to_range[0]}, self.session_id) response = ajax.parse_json() self.statusBar().showMessage(_('The week has been copied sucessfully.')) self.dialog = DlgAccounting(self) self.dialog.setModal(True) self.dialog.setCallback(callback) self.dialog.exec_() # Menu handlers: The end #def getUserInfo(self, rfid): # """ This method get user's information by its card's identifier. """ # ajax = HttpAjax(self, '/manager/get_client_info/', # {'rfid_code': rfid, mode='client'}) # json_like = ajax.parse_json() # print 'USER INFO:', json_like # return json_like def showEventProperties(self, calendar_event, index): #, room_id): self.dialog = EventInfo(self, {'http': self.http}) self.dialog.setModal(True) self.dialog.initData(calendar_event, index) self.dialog.exec_() # Drag'n'Drop section begins def mousePressEvent(self, event): if DEBUG: print 'press event', event.button() def mouseMoveEvent(self, event): if DEBUG: print 'move event', event.pos()
class Auto163: def __init__(self, name="0000000"): self.http = Http() self.name = name def out(self, obj): print(self.__module__ + "." + self.name + "." + obj) def login(self): pass def help(self): self.out(dir(self)) # [methodName arg1 arg2] def doMethod(self, listArgs): size = len(listArgs) res = False if(size > 0): if(hasattr(self, listArgs[0])): method = getattr(self, listArgs[0])#获取的是个对象 if(callable(method)): if(size == 2): method(listArgs[1]) elif(size == 3): method(listArgs[1], listArgs[2]) elif(size == 4): method(listArgs[1], listArgs[2], listArgs[3]) elif(size == 5): method(listArgs[1], listArgs[2], listArgs[3], listArgs[4]) else: method() res = True else: self.out(method) return res def getMusic(self, musicName="", fromName=""): tool.line() res = [] self.out("歌曲名字[" + musicName + "] from:" + fromName) responce = self.http.do("http://music.163.com/api/search/get/web?csrf_token=", { "hlpretag":"", "hlposttag":"", "s":musicName, "type":1, "offset":0, "total":"true", "limit":5, }) obj = tool.toJson(responce.read()) songs = obj.get("result", {}).get("songs", []) self.out("抓取到音乐:") for item in songs: id = item.get("id", "") name = item.get("name", "") url = "http://link.hhtjim.com/163/" + str(id) + ".mp3" duration = item.get("duration", 0) music = {"url":url, "name":name, "fromName":fromName, "duration":duration} self.out("url:" + url + " name:" + name) res.append(music) return res # 手动控制 def inputHello(self): self.out("开启输入监控!") self.help() while(True): try: cmd=raw_input("") if(cmd != ""): if(not self.doMethod(cmd.split(" "))): self.out("手动发送:" + cmd) self.getMusic(cmd) time.sleep(1) except Exception as e: self.out(repr(e)) return def test(self): self.login() ThreadRun( "InputHello." + str(self.name), self.inputHello ).start() tool.wait() return
def __init__(self, server, port, auth_token): self.__server = server self.__http = Http(server) self.__http.set_port(port) self.__auth_token = auth_token