예제 #1
0
    def get_group_list_with_group_id(self):
        """
        获取包含群名和群号的列表, 并存入cache, 其中gc为群号
        :type group_id: str
        :return:list

        return list sample
        [
            {
                "gc": 114302207,
                "gn": "测试群1",
                "owner": 484216451
            },
            {
                "gc": 125299202,
                "gn": "测试群2",
                "owner": 242917661
            }
        ]
        """
        try_times = 0
        while try_times < 3:

            if self._get_group_list:
                response = self._get_group_list
            else:
                url = "http://qun.qq.com/cgi-bin/qun_mgr/get_group_list"
                data = {'bkn': self.bkn}
                try:
                    response = self.client.post(url, data=data, refer='http://qun.qq.com/member.html')
                    response = unescape_json_response(response)
                    self._get_group_list = response
                    logger.debug("get_group_list response: {}".format(response))
                except Exception as e:
                    logger.debug(str(e))
                    logger.warning("get_group_list_with_group_id API请求失败")
                    try_times += 1
                    continue

            try:
                rsp_json = json.loads(response)
            except ValueError:
                try_times += 1
                logger.warning("get_group_list_with_group_id fail. {}".format(try_times))
                continue
            if rsp_json.get('ec') == 0:
                group_id_list = list()
                group_id_list.extend(rsp_json.get('join') or [])
                group_id_list.extend(rsp_json.get('manage') or [])
                group_id_list.extend(rsp_json.get('create') or [])
                if group_id_list:
                    for group in group_id_list:
                        self.group_id_list[str(group['gc'])] = group
                    return group_id_list
                else:
                    logger.warning("seems this account didn't join any group: {}".format(response))
                    return []
            else:
                logger.warning("get_group_list code unknown: {}".format(response))
                return None
예제 #2
0
파일: bot.py 프로젝트: sometumi/SmartQQBot
    def get_online_buddies2(self):
        """
        获取在线好友列表
        get_online_buddies2
        :return:list
        """
        try:
            logger.info("RUNTIMELOG Requesting the online buddies.")
            online_buddies = json.loads(self.client.get(
                    'http://d1.web2.qq.com/channel/get_online_buddies2?vfwebqq={0}&clientid={1}&psessionid={2}&t={3}'
                        .format(
                            self.vfwebqq,
                            self.client_id,
                            self.psessionid,
                            self.client.get_timestamp()),
            ))
            logger.debug("RESPONSE get_online_buddies2 html:    " + str(online_buddies))
            if online_buddies['retcode'] != 0:
                raise TypeError('get_online_buddies2 result error')
            online_buddies = online_buddies['result']
            return online_buddies

        except:
            logger.warning("RUNTIMELOG get_online_buddies2 fail")
            return None
예제 #3
0
파일: bot.py 프로젝트: Akizukii/SmartQQBot
    def get_friend_info(self, tuin):
        """
        获取好友详情信息
        get_friend_info
        {"retcode":0,"result":{"face":0,"birthday":{"month":1,"year":1989,"day":30},"occupation":"","phone":"","allow":1,"college":"","uin":3964575484,"constel":1,"blood":3,"homepage":"http://blog.lovewinne.com","stat":20,"vip_info":0,"country":"中国","city":"","personal":"","nick":" 信","shengxiao":5,"email":"*****@*****.**","province":"山东","gender":"male","mobile":"158********"}}
        :return:dict
        """

        uin = str(tuin)
        if uin not in self.friend_uin_list:
            logger.info("RUNTIMELOG Requesting the account info by uin: {}".format(uin))
            info = json.loads(self.client.get(
                'http://s.web2.qq.com/api/get_friend_info2?tuin={0}&vfwebqq={1}&clientid={2}&psessionid={3}&t={4}'.format(
                    uin,
                    self.vfwebqq,
                    self.client_id,
                    self.psessionid,
                    self.client.get_timestamp()
                )
            ))
            logger.debug("get_friend_info2 html: {}".format(str(info)))
            if info['retcode'] != 0:
                logger.warning('get_friend_info2 retcode unknown: {}'.format(info))
                return None
            info = info['result']
            info['account'] = self.uin_to_account(uin)
            info['longnick'] = self.get_friend_longnick(uin)
            self.friend_uin_list[uin] = info

        try:
            return self.friend_uin_list[uin]
        except:
            logger.warning("RUNTIMELOG get_friend_info return fail.")
            logger.debug("RUNTIMELOG now uin list:    " + str(self.friend_uin_list[uin]))
예제 #4
0
파일: bot.py 프로젝트: Akizukii/SmartQQBot
    def get_online_friends_list(self):
        """
        获取在线好友列表
        get_online_buddies2
        :return:list
        """
        logger.info("RUNTIMELOG Requesting the online buddies.")
        response = self.client.get(
            'http://d1.web2.qq.com/channel/get_online_buddies2?vfwebqq={0}&clientid={1}&psessionid={2}&t={3}'.format(
                self.vfwebqq,
                self.client_id,
                self.psessionid,
                self.client.get_timestamp(),
            )
        )  # {"result":[],"retcode":0}
        logger.debug("RESPONSE get_online_buddies2 html:{}".format(response))
        try:
            online_buddies = json.loads(response)
        except ValueError:
            logger.warning("get_online_buddies2 response decode as json fail.")
            return None

        if online_buddies['retcode'] != 0:
            logger.warning('get_online_buddies2 retcode is not 0. returning.')
            return None

        online_buddies = online_buddies['result']
        return online_buddies
예제 #5
0
    def get_group_name_list_mask2(self):
        """
        获取群列表
        get_group_name_list_mask2
        {u'gmarklist': [], u'gmasklist': [], u'gnamelist': [{u'code': 2676518731, u'flag': 1090520065, u'gid': 222968641(这是group_uin), u'name': u'测试'}]}
        :return:dict
        """
        logger.info("RUNTIMELOG Requesting the group list.")

        response = self.client.post(
            'http://s.web2.qq.com/api/get_group_name_list_mask2',
            {
                'r': json.dumps(
                    {
                        "vfwebqq": self.vfwebqq,
                        "hash": self._hash_digest(self._self_info['uin'], self.ptwebqq),
                    }
                )
            },
        )
        try:
            response = json.loads(response)
        except ValueError:
            logger.warning("RUNTIMELOG The response of group list request can't be load as json")
        logger.debug("RESPONSE get_group_name_list_mask2 html:    " + str(response))
        if response['retcode'] != 0:
            raise TypeError('get_online_buddies2 result error')
        return response['result']
예제 #6
0
파일: bot.py 프로젝트: Akizukii/SmartQQBot
 def get_group_member_info_list(self, group_code):
     """
     获取指定群的成员信息
     :group_code: int, can be "ture" of "fake" group_code
     {"retcode":0,"result":{"stats":[],"minfo":[{"nick":" 信","province":"山东","gender":"male","uin":3964575484,"country":"中国","city":""},{"nick":"崔震","province":"","gender":"unknown","uin":2081397472,"country":"","city":""},{"nick":"云端的猫","province":"山东","gender":"male","uin":3123065696,"country":"中国","city":"青岛"},{"nick":"要有光","province":"山东","gender":"male","uin":2609717081,"country":"中国","city":"青岛"},{"nick":"小莎机器人","province":"广东","gender":"female","uin":495456232,"country":"中国","city":"深圳"}],"ginfo":{"face":0,"memo":"http://hujj009.ys168.com\r\n0086+区(没0)+电话\r\n0086+手机\r\nhttp://john123951.xinwen365.net/qq/index.htm","class":395,"fingermemo":"","code":3943922314,"createtime":1079268574,"flag":16778241,"level":0,"name":"ぁQQぁ","gid":3931577475,"owner":3964575484,"members":[{"muin":3964575484,"mflag":192},{"muin":2081397472,"mflag":65},{"muin":3123065696,"mflag":128},{"muin":2609717081,"mflag":0},{"muin":495456232,"mflag":0}],"option":2},"cards":[{"muin":3964575484,"card":"●s.Εx2(22222)□"},{"muin":495456232,"card":"小莎机器人"}],"vipinfo":[{"vip_level":0,"u":3964575484,"is_vip":0},{"vip_level":0,"u":2081397472,"is_vip":0},{"vip_level":0,"u":3123065696,"is_vip":0},{"vip_level":0,"u":2609717081,"is_vip":0},{"vip_level":0,"u":495456232,"is_vip":0}]}}
     :return:dict
     """
     if group_code == 0:
         return
     try:
         url = "http://s.web2.qq.com/api/get_group_info_ext2?gcode=%s&vfwebqq=%s&t=%s" % (
             group_code, self.vfwebqq, int(time.time() * 100))
         response = self.client.get(url)
         rsp_json = json.loads(response)
         logger.debug("get_group_member_info_list info response: {}".format(rsp_json))
         retcode = rsp_json["retcode"]
         if retcode == 0:
             result = rsp_json["result"]
         elif retcode == 6:
             logger.debug("get_group_member_info_list retcode is 6, trying to get true code.")
             result = self.get_group_member_info_list(self.get_true_group_code(group_code))
         else:
             logger.warning("group_code error.")
             return
         self.group_member_info[str(group_code)] = result    # 缓存群成员信息, 此处会把真假group_code都加入cache
         return result
     except Exception as ex:
         logger.warning("RUNTIMELOG get_group_member_info_list. Error: " + str(ex))
         return
예제 #7
0
파일: bot.py 프로젝트: Akizukii/SmartQQBot
 def send_group_msg(self, reply_content, group_code, msg_id, fail_times=0):
     fix_content = str(reply_content.replace("\\", "\\\\\\\\").replace("\n", "\\\\n").replace("\t", "\\\\t"))
     rsp = ""
     try:
         logger.info("Starting send group message: %s" % reply_content)
         req_url = "http://d1.web2.qq.com/channel/send_qun_msg2"
         data = (
             ('r',
              '{{"group_uin":{0}, "face":564,"content":"[\\"{4}\\",[\\"font\\",{{\\"name\\":\\"Arial\\",\\"size\\":\\"10\\",\\"style\\":[0,0,0],\\"color\\":\\"000000\\"}}]]","clientid":{1},"msg_id":{2},"psessionid":"{3}"}}'.format(
                      group_code, self.client_id, msg_id, self.psessionid, fix_content)),
             ('clientid', self.client_id),
             ('psessionid', self.psessionid)
         )
         rsp = self.client.post(req_url, data, SMART_QQ_REFER)
         rsp_json = json.loads(rsp)
         if 'retcode' in rsp_json and rsp_json['retcode'] not in MESSAGE_SENT:
             raise ValueError("RUNTIMELOG reply group chat error" + str(rsp_json['retcode']))
         logger.info("RUNTIMELOG send_qun_msg: Reply '{}' successfully.".format(reply_content))
         logger.debug("RESPONSE send_qun_msg: Reply response: " + str(rsp))
         return rsp_json
     except:
         logger.warning("RUNTIMELOG send_qun_msg fail")
         if fail_times < 5:
             logger.warning("RUNTIMELOG send_qun_msg: Response Error.Wait for 2s and Retrying." + str(fail_times))
             logger.debug("RESPONSE send_qun_msg rsp:" + str(rsp))
             time.sleep(2)
             self.send_group_msg(reply_content, group_code, msg_id, fail_times + 1)
         else:
             logger.warning("RUNTIMELOG send_qun_msg: Response Error over 5 times.Exit.reply content:" + str(reply_content))
             return False
