Example #1
0
    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
Example #2
0
    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
Example #3
0
    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
Example #4
0
    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
Example #5
0
    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
Example #6
0
 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()
Example #7
0
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)
Example #8
0
    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()
Example #9
0
    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
Example #10
0
    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
Example #11
0
    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
Example #12
0
    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 
Example #13
0
    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)
Example #14
0
    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
Example #15
0
    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