Exemple #1
0
    def _get_chat_by_user_name(self, user_name):
        """
        通过 user_name 找到对应的聊天对象

        :param user_name: user_name
        :return: 找到的对应聊天对象
        """
        def match_in_chats(_chats):
            for c in _chats:
                if c.user_name == user_name:
                    return c

        _chat = None

        if user_name.startswith('@@'):
            _chat = match_in_chats(self.bot.groups())
        elif user_name:
            _chat = match_in_chats(self.bot.friends())
            if _chat is None:
                _chat = match_in_chats(self.bot.mps())

        if _chat is None:
            _chat = Chat(wrap_user_name(user_name), self.bot)

        return _chat
Exemple #2
0
    def _get_chat_by_user_name(self, user_name):
        """
        通过 user_name 找到对应的聊天对象

        :param user_name: user_name
        :return: 找到的对应聊天对象
        """

        def match_in_chats(_chats):
            for c in _chats:
                if c.user_name == user_name:
                    return c

        _chat = None

        if user_name.startswith('@@'):
            _chat = match_in_chats(self.bot.groups())
        elif user_name:
            _chat = match_in_chats(self.bot.friends())
            if not _chat:
                _chat = match_in_chats(self.bot.mps())

        if not _chat:
            _chat = Chat(wrap_user_name(user_name), self.bot)

        return _chat
Exemple #3
0
    def create_group(self, users, topic=None):
        """
        创建一个新的群聊

        :param users: 用户列表
        :param topic: 群名称
        :return: 若建群成功,返回一个新的群聊对象
        :rtype: :class:`wxpy.Group`
        """

        logger.info('{}: creating group (topic: {}), with users:\n{}'.format(
            self, topic, pformat(users)))

        @handle_response()
        def request():
            return self.core.create_chatroom(memberList=dict_list,
                                             topic=topic or '')

        dict_list = wrap_user_name(self.except_self(ensure_list(users)))
        ret = request()
        user_name = ret.get('ChatRoomName')
        if user_name:
            return Group(self.core.update_chatroom(userName=user_name), self)
        else:
            raise Exception('Failed to create group:\n{}'.format(pformat(ret)))
Exemple #4
0
    def post_login(self, dump=True):
        self.core.web_init()
        self.core.show_mobile_login()
        self.core.get_contact(True)
        if dump:
            self.core.start_receiving(self.bot_logout)
        self.isLogging = False

        enhance_webwx_request(self)

        self.self = User(self.core.loginInfo['User'], self)
        self.file_helper = Chat(wrap_user_name('filehelper'), self)

        self.start()
        self.register_func()

        add_running_bot(self)

        self.cache_path = 'data/bots/%s.pkl' % self.self.name
        self.enable_puid("data/bots/%s.uid" % self.self.name)

        self.load_config("data/bots/%s.cfg" % self.self.name)

        if self.notify_dingding:
            cutt.send_dingding_msg('机器人 %s 上线了' % self.self.name, self.master_phone)

        if dump:
            self.file_helper.send('🤖️机器人上线了')
            self.dump_login_status(self.cache_path)
Exemple #5
0
    def __init__(self,
                 cache_path=None,
                 console_qr=False,
                 qr_path=None,
                 qr_callback=None,
                 login_callback=None,
                 logout_callback=None):
        """
        :param cache_path:
            * 设置当前会话的缓存路径,并开启缓存功能;为 `None` (默认) 则不开启缓存功能。
            * 开启缓存后可在短时间内避免重复扫码,缓存失效时会重新要求登陆。
            * 设为 `True` 时,使用默认的缓存路径 'wxpy.pkl'。
        :param console_qr:
            * 在终端中显示登陆二维码,需要安装 pillow 模块 (`pip3 install pillow`)。
            * 可为整数(int),表示二维码单元格的宽度,通常为 2 (当被设为 `True` 时,也将在内部当作 2)。
            * 也可为负数,表示以反色显示二维码,适用于浅底深字的命令行界面。
            * 例如: 在大部分 Linux 系统中可设为 `True` 或 2,而在 macOS Terminal 的默认白底配色中,应设为 -2。
        :param qr_path: 保存二维码的路径
        :param qr_callback: 获得二维码后的回调,接收参数: uuid, status, qrcode
        :param login_callback: 登陆成功后的回调,接收参数同上
        :param logout_callback: 登出时的回调,接收参数同上
        """

        self.core = itchat.Core()
        itchat.instanceList.append(self)

        enhance_connection(self.core.s)

        if cache_path is True:
            cache_path = 'wxpy.pkl'

        self.cache_path = cache_path

        if console_qr is True:
            console_qr = 2

        self.core.auto_login(hotReload=bool(cache_path),
                             statusStorageDir=cache_path,
                             enableCmdQR=console_qr,
                             picDir=qr_path,
                             qrCallback=qr_callback,
                             loginCallback=login_callback,
                             exitCallback=logout_callback)

        self.self = Friend(self.core.loginInfo['User'], self)
        self.file_helper = Chat(wrap_user_name('filehelper'), self)

        self.messages = Messages()
        self.registered = Registered(self)

        self.is_listening = False
        self.listening_thread = None

        self.temp_dir = tempfile.TemporaryDirectory(prefix='wxpy_')
        self.start()

        atexit.register(self._cleanup)
Exemple #6
0
    def remove_members(self, members):
        """
        从群聊中移除用户

        :param members: 待移除的用户列表或单个用户
        """

        return self.bot.core.delete_member_from_chatroom(
            self.user_name, ensure_list(wrap_user_name(members)))
Exemple #7
0
    def add_members(self, users, use_invitation=False):
        """
        向群聊中加入用户

        :param users: 待加入的用户列表或单个用户
        :param use_invitation: 使用发送邀请的方式
        """

        return self.bot.core.add_member_into_chatroom(
            self.user_name, ensure_list(wrap_user_name(users)), use_invitation)
Exemple #8
0
    def remove_members(self, members):
        """
        从群聊中移除用户

        :param members: 待移除的用户列表或单个用户
        """

        logger.info('removing {} from {}'.format(members, self))

        return self.bot.core.delete_member_from_chatroom(
            self.user_name, ensure_list(wrap_user_name(members)))
Exemple #9
0
    def add_members(self, users, use_invitation=False):
        """
        向群聊中加入用户

        :param users: 待加入的用户列表或单个用户
        :param use_invitation: 使用发送邀请的方式
        """

        logger.info('adding {} into {} (use_invitation={}))'.format(
            users, self, use_invitation))

        return self.bot.core.add_member_into_chatroom(
            self.user_name, ensure_list(wrap_user_name(users)), use_invitation)
Exemple #10
0
    def remove_members(self, members):
        """
        从群聊中移除用户

        :param members: 待移除的用户列表或单个用户
        """

        logger.info('removing {} from {}'.format(members, self))

        return self.bot.core.delete_member_from_chatroom(
            self.user_name,
            ensure_list(wrap_user_name(members))
        )
Exemple #11
0
    def add_members(self, users, use_invitation=False):
        """
        向群聊中加入用户

        :param users: 待加入的用户列表或单个用户
        :param use_invitation: 使用发送邀请的方式
        """

        logger.info('adding {} into {} (use_invitation={}))'.format(users, self, use_invitation))

        return self.bot.core.add_member_into_chatroom(
            self.user_name,
            ensure_list(wrap_user_name(users)),
            use_invitation
        )
Exemple #12
0
 def request():
     return self.core.create_chatroom(
         memberList=ensure_list(wrap_user_name(users)),
         topic=topic or ''
     )