예제 #8
0
파일: bot.py 프로젝트: sometumi/SmartQQBot
    def get_group_name_list_mask2(self):
        """
        获取群列表
        get_group_name_list_mask2
        :return:list
        """
        logger.info("RUNTIMELOG Requesting the group list.")

        response = self.client.post(
            'http://s.web2.qq.com/api/get_group_name_list_mask2',
            {
                'r': json.dumps(
                    {
                        "vfwebqq": self.vfwebqq,
                        "hash": self._hash_digest(self._self_info['uin'], self.ptwebqq),
                    }
                )
            },
        )
        try:
            response = json.loads(response)
        except ValueError:
            logger.warning("RUNTIMELOG The response of group list request can't be load as json")
            return
        logger.debug("RESPONSE get_group_name_list_mask2 html:    " + str(response))
        if response['retcode'] != 0:
            raise TypeError('get_online_buddies2 result error')
        return response['result']
예제 #9
0
파일: bot.py 프로젝트: Akizukii/SmartQQBot
    def uin_to_account(self, tuin):
        """
        将uin转换成用户QQ号
        :param tuin:
        :return:str 用户QQ号
        """
        uin_str = str(tuin)
        try:
            logger.info("RUNTIMELOG Requesting the account by uin:    " + str(tuin))
            info = json.loads(
                self.client.get(
                    'http://s.web2.qq.com/api/get_friend_uin2?tuin={0}&type=1&vfwebqq={1}&t={2}'.format(
                        uin_str,
                        self.vfwebqq,
                        self.client.get_timestamp()
                    ),
                    SMART_QQ_REFER
                )
            )
            logger.debug("RESPONSE uin_to_account html:    " + str(info))
            if info['retcode'] != 0:
                raise TypeError('uin_to_account retcode error')
            info = info['result']['account']
            return info

        except Exception:
            logger.exception("RUNTIMELOG uin_to_account fail")
            return None
예제 #10
0
    def uin_to_account(self, tuin):
        """
        将uin转换成用户QQ号
        :param tuin:
        :return:str 用户QQ号
        """
        uin_str = str(tuin)
        try:
            logger.info("RUNTIMELOG Requesting the account by uin:    " + str(tuin))
            info = json.loads(
                self.client.get(
                    'http://s.web2.qq.com/api/get_friend_uin2?tuin={0}&type=1&vfwebqq={1}&t={2}'.format(
                        uin_str,
                        self.vfwebqq,
                        self.client.get_timestamp()
                    ),
                    SMART_QQ_REFER
                )
            )
            logger.debug("RESPONSE uin_to_account html:    " + str(info))
            if info['retcode'] != 0:
                raise TypeError('uin_to_account retcode error')
            info = info['result']['account']
            return info

        except Exception:
            logger.exception("RUNTIMELOG uin_to_account fail")
            return None
예제 #11
0
파일: bot.py 프로젝트: Akizukii/SmartQQBot
 def send_friend_msg(self, reply_content, uin, msg_id, fail_times=0):
     fix_content = str(reply_content.replace("\\", "\\\\\\\\").replace("\n", "\\\\n").replace("\t", "\\\\t"))
     rsp = ""
     try:
         req_url = "http://d1.web2.qq.com/channel/send_buddy_msg2"
         data = (
             ('r',
              '{{"to":{0}, "face":594, "content":"[\\"{4}\\", [\\"font\\", {{\\"name\\":\\"Arial\\", \\"size\\":\\"10\\", \\"style\\":[0, 0, 0], \\"color\\":\\"000000\\"}}]]", "clientid":{1}, "msg_id":{2}, "psessionid":"{3}"}}'.format(
                      uin, self.client_id, msg_id, self.psessionid, fix_content)),
             ('clientid', self.client_id),
             ('psessionid', self.psessionid)
         )
         rsp = self.client.post(req_url, data, SMART_QQ_REFER)
         rsp_json = json.loads(rsp)
         if 'errCode' in rsp_json and rsp_json['errCode'] != 0:
             raise ValueError("reply pmchat error" + str(rsp_json['retcode']))
         logger.info("RUNTIMELOG Reply successfully.")
         logger.debug("RESPONSE Reply response: " + str(rsp))
         return rsp_json
     except:
         if fail_times < 5:
             logger.warning("RUNTIMELOG Response Error.Wait for 2s and Retrying." + str(fail_times))
             logger.debug("RESPONSE " + str(rsp))
             time.sleep(2)
             self.send_friend_msg(reply_content, uin, msg_id, fail_times + 1)
         else:
             logger.warning("RUNTIMELOG Response Error over 5 times.Exit.reply content:" + str(reply_content))
             return False
예제 #12
0
def lady(msg, bot):
    """
    :type bot: smart_qq_bot.bot.QQBot
    :type msg: smart_qq_bot.messages.GroupMsg
    """
    msg_id = randint(1, 10000)

    global _ladyWrapper

    logger.debug('sender:{0} QQ Number:{1}'.format(msg.src_sender_name,
                                                   msg.src_sender_id))
    logger.info(_ladyWrapper.GroupMap)
    # 发送一条群消息
    if isinstance(msg, GroupMsg):
        now = time.mktime(datetime.datetime.now().timetuple())

        if msg.src_sender_id == _ladyWrapper.observe_target:
            if msg.src_group_id in _ladyWrapper.GroupMap:
                if now > _ladyWrapper.GroupMap[
                        msg.src_group_id] + _ladyWrapper.interval:
                    _ladyWrapper.GroupMap[msg.src_group_id] = now
                    bot.send_group_msg("少妇肛肛", msg.from_uin, msg_id)
                else:
                    logger.info("too frequent... Can't reply until {0}".format(
                        _ladyWrapper.GroupMap[msg.src_group_id] +
                        _ladyWrapper.interval))
            else:
                bot.send_group_msg("少妇肛肛", msg.from_uin, msg_id)
                _ladyWrapper.GroupMap[msg.src_group_id] = now
예제 #13
0
파일: bot.py 프로젝트: SKnife/SmartQQBot
 def get_discuss_info(self, did):
     """
     获取指定讨论组的成员信息
     :did: str
     {u'result': {u'info': {u'did': 2966596468, u'discu_name': u'', u'mem_list': [{u'ruin': 466331599, u'mem_uin': 466331599}, {u'ruin': 493658515, u'mem_uin': 556813270}, {u'ruin': 824566900, u'mem_uin': 2606746705}]}, u'mem_status': [], u'mem_info': [{u'nick': u'\\u54a6', u'uin': 466331599}, {u'nick': u'Auro', u'uin': 556813270}, {u'nick': u'-', u'uin': 2606746705}]}, u'retcode': 0}
     :rtype: dict
     """
     if did == 0:
         return
     try:
         did = str(did)
         url = "http://d1.web2.qq.com/channel/get_discu_info?did={did}&psessionid={psessionid}&vfwebqq={vfwebqq}&clientid={clientid}&t={t}".format(
             did=did, psessionid=self.psessionid, vfwebqq=self.vfwebqq, clientid=self.client_id,
             t=int(time.time() * 100)
         )
         response = self.client.get(url)
         rsp_json = json.loads(response)
         logger.debug("get_discuss_info response: {}".format(rsp_json))
         retcode = rsp_json["retcode"]
         if retcode == 0:
             result = rsp_json["result"]
         else:
             logger.warning("get_discuss_info error.")
             return
         self.discuss_info[str(did)] = result  # 缓存群成员信息, 此处会把真假group_code都加入cache
         return result
     except Exception as ex:
         logger.warning("get_discuss_info error: " + str(ex))
         return
예제 #14
0
 def send_friend_msg(self, reply_content, uin, msg_id, fail_times=0):
     fix_content = str(reply_content.replace("\\", "\\\\\\\\").replace("\n", "\\\\n").replace("\t", "\\\\t"))
     rsp = ""
     try:
         req_url = "http://d1.web2.qq.com/channel/send_buddy_msg2"
         data = {
             'r':
              '{{"to":{0}, "face":594, "content":"[\\"{4}\\", [\\"font\\", {{\\"name\\":\\"Arial\\", \\"size\\":\\"10\\", \\"style\\":[0, 0, 0], \\"color\\":\\"000000\\"}}]]", "clientid":{1}, "msg_id":{2}, "psessionid":"{3}"}}'.format(
                      uin, self.client_id, msg_id, self.psessionid, fix_content),
             'clientid': self.client_id,
             'psessionid': self.psessionid
         }
         rsp = self.client.post(req_url, data, SMART_QQ_REFER)
         rsp_json = json.loads(rsp)
         if 'errCode' in rsp_json and rsp_json['errCode'] != 0:
             raise ValueError("reply pmchat error" + str(rsp_json['retcode']))
         logger.info("RUNTIMELOG Reply successfully.")
         logger.debug("RESPONSE Reply response: " + str(rsp))
         return rsp_json
     except:
         if fail_times < 5:
             logger.warning("RUNTIMELOG Response Error.Wait for 2s and Retrying." + str(fail_times))
             logger.debug("RESPONSE " + str(rsp))
             time.sleep(2)
             self.send_friend_msg(reply_content, uin, msg_id, fail_times + 1)
         else:
             logger.warning("RUNTIMELOG Response Error over 5 times.Exit.reply content:" + str(reply_content))
             return False
예제 #15
0
파일: bot.py 프로젝트: oink/SmartQQBot
    def get_group_member_info_list(self, group_code):
        """
        获取指定群的成员信息
        :group_code: int, can be "ture" of "fake" group_code
        :return:dict
        """
        if group_code == 0:
            logger.debug("get_group_member_info_list 输入为0,返回 None")
            return
        try:
            def retcode_validator(rsp_json):
                assert rsp_json["retcode"] == 0 or rsp_json["retcode"] == 6, "group_code error."

            url = "http://s.web2.qq.com/api/get_group_info_ext2?gcode=%s&vfwebqq=%s&t=%s" % (
                group_code, self.vfwebqq, int(time.time() * 100))
            rsp_json = self.client.load(url, validator=retcode_validator)
            retcode = rsp_json["retcode"]
            if retcode == 0:
                result = rsp_json["result"]
            elif retcode == 6:
                logger.debug("get_group_member_info_list retcode is 6, trying to get true code.")
                result = self.get_group_member_info_list(self.get_true_group_code(group_code))
            self.group_member_info[str(group_code)] = result    # 缓存群成员信息, 此处会把真假group_code都加入cache
            return result
        except Exception as ex:
            logger.warning("get_group_member_info_list. Error: " + str(ex))
            return
