コード例 #1
0
ファイル: wechat.py プロジェクト: fengyunxiren/chatbot
 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
コード例 #2
0
ファイル: wechat.py プロジェクト: fengyunxiren/chatbot
 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
コード例 #3
0
ファイル: wechat.py プロジェクト: fengyunxiren/chatbot
 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
コード例 #4
0
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)
コード例 #5
0
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')
コード例 #6
0
ファイル: wechat.py プロジェクト: fengyunxiren/chatbot
 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
コード例 #7
0
ファイル: wechat.py プロジェクト: fengyunxiren/chatbot
    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)
コード例 #8
0
ファイル: wechat.py プロジェクト: fengyunxiren/chatbot
    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
コード例 #9
0
ファイル: wechat.py プロジェクト: fengyunxiren/chatbot
 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']
コード例 #10
0
ファイル: wechat.py プロジェクト: fengyunxiren/chatbot
 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