def waiting_to_login(self, step=1): if step == 1: logger.info('waiting for WeChat to scan two dimensional code login...') else: logger.info('Wait for mobile phone confirmation...') url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&r=%s&_=%s' % ( 0, self.uuid, get_js_r(), get_r()) data = str(get(url)) logger.debug(data) pm = re.search(r'window.code=(\d+);', data) code = pm.group(1) # 如果返回码为201 表示还处于等待扫描状态 if code == '201': return self.waiting_to_login() elif code == '200': pm = re.search(r'window.redirect_uri="(\S+?)";', data) r_uri = pm.group(1) + '&fun=new' self.base_uri = r_uri[:r_uri.rfind('/')] pm = re.search(r'([\S]+)/cgi-bin/', self.base_uri) self.wx_server_domain = pm.group(1) self.file_uri, self.sync_uri = get_wx_uri(self.base_uri) return r_uri elif code == '408': return self.waiting_to_login(step=2) else: # 大概12次超时后,登录异常 400 logger.warning('login error ... %s' % code) return False
def get_contact(login_info): url = login_info[ 'base_uri'] + '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % ( login_info['pass_ticket'], login_info['skey'], get_r()) dic = post(url, {}) if not dic or dic['BaseResponse']['Ret'] != 0: logging.error(dic) return False return dic
def sync_check(self): params = { 'r': get_r(), 'sid': self.sid, 'uin': self.uin, 'skey': self.skey, 'deviceid': self.deviceid, 'synckey': self.synckey, '_': get_r() } url = 'https://' + self.sync_uri + \ '/cgi-bin/mmwebwx-bin/synccheck?' + parse.urlencode(params) data = str(get(url)) logger.debug('get a data : %s:' % data) if data == '': return [-1, -1] pm = re.search(r'window.synccheck={retcode:"(\d+)",selector:"(\d+)"}', data) retcode = pm.group(1) selector = pm.group(2) return [retcode, selector]
def build_qr_code(self): # todo how to send this qr_img to web client is a problem ? if not self.uuid: raise WeChatLoginException('get uuid failed ...') url = 'https://login.weixin.qq.com/qrcode/' + self.uuid str2qr(url) # are you sure to print qrcode ? params = {'t': 'webwx', '_': get_r()} qr_img_data = post(url, params, False) self.qr_fn = '%s-%s.jpg' % (self.uuid, str(time.time())) file = save_file('/tmp', self.qr_fn, qr_img_data) if sys.platform.startswith('win'): os.startfile(file)
def get_uuid(self): url = 'https://login.weixin.qq.com/jslogin' params = { 'appid': self.appid, 'fun': 'new', 'lang': self.lang, '_': get_r(), } data = post(url, params, False).decode() if data == '': return regx = r'window.QRLogin.code = (\d+); window.QRLogin.uuid = "(\S+?)"' pm = re.search(regx, data) if pm and pm.group(1) == '200': return pm.group(2)
def webwxsendmsg(account, content, to='filehelper'): login_info = account['login_info'] url = login_info['base_uri'] + \ '/webwxsendmsg?pass_ticket=%s' % (login_info['pass_ticket']) msgid = get_r() params = { 'BaseRequest': get_base_request(**login_info), 'Msg': { "Type": 1, "Content": content, "FromUserName": account['account_id'], "ToUserName": to, "LocalID": msgid, "ClientMsgId": msgid } } # print(params) headers = {'content-type': 'application/json; charset=UTF-8'} data = json.dumps(params, ensure_ascii=False).encode('utf8') r = requests.post(url, data=data, headers=headers, verify=False) return r.json()
def batch_get_contacts(login_info, group_ids, encry_chatroom_id=""): if not group_ids: return [] url = login_info['base_uri'] + \ '/webwxbatchgetcontact?type=ex&r=%s&pass_ticket=%s' % ( get_r(), login_info['pass_ticket']) params = { 'BaseRequest': get_base_request(**login_info), "Count": len(group_ids), "List": [{ "UserName": group_id, "EncryChatRoomId": encry_chatroom_id } for group_id in group_ids] } dic = post(url, params) if not dic or dic['BaseResponse']['Ret'] != 0: logging.error(dic) return False return dic['ContactList']