예제 #16
0
파일: bot.py 프로젝트: jsnjfz/SmartQQBot
 def get_group_member_info_list(self, group_code):
     """
     获取指定群的成员信息
     :group_code: int, can be "ture" of "fake" group_code
     {"retcode":0,"result":{"stats":[],"minfo":[{"nick":" 信","province":"山东","gender":"male","uin":3964575484,"country":"中国","city":""},{"nick":"崔震","province":"","gender":"unknown","uin":2081397472,"country":"","city":""},{"nick":"云端的猫","province":"山东","gender":"male","uin":3123065696,"country":"中国","city":"青岛"},{"nick":"要有光","province":"山东","gender":"male","uin":2609717081,"country":"中国","city":"青岛"},{"nick":"小莎机器人","province":"广东","gender":"female","uin":495456232,"country":"中国","city":"深圳"}],"ginfo":{"face":0,"memo":"http://hujj009.ys168.com\r\n0086+区(没0)+电话\r\n0086+手机\r\nhttp://john123951.xinwen365.net/qq/index.htm","class":395,"fingermemo":"","code":3943922314,"createtime":1079268574,"flag":16778241,"level":0,"name":"ぁQQぁ","gid":3931577475,"owner":3964575484,"members":[{"muin":3964575484,"mflag":192},{"muin":2081397472,"mflag":65},{"muin":3123065696,"mflag":128},{"muin":2609717081,"mflag":0},{"muin":495456232,"mflag":0}],"option":2},"cards":[{"muin":3964575484,"card":"●s.Εx2(22222)□"},{"muin":495456232,"card":"小莎机器人"}],"vipinfo":[{"vip_level":0,"u":3964575484,"is_vip":0},{"vip_level":0,"u":2081397472,"is_vip":0},{"vip_level":0,"u":3123065696,"is_vip":0},{"vip_level":0,"u":2609717081,"is_vip":0},{"vip_level":0,"u":495456232,"is_vip":0}]}}
     :return:dict
     """
     if group_code == 0:
         return
     try:
         url = "http://s.web2.qq.com/api/get_group_info_ext2?gcode=%s&vfwebqq=%s&t=%s" % (
             group_code, self.vfwebqq, int(time.time() * 100))
         response = self.client.get(url)
         rsp_json = json.loads(response)
         logger.debug("get_group_member_info_list info response: {}".format(
             rsp_json))
         retcode = rsp_json["retcode"]
         if retcode == 0:
             result = rsp_json["result"]
         elif retcode == 6:
             logger.debug(
                 "get_group_member_info_list retcode is 6, trying to get true code."
             )
             result = self.get_group_member_info_list(
                 self.get_true_group_code(group_code))
         else:
             logger.warning("group_code error.")
             return
         self.group_member_info[str(
             group_code)] = result  # 缓存群成员信息, 此处会把真假group_code都加入cache
         return result
     except Exception as ex:
         logger.warning("RUNTIMELOG get_group_member_info_list. Error: " +
                        str(ex))
         return
예제 #17
0
 def send_discuss_msg(self, reply_content, did, msg_id, fail_times=0):
     fix_content = str(reply_content.replace("\\", "\\\\\\\\").replace("\n", "\\\\n").replace("\t", "\\\\t"))
     rsp = ""
     try:
         logger.info("Starting send discuss group message: %s" % reply_content)
         req_url = "http://d1.web2.qq.com/channel/send_discu_msg2"
         data = {
             'r':
              '{{"did":{0}, "face":564,"content":"[\\"{4}\\",[\\"font\\",{{\\"name\\":\\"Arial\\",\\"size\\":\\"10\\",\\"style\\":[0,0,0],\\"color\\":\\"000000\\"}}]]","clientid":{1},"msg_id":{2},"psessionid":"{3}"}}'.format(
                      did, self.client_id, msg_id, self.psessionid, fix_content),
             'clientid': self.client_id,
             'psessionid': self.psessionid
         }
         rsp = self.client.post(req_url, data, SMART_QQ_REFER)
         rsp_json = json.loads(rsp)
         if 'retcode' in rsp_json and rsp_json['retcode'] not in MESSAGE_SENT:
             raise ValueError("RUNTIMELOG reply discuss group error" + str(rsp_json['retcode']))
         logger.info("send_discuss_msg: Reply '{}' successfully.".format(reply_content))
         logger.debug("send_discuss_msg: Reply response: " + str(rsp))
         return rsp_json
     except:
         logger.warning("send_discuss_msg fail")
         if fail_times < 5:
             logger.warning("send_discuss_msg: Response Error.Wait for 2s and Retrying." + str(fail_times))
             logger.debug("send_discuss_msg response:" + str(rsp))
             time.sleep(2)
             self.send_group_msg(reply_content, did, msg_id, fail_times + 1)
         else:
             logger.warning("RUNTIMELOG send_qun_msg: Response Error over 5 times.Exit.reply content:" + str(reply_content))
             return False
예제 #18
0
 def get_online_friends_list(self):
     """
     获取在线好友列表
     get_online_buddies2
     :return:list
     """
     retry_times = 10
     while retry_times:
         logger.info("RUNTIMELOG Requesting the online buddies.")
         response = self.client.get(
             'http://d1.web2.qq.com/channel/get_online_buddies2?vfwebqq={0}&clientid={1}&psessionid={2}&t={3}'
             .format(
                 self.vfwebqq,
                 self.client_id,
                 self.psessionid,
                 self.client.get_timestamp(),
             ))  # {"result":[],"retcode":0}
         logger.debug(
             "RESPONSE get_online_buddies2 html:{}".format(response))
         try:
             online_buddies = json.loads(response)
         except ValueError:
             logger.warning(
                 "get_online_buddies2 response decode as json fail.")
             return None
         if online_buddies['retcode'] != 0:
             logger.warning(
                 'get_online_buddies2 retcode is not 0. returning.')
             return None
         online_buddies = online_buddies['result']
         return online_buddies
예제 #19
0
    def get_self_info(self):
        """
        获取自己的信息, 并存入self._self_info
        get_self_info2
        {"retcode":0,"result":{"birthday":{"month":1,"year":1989,"day":30},"face":555,"phone":"","occupation":"","allow":1,"college":"","uin":2609717081,"blood":0,"constel":1,"lnick":"","vfwebqq":"68b5ff5e862ac589de4fc69ee58f3a5a9709180367cba3122a7d5194cfd43781ada3ac814868b474","homepage":"","vip_info":0,"city":"青岛","country":"中国","personal":"","shengxiao":5,"nick":"要有光","email":"","province":"山东","account":2609717081,"gender":"male","mobile":""}}
        :return:dict
        """
        try_times = 0

        while len(self._self_info) is 0:
            url = "http://s.web2.qq.com/api/get_self_info2?t={}".format(
                time.time())
            response = self.client.get(url)
            logger.debug("get_self_info2 response:{}".format(response))
            rsp_json = json.loads(response)
            if rsp_json["retcode"] != 0:
                try_times += 1
                logger.warning("get_self_info2 fail. {}".format(try_times))
                if try_times >= 5:
                    return {}
                continue
            try:
                self._self_info = rsp_json["result"]
            except KeyError:
                logger.warning("get_self_info2 failed. Retrying.")
                continue
        return self._self_info
예제 #20
0
    def get_friend_info(self, tuin):
        """
        获取好友详情信息
        get_friend_info
        {"retcode":0,"result":{"face":0,"birthday":{"month":1,"year":1989,"day":30},"occupation":"","phone":"","allow":1,"college":"","uin":3964575484,"constel":1,"blood":3,"homepage":"http://blog.lovewinne.com","stat":20,"vip_info":0,"country":"中国","city":"","personal":"","nick":" 信","shengxiao":5,"email":"*****@*****.**","province":"山东","gender":"male","mobile":"158********"}}
        :return:dict
        """

        uin = str(tuin)
        if uin not in self.friend_uin_list:
            logger.info(
                "RUNTIMELOG Requesting the account info by uin: {}".format(
                    uin))
            info = json.loads(
                self.client.get(
                    'http://s.web2.qq.com/api/get_friend_info2?tuin={0}&vfwebqq={1}&clientid={2}&psessionid={3}&t={4}'
                    .format(uin, self.vfwebqq, self.client_id, self.psessionid,
                            self.client.get_timestamp())))
            logger.debug("get_friend_info2 html: {}".format(str(info)))
            if info['retcode'] != 0:
                logger.warning(
                    'get_friend_info2 retcode unknown: {}'.format(info))
                return None
            info = info['result']
            info['account'] = self.uin_to_account(uin)
            info['longnick'] = self.get_friend_longnick(uin)
            self.friend_uin_list[uin] = info

        try:
            return self.friend_uin_list[uin]
        except:
            logger.warning("RUNTIMELOG get_friend_info return fail.")
            logger.debug("RUNTIMELOG now uin list:    " +
                         str(self.friend_uin_list[uin]))
예제 #21
0
    def get_friend_info2(self, tuin):
        """
        获取好友详情信息
        get_friend_info2
        {"retcode":0,"result":{"face":0,"birthday":{"month":1,"year":1989,"day":30},"occupation":"","phone":"","allow":1,"college":"","uin":3964575484,"constel":1,"blood":3,"homepage":"http://blog.lovewinne.com","stat":20,"vip_info":0,"country":"中国","city":"","personal":"","nick":" 信","shengxiao":5,"email":"*****@*****.**","province":"山东","gender":"male","mobile":"158********"}}
        :return:dict
        """
        uin_str = str(tuin)
        try:
            logger.info("RUNTIMELOG Requesting the account info by uin:    " +
                        str(tuin))
            info = json.loads(
                self.client.get(
                    'http://s.web2.qq.com/api/get_friend_info2?tuin={0}&vfwebqq={1}&clientid={2}&psessionid={3}&t={4}'
                    .format(uin_str, self.vfwebqq, self.client_id,
                            self.psessionid, self.client.get_timestamp()), ))
            logger.debug("RESPONSE get_friend_info2 html:    " + str(info))
            if info['retcode'] != 0:
                raise TypeError('get_friend_info2 result error')
            info = info['result']
            return info

        except:
            logger.warning("RUNTIMELOG get_friend_info2 fail")
            return None
