def _check_confirm(self): ''' 判断是否微信用户在手机上是否点击确认,并返回一个状态吗,类似与http响应码 ''' url = self.base_url + '/cgi-bin/mmwebwx-bin/login' local_timestamp = int(time.time() * 1000) params = 'loginicon=true&uuid=%s&tip=0&r=%s&_=%s' % (self.uuid, -int(local_timestamp / 966), local_timestamp) open_url = Request_Url(url, params=params, **self.web_request_base_dict) self.web_request_base_dict = open_url.return_web_request_base_dict() url_context = open_url.return_context() regx = r'window.code=(\d+)' data = re.search(regx, url_context.text) if data and data.group(1) == '200': regx = r'window.redirect_uri="(\S+)";' self.redirect_uri = re.search(regx, url_context.text).group(1) # 登陆成功之后,获取用户信息页面 return 200 # 200确认按钮点击成功 elif data and data.group(1) == '201': return 201 # 201 手机扫描识别成功 else: try : return int(data.group(1)) except : return 500
def __init__(self , session_info_dict={}): self.os_type = wechat.os_type self.base_url = wechat.base_url self.qr_dir = wechat.qr_dir self.appid = wechat.appid self.session_info_dict = session_info_dict self.uuid = self.session_info_dict['uuid'] self.status = self.session_info_dict['status'] self.web_request_base_dict = self.session_info_dict['web_request_base_dict'] if (self.uuid == '' or not self.uuid) or (not self.web_request_base_dict or self.web_request_base_dict == {}): web_request_base_dict = {} open_url = Request_Url(self.base_url, **web_request_base_dict) self.web_request_base_dict = open_url.return_web_request_base_dict() # 初始化self.web_request_base_dict,如果uuid和web_request_base_dict不为空说明已经初始化 if self.uuid == '' or not self.uuid : self.uuid = self._get_qruuid() self.status = 100 else : self.status = 100 self.redirect_uri = False self.enablecmdqr = 1
def get_qr(self): ''' 根据uuid获取二维码 ''' url = '%s/qrcode/%s' % (self.base_url, self.uuid) try: open_url = Request_Url(url, **self.web_request_base_dict) self.web_request_base_dict = open_url.return_web_request_base_dict() url_req = open_url.return_context() except: return False picdir = self.qr_dir + '/' + self.uuid + '.jpg' if os.path.exists(self.qr_dir) : if not os.path.isdir(self.qr_dir) : os.rename(self.qr_dir, self.qr_dir + '-' + str(int(time.time)) + '-lykchat-bk') os.mkdir(self.qr_dir) else : os.mkdir(self.qr_dir) with open(picdir, 'wb') as f: f.write(url_req.content) self.session_info_dict['uuid'] = self.uuid self.session_info_dict['status'] = 202 self.session_info_dict['web_request_base_dict'] = self.web_request_base_dict self.session_info_dict['qr_stamptime'] = int(time.time()) self.session_info_dict['qr_url'] = picdir.replace(BASE_DIR, '') return self.session_info_dict
def receive(self): ''' 接受信息 ''' msg_no = self._check_newmsg() msg_no = str(msg_no) if msg_no == '0' : print('没有新的消息') return [] url = '%s/webwxsync?sid=%s&skey=%s&pass_ticket=%s' % (self.base_url, self.sid, self.skey, self.pass_ticket) data = { 'BaseRequest' : self.base_request, 'SyncKey' : self.SyncKey, 'rr' :~int(time.time()), } open_url = Request_Url(url, data=json.dumps(data) , **self.web_request_base_dict) self.web_request_base_dict = self.session_info_dict['web_request_base_dict'] = open_url.return_web_request_base_dict() url_req = open_url.return_context() newmessage_dict = json.loads(url_req.content.decode('utf-8', 'replace')) # 这里可以获取新信息 self.login_info['SyncKey'] = newmessage_dict['SyncCheckKey'] # 接收之后,会导致信息被确认查收 self.login_info['synckey'] = '' for temp_dict in self.login_info['SyncKey']['List'] : temp = str(temp_dict['Key']) + '_' + str(temp_dict['Val']) if self.login_info['synckey'] == '' : self.login_info['synckey'] = temp else : self.login_info['synckey'] = self.login_info['synckey'] + '|' + temp self.message_list = newmessage_dict['AddMsgList'] return self.message_list
def get_group_contact(self, group_username, username='', username_list=[]): ''' 根据群的username和成员的username,获得成员信息 ''' url = '%s/webwxbatchgetcontact?type=ex&r=%s&lang=zh_CN&pass_ticket=%s' % ( self.base_url, int(time.time() * 1000), self.pass_ticket) post_list = [] if group_username == '' or not group_username or not re.search( '@@', group_username): return {} if username_list != []: for username in username_list: temp = { "UserName": username, "EncryChatRoomId": group_username } post_list.append(temp) list_count = len(username_list) else: if username and re.search('@', username): temp = { "UserName": username, "EncryChatRoomId": group_username } post_list.append(temp) list_count = 1 else: return {} data = { 'BaseRequest': self.base_request, 'List': post_list, 'Count': list_count, } open_url = Request_Url(url, data=json.dumps(data), **self.web_request_base_dict) self.web_request_base_dict = self.session_info_dict[ 'web_request_base_dict'] = open_url.return_web_request_base_dict() url_req = open_url.return_context() web_dict = json.loads(url_req.content.decode('utf-8', 'replace')) contact_list = web_dict['ContactList'] group_contact_dict = {} for contact in contact_list: group_contact_dict[username] = { 'UserName': username, 'Alias': contact['Alias'], 'NickName': contact['NickName'], 'Sex': contact['Sex'] } # 更新好友列表 self._update_friend(group_contact_dict[username]) return group_contact_dict
def logout(self): ''' 退出登录 ''' url = '%s/webwxlogout?redirect=1&type=0&skey=%s&sid=%s&uin=%s' % (self.base_url, self.skey, self.sid , self.uin) data = { 'sid' : self.sid, 'uin' : self.uin, } data = json.dumps(data) open_url = Request_Url(url, data=data , **self.web_request_base_dict) open_url.return_context()
def check_login(): op_info = Manage_Logininfo() all_session_dict = op_info.get_history_all() for username in all_session_dict: password = user_mess_dict[username]['interface_pwd'] data = {'username': username, 'password': password} data = json.dumps(data) url = url_frond + 'check_login?username='******'&pwd=' + password open_url = Request_Url(url) url_req = open_url.return_context() print(url_req.text)
def status_notify(self): ''' 用于告知微信手机端登录状态 ''' self.myself = self.session_info_dict['myself'] url = '%s/webwxstatusnotify?lang=zh_CN&pass_ticket=%s' % ( self.base_url, self.pass_ticket) data = { 'BaseRequest': self.base_request, "Code": 3, "FromUserName": self.myself['UserName'], "ToUserName": self.myself['UserName'], "ClientMsgId": int(time.time() * 1000 * 1000 * 10), } data = json.dumps(data) open_url = Request_Url(url, data=data, **self.web_request_base_dict) self.web_request_base_dict = self.session_info_dict[ 'web_request_base_dict'] = open_url.return_web_request_base_dict()
def send(self, content, msgType='Test Message', tousername='******', post_field='UserName'): ''' 发送信息,返回类型为字典 ''' get_friend = Get_Friend(self.session_info_dict) friend_dict = get_friend.get_singlefriend_dict(tousername, post_field=post_field) try: tousername = friend_dict['UserName'] except: tousername = '' if not re.search('@', tousername) and tousername != 'filehelper': return {'Msg': '发送失败,账号设置错误', 'Code': -1102, 'ErrMsg': '无法找到好友'} url = '%s/webwxsendmsg' % self.base_url payloads = { 'BaseRequest': self.base_request, 'Msg': { 'Type': msgType, 'Content': content, 'FromUserName': self.myself['UserName'], 'ToUserName': tousername, 'LocalID': self.msgid, 'ClientMsgId': self.msgid, }, 'Scene': 0 } self.login_info['msgid'] += 1 data = json.dumps(payloads, ensure_ascii=False).encode('utf8') open_url = Request_Url(url, data=data, **self.web_request_base_dict) self.web_request_base_dict = open_url.return_web_request_base_dict() url_req = open_url.return_context() result_dict = self._send_result(url_req) return result_dict
def get_friend_list(self): ''' 获得所有好友信息,返回好友清单 格式如下: { 'UserName':['@aafadfd','@bbbbbb',....], 'NickName':['lykops','ops',....] 'Alias':['lykops','ops',....] 'Sex':[1,2,...] } ''' url = '%s/webwxgetcontact?r=%s&seq=0&skey=%s' % ( self.base_url, int(time.time() * 1000), self.skey) open_url = Request_Url(url, **self.web_request_base_dict) self.web_request_base_dict = self.session_info_dict[ 'web_request_base_dict'] = open_url.return_web_request_base_dict() url_req = open_url.return_context() member_list = json.loads(url_req.content.decode( 'utf-8', 'replace'))['MemberList'] ''' [{'RemarkPYQuanPin': '', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=645115088&username=@4f9f900c9207f0d6d1e104ed99561de1&skey=@crypt_2b05caf0_8cef13f418418c2333f2cb1a3b3172e1', 'AppAccountFlag': 0, 'Statues': 0, 'SnsFlag': 0, 'AttrStatus': 0, 'PYQuanPin': 'gaoxiaokaifayunwei', 'City': 'Chaoyang', 'HideInputBarFlag': 0, 'ContactFlag': 3, 'Uin': 0, 'Sex': 0, 'PYInitial': 'GXKFYW', 'OwnerUin': 0, 'RemarkName': '', 'Alias': 'DevOpsGeek', 'Signature': 'InfoQ。~', 'KeyWord': 'gh_', 'RemarkPYInitial': '', 'UniFriend': 0, 'UserName': '******', 'ChatRoomId': 0, 'MemberCount': 0, 'Province': 'Beijing', 'DisplayName': '', 'NickName': '高效开发运维', 'VerifyFlag': 24, 'EncryChatRoomId': '', 'StarFriend': 0, 'MemberList': []}] sex: 1为男 2为女 0为其他 ''' for field in self.field_list: self.friend_list[field] = [] # 需要清空,否则在web页面上登陆后,不更新程序时,出现旧数据不会并删除 for friend_message in member_list: self._update_friend(friend_message) self._update_myself() # 更新个人信息 self.session_info_dict['friend_list'] = self.friend_list return self.session_info_dict
def webwxsync(self): ''' 获取所有的好友的UserName,用于获取群信息 ''' self.base_url = self.login_info['url'] self.base_request = self.login_info['BaseRequest'] self.pass_ticket = self.login_info['pass_ticket'] self.skey = self.login_info['skey'] self.sid = self.login_info['wxsid'] url = '%s/webwxsync?sid=%s&skey=%s' % (self.base_url, self.sid, self.skey) data = { 'BaseRequest': self.base_request, 'SyncKey': self.login_info['SyncKey'], 'rr': ~int(time.time()) } data = json.dumps(data) open_url = Request_Url(url, data=data, **self.web_request_base_dict) url_req = open_url.return_context() self.web_request_base_dict = self.session_info_dict[ 'web_request_base_dict'] = open_url.return_web_request_base_dict() web_dict = url_req.content.decode('utf-8', 'replace') web_dict = json.loads(web_dict) try: frienduser = web_dict['AddMsgList'][0]['StatusNotifyUserName'] # 注意:不是每次执行会出现这个结果的,大概1%的概率 frienduser_list = re.split(',', frienduser) except: frienduser_list = [] groupuser_list = [] for frienduser in frienduser_list: if re.search('@@', frienduser): groupuser_list.append(frienduser) self.session_info_dict['groupuser_list'] = groupuser_list self.session_info_dict['frienduser_list'] = frienduser_list return self.session_info_dict
def _get_qruuid(self): ''' 获取登陆时二维码uuid ''' url = self.base_url + '/jslogin' local_timestamp = int(time.time()*1000) params = { 'appid' :self.appid, 'fun' : 'new', 'lang' : 'zh_CN', 'redirect_uri' : self.base_url + '/cgi-bin/mmwebwx-bin/webwxnewloginpage' , '_' : local_timestamp } open_url = Request_Url(url, params=params, **self.web_request_base_dict) self.web_request_base_dict = open_url.return_web_request_base_dict() url_req = open_url.return_context() regx = r'window.QRLogin.code = (\d+); window.QRLogin.uuid = "(\S+?)";' data = re.search(regx, url_req.text) if data and data.group(1) == '200': return data.group(2) else : return
def _check_newmsg(self): ''' 用于获取最新接受信息数 ''' url = '%s/synccheck' % self.sync_url local_ts = int(time.time() * 1000) params = { 'r' : local_ts, 'skey' : self.skey, 'sid' : self.sid, 'uin' : self.uin, 'deviceid' : self.deviceid, 'synckey' : self.synckey, '_' : local_ts, } open_url = Request_Url(url, params=params , **self.web_request_base_dict) self.web_request_base_dict = self.session_info_dict['web_request_base_dict'] = open_url.return_web_request_base_dict() url_req = open_url.return_context() regx = r'window.synccheck={retcode:"(\d+)",selector:"(\d+)"}' pm = re.search(regx, url_req.text) ''' retcode: 0 正常 1100 失败/登出微信 selector: 0 正常 2 新的消息 7 进入/离开聊天界面 ''' if pm is None or pm.group(1) != '0': return 0 return pm.group(2)
def check_login(self): ''' 获得微信号登陆信息,可检测是否保持登陆成功 ''' self.base_url = self.login_info['url'] self.base_request = self.login_info['BaseRequest'] self.pass_ticket = self.login_info['pass_ticket'] self.skey = self.login_info['skey'] url = '%s/webwxinit?r=%s&pass_ticket=%s&skey=%s' % ( self.base_url, ~int(time.time()), self.pass_ticket, self.skey) data = {'BaseRequest': self.base_request} data = json.dumps(data) open_url = Request_Url(url, data=data, **self.web_request_base_dict) self.web_request_base_dict = self.session_info_dict[ 'web_request_base_dict'] = open_url.return_web_request_base_dict() url_req = open_url.return_context() web_dict = json.loads(url_req.content.decode('utf-8', 'replace')) status = web_dict['BaseResponse']['Ret'] if status == 0: status = 222 elif status == 1101: status = 402 elif status == 1205: status = 404 else: status = 401 if status >= 300: self.session_info_dict['status'] = status return self.session_info_dict self.myself = {} for key, value in web_dict.items(): if key == 'User': # 微信号信息 for field in self.field_list: try: self.myself[field] = value[field] except: self.myself[field] = '' if key == 'SyncKey': self.login_info[key] = web_dict[key] try: if self.session_info_dict['myself']['Alias'] == '': self.session_info_dict['myself'] = self.myself except: self.session_info_dict['myself'] = self.myself self.login_info['InviteStartCount'] = int(web_dict['InviteStartCount']) self.login_info['synckey'] = '' for temp_dict in self.login_info['SyncKey']['List']: temp = str(temp_dict['Key']) + '_' + str(temp_dict['Val']) if self.login_info['synckey'] == '': self.login_info['synckey'] = temp else: self.login_info[ 'synckey'] = self.login_info['synckey'] + '|' + temp firstpage_contactlist = [] for contact in web_dict['ContactList']: contact_list = {} for field in self.field_list: contact_list[field] = contact[field] firstpage_contactlist.append(contact_list) self.session_info_dict['firstpage_contactlist'] = firstpage_contactlist # 第一页好友列表 self.session_info_dict['login_info'] = self.login_info self.session_info_dict['status'] = status groupuser_list = self.session_info_dict['groupuser_list'] frienduser_list = self.session_info_dict['frienduser_list'] if (frienduser_list == [] or not frienduser_list) and (groupuser_list == [] or not groupuser_list): self.webwxsync() return self.session_info_dict
def init_login(self): ''' 扫码、点击确认之后的第一步 ''' if (self.redirect_uri == '' or not self.redirect_uri) and (self.login_info == {} or not self.login_info): self.session_info_dict['status'] = 100 return self.session_info_dict open_url = Request_Url(self.redirect_uri, allow_redirects=False, **self.web_request_base_dict) self.web_request_base_dict = self.session_info_dict[ 'web_request_base_dict'] = open_url.return_web_request_base_dict() url_req = open_url.return_context() self.login_info['url'] = self.redirect_uri[:self.redirect_uri.rfind('/' )] domain = re.split('\/', self.redirect_uri)[2] self.login_info['file_url'], self.login_info['sync_url'] = [ 'https://%s/cgi-bin/mmwebwx-bin' % (url + '.' + domain) for url in ("file", "webpush") ] self.login_info['deviceid'] = 'e' + repr(random.random())[2:17] self.login_info['msgid'] = int(time.time() * 1000 * 1000 * 10) self.login_info['BaseRequest'] = {} for node in xml.dom.minidom.parseString( url_req.text).documentElement.childNodes: if node.nodeName == 'skey': self.login_info['skey'] = self.login_info['BaseRequest'][ 'Skey'] = node.childNodes[0].data elif node.nodeName == 'wxsid': self.login_info['wxsid'] = self.login_info['BaseRequest'][ 'Sid'] = node.childNodes[0].data elif node.nodeName == 'wxuin': self.login_info['wxuin'] = self.login_info['BaseRequest'][ 'Uin'] = node.childNodes[0].data elif node.nodeName == 'pass_ticket': self.login_info['pass_ticket'] = self.login_info[ 'BaseRequest']['DeviceID'] = node.childNodes[0].data elif node.nodeName == 'ret': self.login_info['ret'] = node.childNodes[0].data elif node.nodeName == 'message': try: self.login_info['message'] = node.childNodes[0].data except: self.login_info['message'] = '' elif node.nodeName == 'isgrayscale': self.login_info['isgrayscale'] = node.childNodes[0].data if self.login_info['BaseRequest'] == {}: self.status = 500 self.session_info_dict['status'] = self.status self.session_info_dict['login_info'] = self.login_info ''' if self.login_info['ret'] == '1203' : print(" 你的微信可能被封,请更换微信登陆或者过几小时再试") ''' return self.session_info_dict else: self.session_info_dict['status'] = 221 self.session_info_dict['login_info'] = self.login_info return self.session_info_dict