def get_contact(self): url = self.base_url + '/webwxgetcontact' headers = { 'ContentType': 'application/json, charset=UTF-8', } params = { 'pass_ticket': self.pass_ticket, 'skey': self.skey, 'r': int(time.time()), } data = { 'BaseRequest': self.request_parm, } resp = url_requests('post', url=url, headers=headers, params=params, data=data, jsonfmt=True) if not resp: log.error("Error: Get contact error!") self.contact_list = list() for contact in resp['MemberList']: if contact['VerifyFlag'] & 8 != 0: continue elif '@@' in contact['UserName']: continue elif contact['UserName'] == self.user['UserName']: continue self.contact_list.append(contact) return True
def wechat_notify(self): if self.status != 'Inited': log.error('Init error, can not set notify') return False self.state = "SetNotify" url = self.base_url + '/webwxstatusnotify' params = { 'lang': self.lang, 'pass_ticket': self.pass_ticket, } data = { 'BaseRequest': self.request_parm, 'Code': 3, 'FromUserName': self.user['UserName'], 'ToUserName': self.user['UserName'], 'ClientMsgId': int(time.time()) } resp = url_requests('post', url=url, params=params, data=data, jsonfmt=True) if not resp: log.error("Error: Set notify error!") self.status = 'SetError' return False if not resp['BaseResponse']['Ret'] == 0: log.error("Error: %s", resp['BaseResponse']['ErrMsg']) self.status = 'SetError' return False self.status = 'SetSucceed' log.info('Set notify succeed.') return True
def wait_login(self, tip=1): if self.status != 'WaitLoging': log.error("Error: Status is %s, expect 'WaitLoging'", self.status) return False url = self.login_url + \ '/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s' % \ (tip, self.uuid, int(time.time())) resp = url_requests('get', url=url) if not resp: self.status = 'LogError' return False match = re.search(r"window.code=(\d+);", resp) state = match.group(1) if state == '201': return True elif state == '200': match = re.search(r'window.redirect_uri="(\S+?)";', resp) r_uri = match.group(1) + '&fun=new' self.redirect_uri = r_uri self.base_url = r_uri[:r_uri.rfind('/')] return True elif state == '408': log.error("Error: Login timeout...") self.status = 'Timeout' return False else: log.error("Error: Login unknown error") self.status = 'UnknowError' return False
def chat(message, userid='123456789', local=None): params = { 'key': APIKEY, 'userid': userid, 'info': message, } if local is not None: params['loc'] = local try: resp = url_requests('get', url=URL, params=params, jsonfmt=True) except Exception as ex: log.error("Request 'tuling':%s", ex) return '' if not resp: log.error("Chat with 'tuling' error!") return '' state = resp.pop('code') error_state = [40001, 40002, 40004, 40007] if state in error_state: log.error("Error state: %s", state) if state == 100000: return resp['text'] elif state == 200000: return ':\n'.join([resp['text'], resp['url']]) elif state == 302000 or state == 308000: return ':\n'.join( [resp['text'], json.dumps(resp['list'], ensure_ascii=False)]) else: return json.dumps(resp)
def chat(message): params = { 'key': 'free', 'appid': 0, 'msg': message, } resp = url_requests('get', url=URL, params=params, jsonfmt=True) if not resp: log.error("Chat with 'qingyunke' error!") return '' if resp['result'] != 0: log.error("'Qingyunke' cant understand message(%s).", message) return '' content = resp['content'] return content.replace('{br}', '\n')
def get_uuid(self): url = 'https://login.weixin.qq.com/jslogin' params = { 'appid': self.appid, 'fun': 'new', 'lang': self.lang, '_': int(time.time()), } resp = url_requests('post', url=url, data=params) if not resp: self.status = "LogError" return False (status, wechat_uuid) = self.reponse_process(resp) if status != '200' or not wechat_uuid: log.error("Error: status: %s, uuid: %s", status, wechat_uuid) return False self.uuid = wechat_uuid return True
def do_sync(self, host=None): log.info("Do sync check...") if host is None: if not self.sync_host: state = self.get_sync_host() if not state: log.error("Error: Can not get sync host!") return (-1, -1) host = self.sync_host url = host + '/cgi-bin/mmwebwx-bin/synccheck' headers = { 'Referer': 'https://wx.qq.com/', } params = { 'r': int(time.time()), 'sid': self.sid, 'uin': self.uin, 'skey': self.skey, 'deviceid': self.device_id, 'synckey': self.synckey, '_': int(time.time()), } data = { 'BaseRequest': self.request_parm, } content = url_requests('get', url=url, headers=headers, params=params, data=data, cookies=self.cookies) if not content: log.error("Error: Do sync error.") return (-1, -1) else: resp, cookies = content if cookies and cookies != self.cookies: self.cookies = cookies pm = re.search( r'window.synccheck={retcode:"(\d+)",selector:"(\d+)"}', resp) retcode = pm.group(1) selector = pm.group(2) log.info("Sync check done...") return (retcode, selector)
def send_message(self, message, user): url = self.base_url + '/webwxsendmsg' params = { 'pass_ticket': self.pass_ticket, } msg_id = str(int(time.time() * 10000)) + \ str(random.random())[:5].replace('.', '') params = { 'pass_ticket': self.pass_ticket, } user_id = self.get_user_id(user) if not user_id: log.error("Not found user in contact...") return False data = { 'BaseRequest': self.request_parm, 'Msg': { 'Type': 1, 'Content': self.translate_message(message), 'FromUserName': self.user['UserName'], 'ToUserName': user_id, 'LocalID': msg_id, 'ClientMsgId': msg_id, } } headers = { 'content-type': 'application/json; charset=UTF-8', } resp = url_requests('post', url=url, headers=headers, params=params, data=data, jsonfmt=True) if not resp: log.error("Error: Send message error") return False if resp['BaseResponse']['Ret'] != 0: log.error("Error: Send message error, %s", resp) return False log.info("Send message succeed.") return True
def get_message(self): url = self.base_url + '/webwxsync' params = { 'sid': self.sid, 'skey': self.skey, 'pass_ticket': self.pass_ticket, } data = { 'BaseRequest': self.request_parm, 'SyncKey': self.synckey_dict, 'rr': ~int(time.time()), } resp = url_requests('post', url=url, params=params, data=data, jsonfmt=True) if not resp: log.error("Error: Get message failed!") return None if resp['BaseResponse']['Ret'] == 0: self.synckey_dict = resp['SyncKey'] self.synckey = '|'.join( [str(key_val['Key']) + '_' + str(key_val['Val']) \ for key_val in self.synckey_dict['List']]) return resp['AddMsgList']
def wechat_init(self): if self.status != 'Loged': log.error("Error: Status is %s, expect 'Loged'", self.status) return False log.info("Start init wechat.") self.status = 'Init' resp = url_requests('get', self.redirect_uri, cookies=self.cookies) if not resp: self.status = 'InitError' return False else: resp, cookies = resp if cookies and cookies != self.cookies: self.cookies = cookies doc = minidom.parseString(resp) root = doc.documentElement get_key = ['skey', 'wxsid', 'wxuin', 'pass_ticket'] data = {} for node in root.childNodes: if node.nodeName in get_key: data[node.nodeName] = node.childNodes[0].data if '' in [ value for key, value in data.items()]: log.error("Error: Init response has null value...") self.status = 'InitError' return False self.pass_ticket = data['pass_ticket'] self.skey = data['skey'] self.sid = data['wxsid'] self.uin = data['wxuin'] self.request_parm = { 'Uin': int(data['wxuin']), 'Sid': data['wxsid'], 'Skey': data['skey'], 'DeviceID': self.device_id, } url = self.base_url + '/webwxinit' headers = { 'ContentType': 'application/json; charset=UTF-8', } params = { 'pass_ticket': self.pass_ticket, 'skey': self.skey, 'r': int(time.time()) } data = { 'BaseRequest': self.request_parm, } resp, cookies = url_requests('post', url=url, headers=headers, params=params, cookies = self.cookies, data=data, jsonfmt=True) if not resp: log.error("Error: %s", "Get user information error!") return False if cookies and cookies != self.cookies: self.cookies = cookies self.synckey_dict = resp['SyncKey'] self.user = resp['User'] self.synckey = '|'.join( [str(key_val['Key']) + '_' + str(key_val['Val']) \ for key_val in self.synckey_dict['List']]) self.status = "Inited" log.info("Init wechat succeed!") return resp['BaseResponse']['Ret'] == 0