예제 #22
0
 def get_discuss_info(self, did):
     """
     获取指定讨论组的成员信息
     :did: str
     {u'result': {u'info': {u'did': 2966596468, u'discu_name': u'', u'mem_list': [{u'ruin': 466331599, u'mem_uin': 466331599}, {u'ruin': 493658515, u'mem_uin': 556813270}, {u'ruin': 824566900, u'mem_uin': 2606746705}]}, u'mem_status': [], u'mem_info': [{u'nick': u'\\u54a6', u'uin': 466331599}, {u'nick': u'Auro', u'uin': 556813270}, {u'nick': u'-', u'uin': 2606746705}]}, u'retcode': 0}
     :rtype: dict
     """
     if did == 0:
         return
     try:
         did = str(did)
         url = "http://d1.web2.qq.com/channel/get_discu_info?did={did}&psessionid={psessionid}&vfwebqq={vfwebqq}&clientid={clientid}&t={t}".format(
             did=did,
             psessionid=self.psessionid,
             vfwebqq=self.vfwebqq,
             clientid=self.client_id,
             t=int(time.time() * 100))
         response = self.client.get(url)
         rsp_json = json.loads(response)
         logger.debug("get_discuss_info response: {}".format(rsp_json))
         retcode = rsp_json["retcode"]
         if retcode == 0:
             result = rsp_json["result"]
         else:
             logger.warning("get_discuss_info error.")
             return
         self.discuss_info[str(
             did)] = result  # 缓存群成员信息, 此处会把真假group_code都加入cache
         return result
     except Exception as ex:
         logger.warning("get_discuss_info error: " + str(ex))
         return
예제 #23
0
    def get_friend_info2(self, tuin):
        """
        获取好友详情信息
        get_friend_info2
        {"retcode":0,"result":{"face":0,"birthday":{"month":1,"year":1989,"day":30},"occupation":"","phone":"","allow":1,"college":"","uin":3964575484,"constel":1,"blood":3,"homepage":"http://blog.lovewinne.com","stat":20,"vip_info":0,"country":"中国","city":"","personal":"","nick":" 信","shengxiao":5,"email":"*****@*****.**","province":"山东","gender":"male","mobile":"158********"}}
        :return:dict
        """
        uin_str = str(tuin)
        try:
            logger.info("RUNTIMELOG Requesting the account info by uin:    " + str(tuin))
            info = json.loads(self.client.get(
                    'http://s.web2.qq.com/api/get_friend_info2?tuin={0}&vfwebqq={1}&clientid={2}&psessionid={3}&t={4}'
                        .format(
                            uin_str,
                            self.vfwebqq,
                            self.client_id,
                            self.psessionid,
                            self.client.get_timestamp()),
            ))
            logger.debug("RESPONSE get_friend_info2 html:    " + str(info))
            if info['retcode'] != 0:
                raise TypeError('get_friend_info2 result error')
            info = info['result']
            return info

        except:
            logger.warning("RUNTIMELOG get_friend_info2 fail")
            return None
예제 #24
0
파일: bot.py 프로젝트: Ricky-Hao/SmartQQBot
    def uin_to_account(self, tuin):
        """
        将uin转换成用户QQ号
        :param tuin:
        :return:str 用户QQ号
        """
        uin_str = str(tuin)
        if sql.fetch_one('select account_id from account_data where account_code={0};'.format(uin_str)):
            return sql.fetch_one('select account_id from account_data where account_code={0};'.format(uin_str))[0];
        else:
            try:
                logger.debug("[UIN_TO_ACCOUNT] " + str(tuin))
                info = json.loads(
                    self.client.get(
                        'http://s.web2.qq.com/api/get_friend_uin2?tuin={0}&type=1&vfwebqq={1}&t={2}'.format(
                            uin_str,
                            self.vfwebqq,
                            self.client.get_timestamp()
                        ),
                        SMART_QQ_REFER
                    )
                )
                logger.debug("RESPONSE uin_to_account html:    " + str(info))
                if info['retcode'] != 0:
                    raise TypeError('uin_to_account retcode error')
                info = info['result']['account']
                if sql.fetch_one('select * from account_data where account_id={0};'.format(info)):
                    sql.execute('update account_data set account_code={0} where account_id={1};'.format(uin_str,info))
                else:
                    sql.execute("insert into account_data(account_id,account_code) values('{0}','{1}');".format(info,uin_str))
                return info

            except Exception:
                logger.exception("RUNTIMELOG uin_to_account fail")
                return None
예제 #25
0
파일: bot.py 프로젝트: Akizukii/SmartQQBot
    def get_self_info(self):
        """
        获取自己的信息, 并存入self._self_info
        get_self_info2
        {"retcode":0,"result":{"birthday":{"month":1,"year":1989,"day":30},"face":555,"phone":"","occupation":"","allow":1,"college":"","uin":2609717081,"blood":0,"constel":1,"lnick":"","vfwebqq":"68b5ff5e862ac589de4fc69ee58f3a5a9709180367cba3122a7d5194cfd43781ada3ac814868b474","homepage":"","vip_info":0,"city":"青岛","country":"中国","personal":"","shengxiao":5,"nick":"要有光","email":"","province":"山东","account":2609717081,"gender":"male","mobile":""}}
        :return:dict
        """
        try_times = 0

        while len(self._self_info) is 0:
            url = "http://s.web2.qq.com/api/get_self_info2?t={}".format(time.time())
            response = self.client.get(url)
            logger.debug("get_self_info2 response:{}".format(response))
            rsp_json = json.loads(response)
            if rsp_json["retcode"] != 0:
                try_times += 1
                logger.warning("get_self_info2 fail. {}".format(try_times))
                if try_times >= 5:
                    return {}
            try:
                self._self_info = rsp_json["result"]
            except KeyError:
                logger.warning("get_self_info2 failed. Retrying.")
                continue
        return self._self_info
예제 #26
0
def update_help_data():
    for p in plugin_list:
        if p!=plugin_name:
            try:
                tmp=(__import__('smart_qq_plugins.'+p,fromlist=['HELP']))
                logger.debug(tmp.HELP)
                sql.execute("insert into Help(plugin_name,help) values('{0}','{1}');".format(p,json.dumps(tmp.HELP))) 
            except Exception as e:
                logger.debug(e)
예제 #27
0
 def get(self, url, refer=None):
     try:
         req = requests.get(url,headers={"Referer":refer or SMART_QQ_REFER})
         tmp_req = self._opener.get(url,headers={"Referer":refer or SMART_QQ_REFER})
         self._cookie.save(COOKIE_FILE, ignore_discard=True,ignore_expires=True)
         #logger.debug(tmp_req.text)
         return tmp_req.text
     except requests.HTTPError as e:
         logger.debug(e)
         return e
예제 #28
0
파일: bot.py 프로젝트: wy85117/SmartQQBot
    def query_friends_accounts(self):
        try:
            rsp = self.client.post(
                'http://qun.qq.com/cgi-bin/qun_mgr/get_friend_list',
                data={'bkn': self.bkn},
                refer='http://qun.qq.com/member.html',
            )
            logger.debug("get_friend_list html:\t{}".format(str(rsp)))
            qq_list = json.loads(rsp).get('result', {}).get('0',
                                                            {}).get('mems')

            rsp = self.client.post(
                'http://s.web2.qq.com/api/get_user_friends2',
                {
                    'r':
                    json.dumps({
                        "vfwebqq":
                        self.vfwebqq,
                        "hash":
                        self._hash_digest(self._self_info['uin'],
                                          self.ptwebqq),
                    })
                },
            )
            logger.debug("get_user_friends2 html:\t{}".format(str(rsp)))
            rsp = json.loads(rsp)
            uin_list = [[str(friend['nick']),
                         str(friend['uin'])]
                        for friend in rsp['result']['info']]
            for friend in rsp['result'].get('marknames', []):
                for idx, (nick, uin) in enumerate(uin_list):
                    if str(uin) == str(friend['uin']):
                        uin_list[idx][0] = friend['markname']

            result_dict = {}
            duplicated_name = set()
            for friend in qq_list:
                for tgt in uin_list:
                    if friend['name'] == tgt[0]:
                        if str(tgt[1]) not in result_dict:
                            result_dict[str(tgt[1])] = str(
                                friend['uin'])  # 这个uin是真实qq号
                        else:
                            duplicated_name.add(tgt[0])
                            result_dict[str(tgt[1])] = ""

            if len(duplicated_name) != 0:
                logger.warning(
                    "存在多个好友使用以下昵称,无法唯一确定这些好友的真实QQ号,请通过修改备注名以唯一确定:{}".format(
                        " ".join(list(duplicated_name))))
            for uin, account in result_dict.items():
                self.friend_uin_list[uin] = {'account': account}

        except Exception as e:
            logger.warning("获取好友真实qq号失败, {}".format(e))
예제 #29
0
    def get_friend_info(self, tuin):
        uin_str = str(tuin)
        if uin_str not in self.friend_list:
            info = self.get_friend_info2(tuin) or {'nick': '群用户'}
            info['account'] = self.uin_to_account(tuin)
            self.friend_list[uin_str] = info

        try:
            return '【{0}({1})】'.format(self.friend_list[uin_str]['nick'], self.friend_list[uin_str]['account'])
        except:
            logger.warning("RUNTIMELOG get_friend_info return fail.")
            logger.debug("RUNTIMELOG now uin list:    " + str(self.friend_list[uin_str]))
예제 #30
0
    def get_group_name_list_mask2(self):
        """
        获取群列表, 并存入cache, 其中code为group_code
        get_group_name_list_mask2
        :return:list
        {
            u 'gmarklist': [],
            u 'gmasklist': [],
            u 'gnamelist': [
                {
                    u 'code': 1131597161, # 这是真实group_code
                    u 'flag': 184550417,
                    u 'gid': 1802239929,  # 这是msg.group_code, 即假group_code
                    u 'name': u '测试'
                },
                {
                    u 'code': 1131597161,
                    u 'flag': 184550417,
                    u 'gid': 1802239929,
                    u 'name': u '测试'
                }
            ]
        }
        """
        logger.info("RUNTIMELOG Requesting the group list.")

        response = self.client.post(
            'http://s.web2.qq.com/api/get_group_name_list_mask2',
            {
                'r':
                json.dumps({
                    "vfwebqq":
                    self.vfwebqq,
                    "hash":
                    self._hash_digest(self._self_info['uin'], self.ptwebqq),
                })
            },
        )
        try:
            response = json.loads(response)
        except ValueError:
            logger.warning(
                "RUNTIMELOG The response of group list request can't be load as json"
            )
            return
        logger.debug("RESPONSE get_group_name_list_mask2 html:    " +
                     str(response))
        if response['retcode'] != 0:
            raise TypeError('get_online_buddies2 result error')
        for group in response['result']['gnamelist']:
            self.group_code_list[str(group['gid'])] = group
        return response['result']
예제 #31
0
파일: bot.py 프로젝트: HFO4/SmartQQBot
 def get_true_group_code(self, fake_group_code):
     """
     :type fake_group_code: int
     """
     fake_group_code = str(fake_group_code)
     logger.debug("正在查询group_code:{}对应的真实group_code".format(fake_group_code))
     if fake_group_code not in self.group_code_list:
         logger.info("尝试更新群列表信息")
         self.get_group_name_list_mask2() # 先尝试更新群列表
         if fake_group_code not in self.group_code_list:
             logger.warning("没有所查询的group_code, 请检查group_code是否错误")
             return 0
     return self.group_code_list[fake_group_code]['code']
예제 #32
0
 def get_true_group_code(self, fake_group_code):
     """
     :type fake_group_code: int
     """
     fake_group_code = str(fake_group_code)
     logger.debug(
         "正在查询group_code:{}对应的真实group_code".format(fake_group_code))
     if fake_group_code not in self.group_code_list:
         logger.info("尝试更新群列表信息")
         self.get_group_name_list_mask2()  # 先尝试更新群列表
         if fake_group_code not in self.group_code_list:
             logger.warning("没有所查询的group_code, 请检查group_code是否错误")
             return 0
     return self.group_code_list[fake_group_code]['code']
예제 #33
0
    def get_friend_info(self, tuin):
        uin_str = str(tuin)
        if uin_str not in self.friend_list:
            info = self.get_friend_info2(tuin) or {'nick': '群用户'}
            info['account'] = self.uin_to_account(tuin)
            self.friend_list[uin_str] = info

        try:
            return '【{0}({1})】'.format(self.friend_list[uin_str]['nick'],
                                       self.friend_list[uin_str]['account'])
        except:
            logger.warning("RUNTIMELOG get_friend_info return fail.")
            logger.debug("RUNTIMELOG now uin list:    " +
                         str(self.friend_list[uin_str]))
예제 #34
0
    def get_group_list_with_group_code(self):
        """
        获取包含群名和group_code的列表, 并存入cache, 其中code为group_code
        :type group_code: str
        :return:list
        [
            {
                u 'code': 1131597161, # 这是真实group_code
                u 'flag': 184550417,
                u 'gid': 1802239929,  # 这是msg.group_code, 即假group_code
                u 'name': u '测试'
            },
            {
                u 'code': 1131597161,
                u 'flag': 184550417,
                u 'gid': 1802239929,
                u 'name': u '测试'
            }
        ]
        """

        logger.info("Requesting the group list.")
        response = self.client.post(
            'http://s.web2.qq.com/api/get_group_name_list_mask2',
            {
                'r':
                json.dumps({
                    "vfwebqq":
                    self.vfwebqq,
                    "hash":
                    self._hash_digest(self._self_info['uin'], self.ptwebqq),
                })
            },
        )
        try:
            logger.debug("get_group_name_list_mask2 html:\t{}".format(
                str(response)))
            response = json.loads(response)
        except ValueError:
            logger.warning(
                "RUNTIMELOG The response of group list request can't be load as json"
            )
            return
        if response['retcode'] != 0:
            raise TypeError('get_group_list_with_group_code result error')
        for group in response['result']['gnamelist']:
            self.group_code_list[str(group['gid'])] = group
            self.group_code_list[str(group['code'])] = group

        return response['result']['gnamelist']
예제 #35
0
 def _get_qr_login_status(self, qr_validation_url, appid, star_time,
                          mibao_css, js_ver, sign, init_url):
     redirect_url = None
     login_result = self.client.get(
         qr_validation_url.format(
             appid,
             date_to_millis(datetime.datetime.utcnow()) - star_time,
             mibao_css, js_ver, sign), init_url)
     ret_code = int(find_first_result(login_result, r"\d+", None))
     redirect_info = re.findall(r"(http.*?)\'", login_result)
     if redirect_info:
         logger.debug("redirect_info match is: %s" % redirect_info)
         redirect_url = redirect_info[0]
     return ret_code, redirect_url
예제 #36
0
파일: bot.py 프로젝트: oink/SmartQQBot
    def check_msg(self):

        # Pooling the message
        try:
            ret = self.client.load(
                'http://d1.web2.qq.com/channel/poll2',
                {
                    'r': json.dumps(
                        {
                            "ptwebqq": self.ptwebqq,
                            "clientid": self.client_id,
                            "psessionid": self.psessionid,
                            "key": ""
                        }
                    )
                },
                SMART_QQ_REFER,
                parser=lambda resp: json.loads(resp.replace(r"\u0026lt;", "<").replace(r"\u0026gt;", ">"))
            )
        except Exception as e:
            logger.exception(e)
            return

        ret_code = ret['retcode']

        if ret_code in (0, 116, 1202):
            self._last_pool_success = True
            if ret_code == 0:
                if 'result' not in ret or len(ret['result']) == 0:
                    logger.info("Pooling ends, no new message received.")
                else:
                    return ret['result']
            elif ret_code == 116:
                self.ptwebqq = ret['p']
                logger.debug("ptwebqq updated in this pooling")
        else:
            self._last_pool_success = False
            if ret_code in (103, ):
                raise NeedRelogin("Pooling received retcode: " + str(ret_code))
            elif ret_code in (121,):
                logger.warning("Pooling error with retcode %s" % ret_code)
            elif ret_code == 100006:
                logger.error("Pooling request error, response is: %s" % ret)
            elif ret_code in (100001, 100012):
                raise NeedRelogin("Login is expired. Please relogin by qrcode")
            else:
                logger.warning("Pooling returns unknown retcode %s" % ret_code)
            time.sleep(2)
        return None
예제 #37
0
 def send_sess_msg2_fromGroup(self,
                              reply_content,
                              guin,
                              tuin,
                              msg_id,
                              service_type=0,
                              fail_times=0):
     group_sig = self._get_group_sig(guin, tuin, service_type)
     fix_content = str(
         reply_content.replace("\\", "\\\\\\\\").replace("\n",
                                                         "\\\\n").replace(
                                                             "\t", "\\\\t"))
     rsp = ""
     try:
         req_url = "http://d1.web2.qq.com/channel/send_sess_msg2"
         data = ((
             'r',
             '{{"to":{0}, "face":594, "content":"[\\"{4}\\", [\\"font\\", {{\\"name\\":\\"Arial\\", \\"size\\":\\"10\\", \\"style\\":[0, 0, 0], \\"color\\":\\"000000\\"}}]]", "clientid":{1}, "msg_id":{2}, "psessionid":"{3}", "group_sig":"{5}", "service_type":{6}}}'
             .format(tuin, self.client_id, msg_id, self.psessionid,
                     fix_content, group_sig,
                     service_type)), ('clientid', self.client_id),
                 ('psessionid', self.psessionid), ('group_sig', group_sig),
                 ('service_type', service_type))
         rsp = self.client.post(req_url, data, SMART_QQ_REFER)
         rsp_json = json.loads(rsp)
         if 'retcode' in rsp_json and rsp_json['retcode'] != 0:
             raise ValueError("RUNTIMELOG reply sess chat error" +
                              str(rsp_json['retcode']))
         logger.info(
             "RUNTIMELOG send_sess_msg2_fromGroup: Reply successfully.")
         logger.debug(
             "RESPONSE send_sess_msg2_fromGroup: Reply response: " +
             str(rsp))
         return rsp_json
     except:
         if fail_times < 5:
             logger.warning(
                 "RUNTIMELOG send_sess_msg2_fromGroup: Response Error.Wait for 2s and Retrying."
                 + str(fail_times))
             logger.debug("RESPONSE " + str(rsp))
             time.sleep(2)
             self.send_sess_msg2_fromGroup(guin, tuin, reply_content,
                                           msg_id, service_type,
                                           fail_times + 1)
         else:
             logger.warning(
                 "RUNTIMELOG send_sess_msg2_fromGroup: Response Error over 5 times.Exit.reply content:"
                 + str(reply_content))
             return False
예제 #38
0
 def get_true_group_code(self, fake_group_code):
     """
     通过假group_code获取真group_code
     :type fake_group_code: str
     :return str
     """
     fake_group_code = str(fake_group_code)
     logger.debug("正在查询group_code:{}对应的真实group_code".format(fake_group_code))
     if fake_group_code not in self.group_code_list:
         logger.info("尝试更新群列表信息")
         self.get_group_list_with_group_code()  # 先尝试更新群列表
         if fake_group_code not in self.group_code_list:
             logger.warning("没有所查询的group_code, 请检查group_code是否错误")
             return 0
     return str(self.group_code_list[fake_group_code]['code'])
예제 #39
0
파일: bot.py 프로젝트: Akizukii/SmartQQBot
 def get_true_group_code(self, fake_group_code):
     """
     通过假group_code获取真group_code
     :type fake_group_code: str
     :return str
     """
     fake_group_code = str(fake_group_code)
     logger.debug("正在查询group_code:{}对应的真实group_code".format(fake_group_code))
     if fake_group_code not in self.group_code_list:
         logger.info("尝试更新群列表信息")
         self.get_group_list_with_group_code()  # 先尝试更新群列表
         if fake_group_code not in self.group_code_list:
             logger.warning("没有所查询的group_code, 请检查group_code是否错误")
             return 0
     return str(self.group_code_list[fake_group_code]['code'])
예제 #40
0
파일: bot.py 프로젝트: HFO4/SmartQQBot
    def get_group_name_list_mask2(self):
        """
        获取群列表, 并存入cache, 其中code为group_code
        get_group_name_list_mask2
        :return:list
        {
            u 'gmarklist': [],
            u 'gmasklist': [],
            u 'gnamelist': [
                {
                    u 'code': 1131597161, # 这是真实group_code
                    u 'flag': 184550417,
                    u 'gid': 1802239929,  # 这是msg.group_code, 即假group_code
                    u 'name': u '测试'
                },
                {
                    u 'code': 1131597161,
                    u 'flag': 184550417,
                    u 'gid': 1802239929,
                    u 'name': u '测试'
                }
            ]
        }
        """
        logger.info("RUNTIMELOG Requesting the group list.")

        response = self.client.post(
            'http://s.web2.qq.com/api/get_group_name_list_mask2',
            {
                'r': json.dumps(
                    {
                        "vfwebqq": self.vfwebqq,
                        "hash": self._hash_digest(self._self_info['uin'], self.ptwebqq),
                    }
                )
            },
        )
        try:
            response = json.loads(response)
        except ValueError:
            logger.warning("RUNTIMELOG The response of group list request can't be load as json")
            return
        logger.debug("RESPONSE get_group_name_list_mask2 html:    " + str(response))
        if response['retcode'] != 0:
            raise TypeError('get_online_buddies2 result error')
        for group in response['result']['gnamelist']:
            self.group_code_list[str(group['gid'])] = group
        return response['result']
예제 #41
0
    def get_group_list_with_group_id(self):
        """
        获取包含群名和群号的列表, 并存入cache, 其中gc为群号
        :type group_id: str
        :return:list

        return list sample
        [
            {
                "gc": 114302207,
                "gn": "测试群1",
                "owner": 484216451
            },
            {
                "gc": 125299202,
                "gn": "测试群2",
                "owner": 242917661
            }
        ]
        """
        if self._get_group_list:
            response = self._get_group_list
        else:
            url = "http://qun.qq.com/cgi-bin/qun_mgr/get_group_list"
            data = {'bkn': self.bkn}
            response = self.client.post(url,
                                        data=data,
                                        refer='http://qun.qq.com/member.html')
            self._get_group_list = response
            logger.debug("get_group_list response: {}".format(response))
        rsp_json = json.loads(response)
        if rsp_json['ec'] == 0:
            group_id_list = list()
            group_id_list.extend(rsp_json.get('join') or [])
            group_id_list.extend(rsp_json.get('manage') or [])
            group_id_list.extend(rsp_json.get('create') or [])
            if group_id_list:
                for group in group_id_list:
                    self.group_id_list[str(group['gc'])] = group
                return group_id_list
            else:
                logger.warning(
                    "seems this account didn't join any group: {}".format(
                        response))
                return []
        else:
            logger.warning("get_group_list code unknown: {}".format(response))
            return None
예제 #42
0
    def search_group_members(self, group_id):
        """
        获取群成员详细信息的的列表, uin为真实QQ号, 并存入cache
        :type group_id: str
        :return:list

        return list sample
        [
            {
              "card": "群名片",
              "flag": 0,
              "g": 255,
              "join_time": 1385383309,
              "last_speak_time": 1471325570,
              "lv": {
                "level": 6,
                "point": 5490
              },
              "nick": "昵称",
              "qage": 0,
              "role": 0,
              "tags": "-1",
              "uin": 493658555
            }
        ]
        """
        url = "http://qun.qq.com/cgi-bin/qun_mgr/search_group_members"
        data = {
            'bkn': self.bkn,
            'gc': str(group_id),
            'st': 0,
            'end': 2000,
            'sort': 0,
        }
        response = self.client.post(url,
                                    data=data,
                                    refer='http://qun.qq.com/member.html')
        logger.debug("search_group_members response: {}".format(response))
        rsp_json = json.loads(response)
        if rsp_json['ec'] == 0:
            return rsp_json.get('mems')
        else:
            logger.warning(
                "search_group_members code unknown: {}".format(response))
            return None
예제 #43
0
파일: bot.py 프로젝트: SKnife/SmartQQBot
    def get_group_list_with_group_id(self):
        """
        获取包含群名和群号的列表, 并存入cache, 其中gc为群号
        :type group_id: str
        :return:list

        return list sample
        [
            {
                "gc": 114302207,
                "gn": "测试群1",
                "owner": 484216451
            },
            {
                "gc": 125299202,
                "gn": "测试群2",
                "owner": 242917661
            }
        ]
        """
        if self._get_group_list:
            response = self._get_group_list
        else:
            url = "http://qun.qq.com/cgi-bin/qun_mgr/get_group_list"
            data = {'bkn': self.bkn}
            response = self.client.post(url, data=data, refer='http://qun.qq.com/member.html')
            self._get_group_list = response
            logger.debug("get_group_list response: {}".format(response))
        rsp_json = json.loads(response)
        if rsp_json['ec'] == 0:
            group_id_list = list()
            group_id_list.extend(rsp_json.get('join') or [])
            group_id_list.extend(rsp_json.get('manage') or [])
            group_id_list.extend(rsp_json.get('create') or [])
            if group_id_list:
                for group in group_id_list:
                    self.group_id_list[str(group['gc'])] = group
                return group_id_list
            else:
                logger.warning("seems this account didn't join any group: {}".format(response))
                return []
        else:
            logger.warning("get_group_list code unknown: {}".format(response))
            return None
예제 #44
0
def weather(msg, bot):
    global query

    match = re.match(
        six.text_type('^(weather|天气) (.*)'),
        msg.content
    )
    if match:
        logger.info("RUNTIMELOG 查询天气...")
        command = match.group(1)
        city = match.group(2)
        logger.info("RUNTIMELOG 查询天气语句: " + msg.content)
        if command == 'weather' or command == six.text_type('天气'):
            try:
                city_name = parse.quote(city.encode('utf-8'))
                url_str = "http://api.map.baidu.com/telematics/v3/weather?location={city}&ak={key}&output=json".format(
                    city=city_name,
                    key=KEY
                )
                response = request.urlopen(url_str)
                data_html = response.read()
                logger.debug("RESPONSE {}".format(data_html))
                json_result = json.loads(data_html.decode('utf-8'))['results'][0]

                str_data = ""
                str_data += json_result['currentCity'] + " PM:" + json_result['pm25'] + "\n"
                try:
                    str_data += json_result["index"][0]['des'] + "\n"
                except:
                    pass

                for data in json_result["weather_data"]:
                    str_data += data['date'] + " "
                    str_data += data['weather'] + " "
                    str_data += data['wind'] + " "
                    str_data += data['temperature']
                    str_data += '\n'
            except Exception as ex:
                logger.debug(ex)
                str_data = "City not found :("

            bot.reply_msg(msg, str_data)
            return True
    return False
예제 #45
0
파일: bot.py 프로젝트: SKnife/SmartQQBot
    def search_group_members(self, group_id):
        """
        获取群成员详细信息的的列表, uin为真实QQ号, 并存入cache
        :type group_id: str
        :return:list

        return list sample
        [
            {
              "card": "群名片",
              "flag": 0,
              "g": 255,
              "join_time": 1385383309,
              "last_speak_time": 1471325570,
              "lv": {
                "level": 6,
                "point": 5490
              },
              "nick": "昵称",
              "qage": 0,
              "role": 0,
              "tags": "-1",
              "uin": 493658555
            }
        ]
        """
        url = "http://qun.qq.com/cgi-bin/qun_mgr/search_group_members"
        data = {
            'bkn':  self.bkn,
            'gc':   str(group_id),
            'st':   0,
            'end':  2000,
            'sort': 0,
        }
        response = self.client.post(url, data=data, refer='http://qun.qq.com/member.html')
        logger.debug("search_group_members response: {}".format(response))
        rsp_json = json.loads(response)
        if rsp_json['ec'] == 0:
            return rsp_json.get('mems')
        else:
            logger.warning("search_group_members code unknown: {}".format(response))
            return None
예제 #46
0
    def _handle_one(self, msg):
        """
        :type msg: smart_qq_bot.messages.QMessage
        """
        handlers = self._registry[msg.type]

        for handler in handlers + self._registry[RAW_TYPE]:
            if is_active(handler.name):
                if self.bot.is_self_msg(msg) and not handler.accept_self:
                    logger.debug(
                        "[{}] dropped group message from itself".format(
                            handler.name))
                    continue
                self.handler_queue.put(
                    Task(func=handler.func,
                         name=handler.name,
                         kwargs={
                             "msg": msg,
                             "bot": self.bot
                         }))
예제 #47
0
파일: bot.py 프로젝트: Akizukii/SmartQQBot
 def _get_qr_login_status(
         self, qr_validation_url, appid, star_time,
         mibao_css, js_ver, sign, init_url
 ):
     redirect_url = None
     login_result = self.client.get(
         qr_validation_url.format(
             appid,
             date_to_millis(datetime.datetime.utcnow()) - star_time,
             mibao_css,
             js_ver,
             sign
         ),
         init_url
     )
     ret_code = int(find_first_result(login_result, r"\d+?", None))
     redirect_info = re.findall(r"(http.*?)\'", login_result)
     if redirect_info:
         logger.debug("redirect_info match is: %s" % redirect_info)
         redirect_url = redirect_info[0]
     return ret_code, redirect_url
예제 #48
0
def is_repeat(recorder, msg):
    if msg.src_group_name != '圆环之理':
        return False
    #[群消息]blabla
    match = re.match(r'^\[\w+\]\w+', msg.content)
    if match:
        return False
    #不要复读指令
    match = re.match(r'^\/|!', msg.content)
    if match:
        return False
    rand = randint(1, 100)
    logger.debug(rand)
    if rand > 15:
        return False
    time = recorder.last_message_on
    if datetime.utcnow() < time + timedelta(minutes=1):
        return False

    recorder.last_message_on = datetime.utcnow()
    return True
예제 #49
0
파일: bot.py 프로젝트: wy85117/SmartQQBot
 def get_group_member_info_list(self, group_code):
     """
     获取指定群的成员信息
     :group_code: int, can be "ture" of "fake" group_code
     {"result":{"cards":[{"card":"测试名片","muin":123456789}],"ginfo":{"class":27,"code":3281366860,"createtime":1457436527,"face":0,"fingermemo":"","flag":1090520065,"gid":3281366860,"level":0,"members":[{"mflag":0,"muin":1145751263},{"mflag":0,"muin":123456789},{"mflag":0,"muin":2123968182},{"mflag":1,"muin":271236123}],"memo":"","name":"测试群名","option":2,"owner":2123968182},"minfo":[{"city":"","country":"","gender":"male","nick":"测试2","province":"","uin":1145751263},{"city":"广州","country":"中国","gender":"male","nick":"测试1","province":"广东","uin":123456789},{"city":"广州","country":"中国","gender":"male","nick":"大","province":"广东","uin":2123968182},{"city":"","country":"中国","gender":"female","nick":"2","province":"","uin":271236123}],"stats":[],"vipinfo":[{"is_vip":0,"u":1145751263,"vip_level":0},{"is_vip":0,"u":123456789,"vip_level":0},{"is_vip":0,"u":2123968182,"vip_level":0},{"is_vip":0,"u":271236123,"vip_level":0}]},"retcode":0}
     :return:dict
     """
     if group_code == 0:
         logger.debug("get_group_member_info_list 输入为0,返回 None")
         return
     try:
         url = "http://s.web2.qq.com/api/get_group_info_ext2?gcode=%s&vfwebqq=%s&t=%s" % (
             group_code, self.vfwebqq, int(time.time() * 100))
         response = self.client.get(url)
         logger.debug("get_group_member_info_list info response: {}".format(
             response))
         rsp_json = json.loads(response)
         retcode = rsp_json["retcode"]
         if retcode == 0:
             result = rsp_json["result"]
         elif retcode == 6:
             logger.debug(
                 "get_group_member_info_list retcode is 6, trying to get true code."
             )
             result = self.get_group_member_info_list(
                 self.get_true_group_code(group_code))
         else:
             logger.warning("group_code error.")
             return
         self.group_member_info[str(
             group_code)] = result  # 缓存群成员信息, 此处会把真假group_code都加入cache
         return result
     except Exception as ex:
         logger.warning("get_group_member_info_list. Error: " + str(ex))
         return
예제 #50
0
def weather(msg, bot):
    global query

    match = re.match(six.text_type("^(weather|天气) (.*)"), msg.content)
    if match:
        logger.info("RUNTIMELOG 查询天气...")
        command = match.group(1)
        city = match.group(2)
        logger.info("RUNTIMELOG 查询天气语句: " + msg.content)
        if command == "weather" or command == six.text_type("天气"):
            try:
                city_name = parse.quote(city.encode("utf-8"))
                url_str = "http://api.map.baidu.com/telematics/v3/weather?location={city}&ak={key}&output=json".format(
                    city=city_name, key=KEY
                )
                response = request.urlopen(url_str)
                data_html = response.read()
                logger.debug("RESPONSE {}".format(data_html))
                json_result = json.loads(data_html.decode("utf-8"))["results"][0]

                str_data = ""
                str_data += json_result["currentCity"] + " PM:" + json_result["pm25"] + "\n"
                try:
                    str_data += json_result["index"][0]["des"] + "\n"
                except:
                    pass

                for data in json_result["weather_data"]:
                    str_data += data["date"] + " "
                    str_data += data["weather"] + " "
                    str_data += data["wind"] + " "
                    str_data += data["temperature"]
                    str_data += "\n"
            except Exception as ex:
                logger.debug(ex)
                str_data = "City not found :("

            bot.reply_msg(msg, str_data)
            return True
    return False
예제 #51
0
def weather(msg, bot):
    global query

    match = re.match(ur'^(weather|天气) (\w+|[\u4e00-\u9fa5]+)', msg.content)
    if match:
        logger.info("RUNTIMELOG 查询天气...")
        command = match.group(1)
        city = match.group(2)
        logger.info("RUNTIMELOG 查询天气语句: " + msg.content)
        if command == 'weather' or command == u'天气':
            try:
                city_name = urllib2.quote(city.encode('utf-8'))
                url_str = "http://api.map.baidu.com/telematics/v3/weather?location={city}&ak={key}&output=json".format(
                    city=city_name,
                    key=KEY
                )
                response = urllib2.urlopen(url_str)
                data_html = response.read()
                logger.debug("RESPONSE " + data_html)
                json_result = json.loads(data_html)['results'][0]

                str_data = ""
                str_data += json_result['currentCity'] + " PM:" + json_result['pm25'] + "\n"
                try:
                    str_data += json_result["index"][0]['des'] + "\n"
                except:
                    pass

                for data in json_result["weather_data"]:
                    str_data += data['date'] + " "
                    str_data += data['weather'] + " "
                    str_data += data['wind'] + " "
                    str_data += data['temperature']
                    str_data += '\n'
            except:
                str_data = "Not found city"

            bot.reply_msg(msg, str_data)
            return True
    return False
예제 #52
0
def weather(msg, bot):
    global query

    match = re.match(ur'^(weather|天气) (\w+|[\u4e00-\u9fa5]+)', msg.content)
    if match:
        logger.info("RUNTIMELOG 查询天气...")
        command = match.group(1)
        city = match.group(2)
        logger.info("RUNTIMELOG 查询天气语句: " + msg.content)
        if command == 'weather' or command == u'天气':
            try:
                city_name = urllib2.quote(city.encode('utf-8'))
                url_str = "http://api.map.baidu.com/telematics/v3/weather?location={city}&ak={key}&output=json".format(
                    city=city_name, key=KEY)
                response = urllib2.urlopen(url_str)
                data_html = response.read()
                logger.debug("RESPONSE " + data_html)
                json_result = json.loads(data_html)['results'][0]

                str_data = ""
                str_data += json_result['currentCity'] + " PM:" + json_result[
                    'pm25'] + "\n"
                try:
                    str_data += json_result["index"][0]['des'] + "\n"
                except:
                    pass

                for data in json_result["weather_data"]:
                    str_data += data['date'] + " "
                    str_data += data['weather'] + " "
                    str_data += data['wind'] + " "
                    str_data += data['temperature']
                    str_data += '\n'
            except:
                str_data = "Not found city"

            bot.reply_msg(msg, str_data)
            return True
    return False
예제 #53
0
    def search_group_members(self, group_id):
        """
        获取群成员详细信息的的列表, u为真实QQ号, 并存入cache
        :type group_id: str
        :return:list

        return list sample
        [
            {
                  "b": 0,
                  "g": 0,
                  "n": "昵称",
                  "u": 466331426
            },
            {
                  "b": 0,
                  "g": 0,
                  "n": "昵称",
                  "u": 493658565
            }
        ]
        """
        url = "http://qinfo.clt.qq.com/cgi-bin/qun_info/get_group_members_new"
        data = {
            'bkn': self.bkn,
            'gc': str(group_id),
            'u': self._self_info.get('uin'),
        }
        response = self.client.post(
            url, data=data, refer='http://qinfo.clt.qq.com/member.html')
        logger.debug("search_group_members response: {}".format(response))
        response = unescape_json_response(response)
        rsp_json = json.loads(response)
        if rsp_json['ec'] == 0:
            return rsp_json.get('mems', [])
        else:
            logger.warning(
                "search_group_members code unknown: {}".format(response))
            return None
예제 #54
0
파일: main.py 프로젝트: he0119/SmartQQBot
def main_loop(no_gui=False,
              new_user=False,
              debug=False,
              http=False,
              password=False):
    if debug:
        logger.setLevel(logging.DEBUG)
    else:
        logger.setLevel(logging.INFO)
    if http:
        run_http_daemon()
    logger.info("Initializing...")
    plugin_manager.load_plugin()
    if new_user:
        clean_cookie()
    bot.login(no_gui, password)
    observer = MessageObserver(bot)

    for name, func in bot_inited_registry.items():
        try:
            t = threading.Thread(target=func, args=(bot, ))
            t.daemon = True
            t.start()
        except Exception:
            logging.exception("Error occurs while loading plugin [%s]." % name)
    while True:
        try:
            msg_list = bot.check_msg()
            if msg_list is not None:
                observer.handle_msg_list(
                    [mk_msg(msg, bot) for msg in msg_list])
        except ServerResponseEmpty:
            continue
        except (socket.timeout, IOError):
            logger.debug("Message pooling timeout, retrying...")
        except NeedRelogin:
            exit(0)
        except Exception:
            logger.exception("Exception occurs when checking msg.")
예제 #55
0
def Wiki(msg,bot):
    (account,account_type)=utils.get_account_and_type(msg)
    if utils.in_plugins(account,account_type,plugins_name):
        if utils.is_match('^(百科|Wiki|wiki) (.*)$',msg.content):
            p['srsearch']=utils.is_match('^(百科|Wiki|wiki) (.*)$',msg.content).group(2)
            tmp=requests.get(url,p,proxies=proxies)
            try:
                params['search']=json.loads(tmp.text)['query']['search'][0]['title']
            except:
                params['search']=p['srsearch']
            logger.info('[Wiki] Searching: '+params['search']+' for '+account_type+': '+account)
            tmp=requests.get(url,params=params,proxies=proxies)
            if tmp.status_code==200:
                try:
                    result=json.loads(tmp.text)[2][0]
                    if result!='':
                        bot.reply_msg(msg,result)
                    else:
                        bot.reply_msg(msg,'未找到相关信息哦~')
                except Exception as e:
                    logger.debug(e)
            else:
                bot.reply_msg(msg,"网络出错了哦~")
예제 #56
0
파일: bot.py 프로젝트: SKnife/SmartQQBot
    def check_msg(self):

        # Pooling the message
        response = self.client.post(
            'http://d1.web2.qq.com/channel/poll2',
            {
                'r': json.dumps(
                    {
                        "ptwebqq": self.ptwebqq,
                        "clientid": self.client_id,
                        "psessionid": self.psessionid,
                        "key": ""
                    }
                )
            },
            SMART_QQ_REFER
        )
        logger.debug("Pooling returns response: %s" % response)
        if response == "":
            return
        try:
            ret = json.loads(response)
        except ValueError:
            logger.warning("RUNTIMELOG decode poll response error.")
            logger.debug("RESPONSE {}".format(response))
            return

        ret_code = ret['retcode']

        if ret_code in (0, 116):
            self._last_pool_success = True
            if ret_code == 0:
                if 'result' not in ret or len(ret['result']) == 0:
                    logger.info("Pooling ends, no new message received.")
                else:
                    return ret['result']
            elif ret_code == 116:
                self.ptwebqq = ret['p']
                logger.debug("ptwebqq updated in this pooling")
        else:
            self._last_pool_success = False
            if ret_code in (103, ):
                logger.warning("Pooling received retcode: " + str(ret_code))
            elif ret_code in (121,):
                logger.warning("Pooling error with retcode %s" % ret_code)
            elif ret_code == 100006:
                logger.error("Pooling request error, response is: %s" % ret)
            else:
                logger.warning("Pooling returns unknown retcode %s" % ret_code)
        return None
예제 #57
0
파일: bot.py 프로젝트: Akizukii/SmartQQBot
    def get_group_list_with_group_code(self):
        """
        获取包含群名和group_code的列表, 并存入cache, 其中code为group_code
        :type group_code: str
        :return:list
        [
            {
                u 'code': 1131597161, # 这是真实group_code
                u 'flag': 184550417,
                u 'gid': 1802239929,  # 这是msg.group_code, 即假group_code
                u 'name': u '测试'
            },
            {
                u 'code': 1131597161,
                u 'flag': 184550417,
                u 'gid': 1802239929,
                u 'name': u '测试'
            }
        ]
        """

        def _hash_digest(uin, ptwebqq):
            """
            计算hash,貌似TX的这个算法会经常变化,暂时不使用
            get_group_code_list 会依赖此数据
            提取自http://pub.idqqimg.com/smartqq/js/mq.js
            :param uin:
            :param ptwebqq:
            :return:
            """
            N = [0, 0, 0, 0]
            # print(N[0])
            for t in range(len(ptwebqq)):
                N[t % 4] ^= ord(ptwebqq[t])
            U = ["EC", "OK"]
            V = [0, 0, 0, 0]
            V[0] = int(uin) >> 24 & 255 ^ ord(U[0][0])
            V[1] = int(uin) >> 16 & 255 ^ ord(U[0][1])
            V[2] = int(uin) >> 8 & 255 ^ ord(U[1][0])
            V[3] = int(uin) & 255 ^ ord(U[1][1])
            U = [0, 0, 0, 0, 0, 0, 0, 0]
            for T in range(8):
                if T % 2 == 0:
                    U[T] = N[T >> 1]
                else:
                    U[T] = V[T >> 1]
            N = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]
            V = ""
            for T in range(len(U)):
                V += N[U[T] >> 4 & 15]
                V += N[U[T] & 15]
            return V


        logger.info("RUNTIMELOG Requesting the group list.")
        response = self.client.post(
            'http://s.web2.qq.com/api/get_group_name_list_mask2',
            {
                'r': json.dumps(
                    {
                        "vfwebqq": self.vfwebqq,
                        "hash": _hash_digest(self._self_info['uin'], self.ptwebqq),
                    }
                )
            },
        )
        try:
            response = json.loads(response)
        except ValueError:
            logger.warning("RUNTIMELOG The response of group list request can't be load as json")
            return
        logger.debug("RESPONSE get_group_name_list_mask2 html:    " + str(response))
        if response['retcode'] != 0:
            raise TypeError('get_online_buddies2 result error')
        for group in response['result']['gnamelist']:
            self.group_code_list[str(group['gid'])] = group
            self.group_code_list[str(group['code'])] = group

        return response['result']['gnamelist']
예제 #58
0
def Manager(msg,bot):
    #获取群号
    (account,account_type)=utils.get_account_and_type(msg)
    logger.debug('[Manager] account={0}, account_type={1}, send_uin={2}'.format(account,account_type,msg.send_uin))
    logger.debug(isManager(msg,account_type))
    if isManager(msg,account_type):
        if not utils.in_plugins(account,account_type,plugin_name) and utils.is_match(r'^!召唤 (.*)$',msg.content):
            #捕获昵称
            nickname=utils.is_match(r'^!召唤 (.*)$',msg.content).group(1)
            #将昵称和账号绑定
            sql.execute("insert into Nickname(account,nickname,content,suffix,account_type) values('{0}','{1}','{2}','{3}','{4}');".format(account,nickname,json.dumps(REPLY_CONTENT),json.dumps(REPLY_SUFFIX),account_type))
            #默认激活所有插件
            with open('./config/plugin.json','r') as f:
                plugin_list=json.load(f).get('plugin_on')
            for p in plugin_list:
                sql.execute("insert into plugins(account,plugin_name,account_type) values('{0}','{1}','{2}');".format(account,p,account_type))
            logger.info('[Manager] '+account_type+': '+account+' Manager success')
            bot.reply_msg(msg,'召唤'+nickname+'成功~')

        elif utils.in_plugins(account,account_type,plugin_name):
            if utils.is_match(r'^!召唤 (.*)$',msg.content):
                #捕获昵称
                nickname=utils.is_match(r'^!召唤 (.*)$',msg.content).group(1)
                bot.reply_msg(msg,'已经召唤过'+nickname+'啦~')

            #关闭插件
            elif utils.is_match(r'^!关闭 (.*)$',msg.content):
                #获取插件名称
                close_plugin_name=utils.is_match(r'^!关闭 (.*)$',msg.content).group(1)
                if close_plugin_name != 'Manager':
                    #从数据库中删除群号-插件关系
                    l=sql.fetch_all('select plugin_name from plugins where account="{0}" and account_type="{1}";'.format(account,account_type))
                    tmp=[]
                    for i in l:
                        tmp.append(i[0])
                    if close_plugin_name in tmp:
                        sql.execute("delete from plugins where account={0} and plugin_name='{1}' and account_type='{2}';".format(account,close_plugin_name,account_type))
                        logger.info('[Manager] '+account_type+': '+account+' inactivate '+close_plugin_name)
                        bot.reply_msg(msg,"关闭{0}插件成功~".format(close_plugin_name))
                    else:
                        bot.reply_msg(msg,close_plugin_name+'插件还没开启呢!')
                else:
                    bot.reply_msg(msg,'不能关闭Manager插件哦~')

            #启用插件
            elif utils.is_match(r'^!启用 (.*)$',msg.content):
                open_plugin_name=utils.is_match(r'^!启用 (.*)$',msg.content).group(1)
                tmp=sql.fetch_all('select plugin_name from plugins where account="{0}" and account_type="{1}";'.format(account,account_type))
                open_list=[]
                for i in open_list:
                    open_list.append(i[0])

                with open('./config/plugin.json','r') as f:
                    plugin_list=json.load(f).get('plugin_on')

                if open_plugin_name not in open_list and open_plugin_name in plugin_list:
                    sql.execute("insert into plugins(account,plugin_name,account_type) values ('{0}','{1}','{2}');".format(account,open_plugin_name,account_type))
                    logger.info('[Manager] '+account_type+': '+account+' Manager '+open_plugin_name)
                    bot.reply_msg(msg,"开启{0}插件成功~".format(open_plugin_name))
                elif open_plugin_name in open_list:
                    bot.reply_msg(msg,open_plugin_name+'已经在使用了哦~')
                else:
                    bot.reply_msg(msg,'别捣乱,哼哼~')

            #列出插件列表
            elif utils.is_match(r'^!已启用插件$',msg.content):
                l=sql.fetch_all('select plugin_name from plugins where account="{0}" and account_type="{1}";'.format(account,account_type))
                s="已启用插件:\n"
                for i in l:
                    s+=i[0]+'\n'
                bot.reply_msg(msg,s)

            #列出可用插件
            elif utils.is_match(r'^!可用插件$',msg.content):
                s=""
                with open('./config/plugin.json','r') as f:
                    plugin_list=json.load(f).get('plugin_on')
                tmp=sql.fetch_all('select plugin_name from plugins where account="{0}" and account_type="{1}";'.format(account,account_type))
                l=[]
                for i in tmp:
                    l.append(i[0])
                for p in plugin_list:
                    if p not in l:
                        s+=p+'\n'
                if s!="":
                    bot.reply_msg(msg,s)
                else:
                    bot.reply_msg(msg,'全部插件都启用了啦~')

            #添加管理人员
            elif account_type=='group' and utils.is_match(r'^!管理 add (\d{5,12})$',msg.content):
                manager_id=utils.is_match(r'^!管理 add (\d{5,12})$',msg.content).group(1)
                if sql.execute('select * from Manager where account_id={0} and group_id={1};'.format(manager_id,account)):
                    bot.reply_mag(msg,'已经是管理员啦~')
                else:
                    sql.execute('insert into Manager(account_id,group_id) values("{0}","{1}");'.format(manager_id,account))
                    bot.reply_msg(msg,"{0} 成功成为管理人员~".format(manager_id))

            #列出管理人员
            elif account_type=='group' and utils.is_match(r'^!管理 list$',msg.content):
                l=sql.fetch_all('select account_id from Manager where group_id={0};'.format(account))
                p=sql.fetch_all('select account_id from Manager where group_id="00000";')
                if p:
                    s='全局管理员:\n'
                    for i in p:
                        s+=i[0]+'\n'
                    if l:
                        s+='群管理员:\n'
                        for i in l:
                            s+=i[0]+'\n'
                    bot.reply_msg(msg,s)
                else:
                    bot.reply_msg(msg,"没有管理人员哦~")

            #删除管理人员
            elif account_type=='group' and utils.is_match(r'^!管理 remove (\d{5,12})$',msg.content):
                manager_id=utils.is_match(r'^!管理 remove (\d{5,12})$',msg.content).group(1)
                sql.execute('delete from Manager where account_id={0} and group_id={1};'.format(manager_id,account))
                bot.reply_msg(msg,'{0} 已不再是管理员。。。'.format(manager_id))

            elif utils.is_match(r'^!名字$',msg.content):
                nickname=sql.fetch_one('select nickname from Nickname where account="{0}" and account_type="{1}";'.format(account,account_type))[0]
                bot.reply_msg(msg,'我叫'+nickname+'!')

            #完全关闭
            elif utils.is_match(r'^!回去吧 (.*)$',msg.content):
                m_nickname=utils.is_match(r'^!回去吧 (.*)$',msg.content).group(1)
                nickname=sql.fetch_one('select nickname from Nickname where account="{0}" and account_type="{1}";'.format(account,account_type))[0]
                if m_nickname==nickname:
                    sql.execute('delete from plugins where account="{0}" and account_type="{1}";'.format(account,account_type))
                    bot.reply_msg(msg,nickname+'走了,拜拜~')
예제 #59
0
파일: bot.py 프로젝트: Akizukii/SmartQQBot
    def _login_by_qrcode(self, no_gui):
        logger.info("RUNTIMELOG Trying to login by qrcode.")
        logger.info("RUNTIMELOG Requesting the qrcode login pages...")
        qr_validation_url = 'https://ssl.ptlogin2.qq.com/ptqrlogin?' \
                            'webqq_type=10&remember_uin=1&login2qq=1&aid={0}' \
                            '&u1=http%3A%2F%2Fw.qq.com%2Fproxy.html%3Flogin2qq%3D1%26webqq_type%3D10' \
                            '&ptredirect=0&ptlang=2052&daid=164&from_ui=1&pttype=1&dumy=' \
                            '&fp=loginerroralert&action=0-0-{1}&mibao_css={2}' \
                            '&t=undefined&g=1&js_type=0&js_ver={3}&login_sig={4}'

        init_url = "https://ui.ptlogin2.qq.com/cgi-bin/login?" \
                   "daid=164&target=self&style=16&mibao_css=m_webqq" \
                   "&appid=501004106&enable_qlogin=0&no_verifyimg=1" \
                   "&s_url=http%3A%2F%2Fw.qq.com%2Fproxy.html" \
                   "&f_url=loginerroralert&strong_login=1" \
                   "&login_state=10&t=20131024001"
        html = self.client.get(
            init_url,
        )
        appid = find_first_result(
            html,
            r'<input type="hidden" name="aid" value="(\d+)" />', 'Get AppId Error',
            True
        )
        sign = find_first_result(
            html,
            r'g_login_sig=encodeURIComponent\("(.*?)"\)', 'Get Login Sign Error',
        )
        js_ver = find_first_result(
            html,
            r'g_pt_version=encodeURIComponent\("(\d+)"\)',
            'Get g_pt_version Error',
            True,
        )
        mibao_css = find_first_result(
            html,
            r'g_mibao_css=encodeURIComponent\("(.+?)"\)',
            'Get g_mibao_css Error',
            True
        )

        star_time = date_to_millis(datetime.datetime.utcnow())

        error_times = 0
        ret_code = None
        login_result = None
        redirect_url = None

        while True:
            error_times += 1
            logger.info("Downloading QRCode file...")
            self.client.download(
                'https://ssl.ptlogin2.qq.com/ptqrshow?appid={0}&e=0&l=L&s=8&d=72&v=4'.format(appid),
                self.qrcode_path
            )
            if not no_gui:
                thread = Thread(target=show_qr, args=(self.qrcode_path, ))
                thread.setDaemon(True)
                thread.start()

            while True:
                ret_code, redirect_url = self._get_qr_login_status(
                    qr_validation_url, appid, star_time, mibao_css, js_ver,
                    sign, init_url
                )

                if ret_code in (
                        QR_CODE_STATUS['succeed'], QR_CODE_STATUS["qr_code_expired"]
                ):
                    break
                time.sleep(1)

            if ret_code == QR_CODE_STATUS['succeed'] or error_times > 10:
                break

        if os.path.exists(self.qrcode_path):
            os.remove(self.qrcode_path)

        login_failed_tips = "QRCode validation response is:\n%s" % login_result

        if ret_code is not None and (ret_code != 0):
            raise QRLoginFailed(login_failed_tips)
        elif redirect_url is None:
            raise QRLoginFailed(login_failed_tips)
        else:
            html = self.client.get(redirect_url)
            logger.debug("QR Login redirect_url response: %s" % html)
            return True