Beispiel #1
0
def main():
    bot = Bot(cache_path=True, console_qr=2)
    bot.enable_puid('wxpy_puid.pkl')
    # 在 Web 微信中把自己加为好友
    # bot.self.add()
    # bot.self.accept()
    mygroup = bot.groups().search(group_name)[0]
    myfriend = bot.friends().search(u'明月')[0]

    @bot.register(mygroup)
    def print_group(msg):
        # msg.forward(myfriend)
        if msg.type == TEXT:
            # print msg
            username = msg.member.name
            en_from = msg.text.encode('utf-8')
            print '收到消息:', en_from
            if not isCN(en_from):
                cn_from = bd_translate(en_from, 'en', 'zh')
                cn_chatbot = xiaoi_chatbot(cn_from, username)
                cn_chatbot = cn_chatbot.replace('\n', ' ')
                en_chatbot = bd_translate(cn_chatbot, 'zh', 'en')
                # print '翻译结果:', en_chatbot
                save_record(username, en_from, cn_from, cn_chatbot, en_chatbot)
                return en_chatbot + '\n' + '(翻译:' + cn_chatbot + ')'

    bot.join()
Beispiel #2
0
class MyThread(QtCore.QThread):
    _signal_1 = QtCore.pyqtSignal(bool, str,
                                  int)  # 定义信号,用于记录聊天信息,含:是否群聊,消息内容,消息时间
    _signal_2 = QtCore.pyqtSignal(str)  # 定义信号,仅用于传出用户名
    _signal_3 = QtCore.pyqtSignal(str)  # 定义信号,用于记录远控信息
    _signal_4 = QtCore.pyqtSignal(list)  # 定义信号,用于记录好友列表
    _signal_5 = QtCore.pyqtSignal(list)  # 定义信号,用于记录群聊列表
    _signal_6 = QtCore.pyqtSignal(str)  # 定义信号,用于截图

    def __int__(self, parent=None):
        super(MyThread, self).__init__()

    def run(self):
        self.bot = Bot(cache_path=True)
        self.myself = self.bot.self
        self._signal_2.emit(self.myself.name)
        self.get_friendslist()
        self.get_chatroomslist()

        ############################
        # 处理接收到的微信消息
        ############################
        # @self.bot.register(msg_types=TEXT,except_self=False)
        # def just_print(msg):
        #     print(msg)

        # 私聊信息,文字
        @self.bot.register(msg_types=TEXT, except_self=False)
        def get_msg(msg):
            fromChatroom = False
            #print(msg)
            if msg.sender.name == self.myself.name:
                # 这是我发出的消息
                from_Name = '我'
                if msg.receiver.name == '文件传输助手':
                    to_Name = '助手'
                    if '#' in msg.text and myshow.remote_pc == True:  # 执行命令条件:1发给助手 2命令中带井号 3远控开启
                        do_what = msg.text.split('#')[1]  # 以#分割,取第二个元素,即:具体指令。
                        self.wechat_do(do_what)  # 调用微信远控的方法
                else:
                    to_Name = msg.chat.name
            elif msg.receiver.name == self.myself.name:
                # 这是别人发给我的
                to_Name = '我'
                if msg.sender.name == '文件传输助手':
                    from_Name = '助手'
                else:
                    from_Name = msg.chat.name
                # 自动回复
                if myshow.reply_busy == True:  # 忙碌回复
                    msg_busy = myshow.lineEdit_busy.text()
                    msg.reply('[自动回复] %s' % msg_busy)
                if myshow.reply_robot == True:  # 机器人回复
                    myshow.tuling.do_reply(msg)  # 调用图灵机器人回复
            message = from_Name + '→' + to_Name + ':' + msg.text
            msg_time = msg.create_time
            #print(msg_time,type(msg_time),str(msg_time))  # wxpy的时间格式是datetime
            send_time = time.mktime(msg_time.timetuple())  #datetime转时间戳
            self._signal_1.emit(fromChatroom, message,
                                send_time)  # 信号焕发,连接 write_log

        # 私聊信息,图片、视频等
        @self.bot.register(chats=User,
                           msg_types=[PICTURE, RECORDING, ATTACHMENT, VIDEO])
        def download_files(msg):
            #print(msg)
            fromChatroom = False
            if msg.sender.name == self.myself.name:
                # 这是我发出的消息
                from_Name = '我'
                if msg.receiver.name == '文件传输助手':
                    to_Name = '助手'
                else:
                    to_Name = msg.chat.name
            elif msg.receiver.name == self.myself.name:
                # 这是别人发给我的
                to_Name = '我'
                if msg.sender.name == '文件传输助手':
                    from_Name = '助手'
                else:
                    from_Name = msg.chat.name
                # 自动回复
                if myshow.reply_busy == True:
                    msg_busy = myshow.lineEdit_busy.text()
                    msg.reply('[自动回复] %s' % msg_busy)
                if myshow.reply_robot == True:  # 机器人回复
                    myshow.tuling.do_reply(msg)
                    # 新建接收文件夹
            downloadDir = '接收文件'
            if not os.path.exists(downloadDir):  # 目录如果不存在
                os.makedirs(downloadDir)
            workPath = os.getcwd()  # 当前程序工作的路径
            downloadPath = os.path.join(workPath, downloadDir)  # 接收文件的路径
            os.chdir(downloadPath)  # 改变当前工作目录
            msg.get_file(msg.file_name)  # 下载文件
            os.chdir(workPath)
            message = from_Name + '→' + to_Name + ':' + '[文件: %s]' % msg.file_name
            msg_time = msg.create_time
            send_time = time.mktime(msg_time.timetuple())  #datetime转时间戳
            self._signal_1.emit(fromChatroom, message,
                                send_time)  # 信号焕发,连接 write_log

        # 群聊信息,@我的文字信息
        @self.bot.register(chats=Group, msg_types=TEXT)
        def get_msg_at(msg):
            #print(msg)
            if msg.is_at:
                #print(msg.member.name)
                if myshow.reply_busy == True:
                    msg_busy = myshow.lineEdit_busy.text()
                    msg.reply(u'@%s\u2005[自动回复] %s' %
                              (msg.member.nick_name, msg_busy))
                if myshow.reply_robot == True:
                    myshow.tuling.do_reply(msg)
                from_Name = msg.member.name  # 成员名
                chatroom_NickName = msg.chat.name  #群聊名
                fromChatroom = True
                message = '[' + chatroom_NickName + '] ' + from_Name + ' :' + msg.text
                msg_time = msg.create_time
                send_time = time.mktime(msg_time.timetuple())
                self._signal_1.emit(fromChatroom, message,
                                    send_time)  # 信号焕发,连接 write_log

        self.bot.join()  # 堵塞线程,这里不要用embed(),否则pyinstaller打包无窗口会报错

    # 获取好友列表
    def get_friendslist(self):
        friends_info = self.bot.friends(update=False)
        frinends_list = [friend.name for friend in friends_info
                         ]  # 好友列表 ['张三','Mango','李四']
        frinends_pinyin = [
            ''.join(lazy_pinyin(frinend)) for frinend in frinends_list
        ]  # 根据好友列表生成拼音列表 ['zhangsan','Mango','lisi']
        dict1 = dict(
            zip(frinends_pinyin, frinends_list)
        )  # 拼音列表和昵称列表并成字典 {'zhangsan':'张三','Mango':'Mango','lisi':'李四'}
        sort1 = sorted(dict1.items(), key=lambda x: x[0].lower(
        ))  # 转小写拼音排序 [('lisi','李四'),('Mango','Mango'),('zhangsan','张三')]
        friends_sorted = [i[1] for i in sort1]  # ['李四','Mango','张三']
        self._signal_4.emit(friends_sorted)

    #获取群聊列表
    def get_chatroomslist(self):
        chatrooms_info = self.bot.groups(update=False)
        chatrooms_list = [chatroom.name for chatroom in chatrooms_info]
        self._signal_5.emit(chatrooms_list)

    #######################################
    # 微信远程控制
    #######################################

    def wechat_do(self, do_what):
        '''判断并执行具体指令,格式为:命令@参数'''
        self._signal_3.emit('[接收指令] ' + do_what)
        remote_switch = {
            '帮助': self.read_me,
            '截图': self.img_to_myself,
            '关机': self.shutdown_pc,
            '取消关机': self.cancel_shutdown,
            '关闭网页': self.close_browser,
            '最小化窗口': self.send_win_d,
            '切换窗口': self.send_alt_tab,
            '打开': self.run_file,
            '关闭': self.shutdown_process,
            '网页': self.open_web,
            '控制': self.more_cmd,
            '忙碌回复开': self.reply_busy_on,
            '忙碌回复关': self.reply_busy_off,
            '机器人回复开': self.reply_robot_on,
            '机器人回复关': self.reply_robot_off
        }
        if '@' not in do_what:  # 不带参数的指令
            try:
                remote_switch[do_what]()
            except:
                pass
        elif '@' in do_what:  # 带参数的指令
            do_at_1 = do_what.split('@')[0]  # @分割,取第一个元素,即:指令
            do_at_2 = do_what.split('@')[1]  # 指令的参数
            try:
                remote_switch[do_at_1](do_at_2)
            except:
                pass

    def read_me(self):
        '''帮助信息'''
        readme_msg = '[帮助信息] 指令示例:\n' \
                     '#帮助\n' \
                     '#截图\n' \
                     '#关机\n' \
                     '#取消关机\n' \
                     '#打开@d:\\abc.txt\n' \
                     '#关闭@notepad\n' \
                     '#网页@www.baidu.com\n' \
                     '#关闭网页\n' \
                     '#控制@explorer c:\\windows\n' \
                     '#最小化窗口\n' \
                     '#切换窗口\n' \
                     '#忙碌回复开\n' \
                     '#忙碌回复关\n' \
                     '#机器人回复开\n' \
                     '#机器人回复关\n'
        self.bot.file_helper.send(readme_msg)  # 发送帮助信息
        self._signal_3.emit('[远控信息] 已发送帮助信息')

    def img_to_myself(self):
        '''截图并发送'''
        timeArray = time.localtime(time.time())
        now_time = time.strftime("%y/%m/%d %H:%M:%S", timeArray)
        time_msg = '时间: [%s]' % now_time
        filename_time = time.strftime("%y%m%d_%H%M%S",
                                      timeArray)  # 用时间来命名图片,格式中不能有/ : 和空格
        img_name = filename_time + '.png'
        self._signal_6.emit(img_name)  # 信号通知主线程截图
        QtCore.QThread.sleep(1)  # 等一下,等主线程截图...
        isImgExist = os.path.exists(img_name)  # 是否存在
        if not isImgExist:
            print('找不到截图文件')
            QtCore.QThread.sleep(1)  # 再等一等......
        self.bot.file_helper.send_image(img_name)  # 微信发送截图给自己
        # print('发送截图完成!')
        os.chdir(current_path)
        # print(os.getcwd())
        self.bot.file_helper.send(time_msg)  # 发送消息,截图时间
        self._signal_3.emit('[远控信息] 已发送截图')

    def shutdown_pc(self):
        '''本机关机'''
        os.system('shutdown -s -t 60')  # 执行计算机系统指令,这里是60秒后关机
        send_msg = '[远控信息] 60秒后电脑关机\n取消关机命令:\n#取消关机'  # 发送警告消息,提醒取消指令
        self.bot.file_helper.send(send_msg)
        self._signal_3.emit('[远控信息] 警告:60秒后关机')

    def cancel_shutdown(self):
        '''取消关机'''
        os.system('shutdown -a')
        send_msg = '[远控信息] 此次关机已取消'
        self.bot.file_helper.send(send_msg)
        self._signal_3.emit(send_msg)

    def run_file(self, do_at_2):
        '''打开文件或程序,文件位置套上英文双引号'''
        # file_cmd = '"' +do_at_2+ '"'
        file_cmd = 'start ' + do_at_2
        os.system(file_cmd)
        send_msg = '[远控信息] 已打开文件/程序:' + do_at_2
        self.bot.file_helper.send(send_msg)
        self._signal_3.emit(send_msg)

    def shutdown_process(self, do_at_2):
        '''关闭程序'''
        process_cmd = 'taskkill /f /t /im ' + do_at_2 + '.exe'
        os.system(process_cmd)
        send_msg = '[远控信息] 已关闭进程:' + do_at_2
        self.bot.file_helper.send(send_msg)
        self._signal_3.emit(send_msg)

    def open_web(self, do_at_2):
        '''浏览器打开网页'''
        # web_cmd = 'start https://' + do_at_2         # 可以使用默认浏览器打开网页,但接下来关闭浏览器进程时,需要作相应修改
        web_cmd = 'start iexplore https://' + do_at_2  # 使用IE打开网页
        os.system(web_cmd)
        send_msg = '[远控信息] 已打开网页:' + do_at_2
        self.bot.file_helper.send(send_msg)
        self._signal_3.emit(send_msg)

    def close_browser(self):
        '''关闭IE浏览器,其他浏览器请自行加入进程名'''
        # close_ie = 'tskill iexplore' # 需要设置环境变量
        close_ie = 'taskkill /f /t /im iexplore.exe'
        os.system(close_ie)
        send_msg = '[远控信息] 已关闭IE浏览器'
        self.bot.file_helper.send(send_msg)
        self._signal_3.emit(send_msg)

    def more_cmd(self, do_at_2):
        '''更多指令,即cmd命令,如:explorer是资源管理器,具体请百度cmd命令大全'''
        os.system(do_at_2)
        send_msg = '[远控信息] 已执行CMD指令:' + do_at_2
        self.bot.file_helper.send(send_msg)
        self._signal_3.emit(send_msg)

    def send_2key(self, key_1, key_2):
        '''发送键盘组合键,key_1,key_2,查按键码表'''
        win32api.keybd_event(key_1, 0, 0, 0)  # 键盘按下
        time.sleep(1)
        win32api.keybd_event(key_2, 0, 0, 0)  # 键盘按下
        time.sleep(1)
        win32api.keybd_event(key_2, 0, win32con.KEYEVENTF_KEYUP, 0)  # 键盘松开
        win32api.keybd_event(key_1, 0, win32con.KEYEVENTF_KEYUP, 0)  # 键盘松开
        # 不发送信息

    def send_win_d(self):
        '''发送组合键win+D,显示桌面,再按一次显示原程序窗口'''
        self.send_2key(91, 68)  # 查按键码表 win->91  d->68
        send_msg = '[远控信息] Win+D窗口最小化\n再次发送,还原窗口'
        self.bot.file_helper.send(send_msg)
        self._signal_3.emit('[远控信息] Win+D窗口最小化')

    def send_alt_tab(self):
        '''发送组合键alt+tab,切换窗口'''
        self.send_2key(18, 9)  # 查按键码表 win->91  d->68
        time.sleep(1)  # 等1秒再执行下面的截图
        self.img_to_myself()  # 发送截图
        send_msg = '[远控信息] 已切换程序窗口\n当前窗口见上图'
        self.bot.file_helper.send(send_msg)
        self._signal_3.emit('[远控信息] 已切换程序窗口')

    def reply_busy_on(self):
        '''打开忙碌回复'''
        myshow.checkBox_busy.setChecked(True)
        send_msg = '[远控信息] 已打开忙碌回复功能'
        self.bot.file_helper.send(send_msg)
        self._signal_3.emit(send_msg)

    def reply_busy_off(self):
        '''关闭忙碌回复'''
        myshow.checkBox_busy.setChecked(False)
        send_msg = '[远控信息] 已关闭忙碌回复功能'
        self.bot.file_helper.send(send_msg)
        self._signal_3.emit(send_msg)

    def reply_robot_on(self):
        '''打开机器人回复'''
        myshow.checkBox_robot.setChecked(True)
        send_msg = '[远控信息] 已打开机器人回复功能'
        self.bot.file_helper.send(send_msg)
        self._signal_3.emit(send_msg)

    def reply_robot_off(self):
        '''关闭机器人回复'''
        myshow.checkBox_robot.setChecked(False)
        send_msg = '[远控信息] 已关闭机器人回复功能'
        self.bot.file_helper.send(send_msg)
        self._signal_3.emit(send_msg)
Beispiel #3
0
class MyThread(QtCore.QThread):   
    _signal_1 = QtCore.pyqtSignal(bool,str,int)    # 定义信号,用于记录聊天信息,含:是否群聊,消息内容,消息时间    
    _signal_2 = QtCore.pyqtSignal(str)             # 定义信号,仅用于记录登陆成功的系统信息    
    _signal_3 = QtCore.pyqtSignal(str)             # 定义信号,用于记录远控信息
    _signal_4 = QtCore.pyqtSignal(list)            # 定义信号,用于记录好友列表
    _signal_5 = QtCore.pyqtSignal(list)            # 定义信号,用于记录群聊列表
    def __int__(self, parent=None):
        super(MyThread, self).__init__()


    def run(self):
        self.bot = Bot(cache_path=True)
        self.myself = self.bot.self
        self._signal_2.emit('成功登陆!账号:%s,可以关闭二维码了!' % self.myself.name)
        self.get_friendslist()
        self.get_chatroomslist()

        ##########################################################
        # 处理微信信息
        ##########################################################
        # @self.bot.register(msg_types=TEXT,except_self=False)
        # def just_print(msg):
        #     print(msg)

        # 私聊信息,文字
        @self.bot.register(msg_types=TEXT,except_self=False)
        def get_msg(msg):
            fromChatroom = False
            print(msg)
            if msg.sender.name== self.bot.self.name:
                # 这是我发出的消息
                from_Name = '我'
                if msg.receiver.name == '文件传输助手':
                    to_Name = '助手'
                    if '#' in msg.text and remote_pc == True:  # 执行命令条件:1发给助手 2命令中带井号 3远控开启
                        do_what = msg.text.split('#')[1]  # 以#分割,取第二个元素,即:具体指令。
                        wechat_do(do_what)  # 调用微信远控的方法
                else:
                    to_Name = msg.chat.name
            elif msg.receiver.name == self.bot.self.name:
                # 这是别人发给我的
                to_Name = '我'
                if msg.sender.name == '文件传输助手':
                    from_Name = '助手'
                else:
                    from_Name = msg.chat.name
                # 自动回复
                if reply_busy == True:  # 忙碌回复
                    msg_busy = myshow.lineEdit_busy.text()
                    msg.reply('[自动回复] %s' % msg_busy)
                if reply_robot == True:  # 机器人回复
                    myshow.tuling.do_reply(msg)
            message = from_Name + '→' + to_Name + ':' + msg.text
            send_time = msg.create_time
            self._signal_1.emit(fromChatroom, message, send_time)  # 信号焕发,连接 write_log


        # 私聊信息,图片、视频等
        @self.bot.register(msg_types=[PICTURE, RECORDING, ATTACHMENT, VIDEO])
        def download_files(msg):
            print(msg)
            fromChatroom = False
            if msg.sender.name == self.bot.self.name:
                # 这是我发出的消息
                from_Name = '我'
                if msg.receiver.name == '文件传输助手':
                    to_Name = '助手'
                else:
                    to_Name = msg.chat.name
            elif msg.receiver.name == self.bot.self.name:
                # 这是别人发给我的
                to_Name = '我'
                if msg.sender.name == '文件传输助手':
                    from_Name = '助手'
                else:
                    from_Name = msg.chat.name
                # 自动回复
                if reply_busy == True:
                    msg_busy = myshow.lineEdit_busy.text()
                    msg.reply('[自动回复] %s' % msg_busy)
                if reply_robot == True:  # 机器人回复
                    myshow.tuling.do_reply(msg)
                    # 新建接收文件夹
            downloadDir = '接收文件'
            if not os.path.exists(downloadDir):  # 目录如果不存在
                os.makedirs(downloadDir)
            workPath = os.getcwd()  # 当前程序工作的路径
            downloadPath = os.path.join(workPath, downloadDir)  # 接收文件的路径
            os.chdir(downloadPath)  # 改变当前工作目录
            msg.get_file(msg.file_name)  # 下载文件
            os.chdir(workPath)
            message = from_Name + '→' + to_Name + ':' + '[文件: %s]' % msg.file_name
            send_time = msg.create_time
            self._signal_1.emit(fromChatroom, message, send_time)  # 信号焕发,连接 write_log


        # 群聊信息,@我的文字信息
        @self.bot.register(chats=Group,msg_types=TEXT)
        def get_msg_at(msg):
            print(msg)
            if msg.is_at:
                print('333333')
                print(msg.member.name)
                if reply_busy == True:
                    msg_busy = myshow.lineEdit_busy.text()
                    msg.reply(u'@%s\u2005[自动回复] %s' % (msg.member.nick_name, msg_busy))
                if reply_robot == True:
                    myshow.tuling.do_reply(msg)
                from_Name = msg.member.name
                chatroom_NickName = msg.chat.name
                fromChatroom = True
                message = '[' + chatroom_NickName + '] ' + from_Name + ' :' + msg.text
                send_time = msg.create_time
                self._signal_1.emit(fromChatroom, message, send_time)  # 信号焕发,连接 write_log

        embed() # 堵塞线程


    # 获取好友列表
    def get_friendslist(self):
        friends_info = self.bot.friends(update=False)
        frinends_list = [friend.name for friend in friends_info]
        frinends_pinyin = [''.join(lazy_pinyin(frinend)) for frinend in frinends_list]  # 根据好友列表生成拼音列表
        dict1 = dict(zip(frinends_pinyin,frinends_list))    # 拼音列表和昵称列表并成字典,像这样 {'zhangsan':'张三','Mango':'Mango','lisi':'李四'}
        sort1 = sorted(dict1.items(),key=lambda x:x[0].lower())   # 按拼音排序,输出 [('lisi','李四'),('zhangsan','张三')]
        friends_sorted =[i[1] for i in sort1]  # ['李四','Mango','张三']
        self._signal_4.emit(friends_sorted)

    #获取群聊列表
    def get_chatroomslist(self):
        chatrooms_info = self.bot.groups(update=False)
        chatrooms_list = [chatroom.name for chatroom in chatrooms_info]
        self._signal_5.emit(chatrooms_list)
Beispiel #4
0
import time
import random

import requests
from wxpy import Bot, Friend, TEXT, MAP, CARD, NOTE, SHARING, PICTURE, RECORDING, ATTACHMENT, VIDEO, FRIENDS, embed

from baiduyuyin import post_recording, text_to_audio, get_response

pics = ([str(i) + '.gif'
         for i in range(1, 10)] + [str(j) + '.jpeg' for j in range(1, 4)] +
        [str(k) + '.jpg' for k in range(1, 3)])

bot = Bot(cache_path=True)

groups = []
group_1 = bot.groups().search('Iprintf 的大蟒蛇')
print(group_1)
if group_1:
    groups.append(group_1[0])
#  group_2 = bot.groups().search('南山吃鸡战斗群')[0]
group_3 = bot.groups().search('一家亲')
if group_3:
    groups.append(group_3[0])

print(groups)


@bot.register(chats=[Friend],
              msg_types=[
                  TEXT, MAP, CARD, NOTE, SHARING, PICTURE, RECORDING,
                  ATTACHMENT, VIDEO
Beispiel #5
0
class ChatManage:
    def __init__(self):
        # 登录缓存
        self.bot = Bot(cache_path=True)

    def send_msg_self(self):
        # 给机器人自己发送消息
        self.bot.self.send('Hello World!')
        # 给文件传输助手发送消息
        self.bot.file_helper.send('Hello World!')

    def get_friends(self, name=None):
        """
        获取通讯录对象
        :param name: 昵称
        :return: 好友对象列表
        :rtype: list
        """
        if not name:
            return self.bot.friends()
        return self.bot.friends().search(name)

    @print_def
    def get_friend_info(self, friends=None):
        """
        获取朋友详细信息
        :param friends:
        :return: [[姓名,昵称,性别,个性签名,城市]]
        """
        if not friends:
            friends = self.get_friends()
        friends_info = []
        for friend in friends:
            data = [
                friend.name,
                # friend.nick_name,
                # friend.sex,
                friend.signature,
                # friend.city,
            ]
            friends_info.append(data)
        return friends_info

    @print_def
    def get_friend_nums(self):
        """返回好友总数"""
        return len(self.get_friends())

    def get_groups(self, name=None):
        """获取所有群"""
        if not name:
            return self.bot.groups()
        return self.bot.groups.search(name)

    @print_def
    def get_group_info(self, groups=None):
        """
        获取群详细信息
        :param groups:
        :return:
        """
        if not groups:
            groups = self.get_groups()
        groups_info = []
        for group in groups:
            data = [
                group.members,
                group.name,
                group.owner.nick_name,
                [people.name for people in group.members],
            ]
            groups_info.append(data)
        return groups_info

    def get_mps(self, name=None):
        """获取公众号对象"""
        if not name:
            return self.bot.mps()
        return self.bot.mps().search(name)

    # @print_def
    def get_mps_info(self, mps_list=None):
        """
        获取公众号基本信息
        :param mps_list:
        :return: [[名称,昵称,地点,签名]]
        """
        if not mps_list:
            mps_list = self.get_mps()
        mps_info = []
        for mps in mps_list:
            data = [
                mps.name,
                mps.nick_name,
                mps.raw['Province'] + '-' + mps.raw['City'],
                mps.signature,
            ]
            mps_info.append(data)
        return mps_info

    def get_mps_nums(self):
        """获取公众号数量"""
        return len(self.get_mps())

    def send_div(self, friend, msg, sign='text'):
        """
        发送消息体
        :param friend:
        :param msg:
        :param sign:
        :return:
        """
        if sign == 'text':
            friend.send(msg)
        elif sign == 'img':
            # 发送图片 path 'my_picture.png'
            friend.send_image(msg)
        elif sign == 'video':
            # 发送视频 path 'my_video.mov'
            friend.send_video()
        elif sign == 'file':
            # 发送文件 path 'my_file.zip'
            friend.send_file()
        else:
            # 以动态的方式发送图片 '@img@my_picture.png'
            friend.send(msg)

    def get_now_msg(self):
        """
        获取实时消息
        :return:
        """
        @self.bot.register()
        def print_others(msg):
            print(msg)

    def reply_msg(self, friend):
        """
        自动回复
        :param friend: 好友对象
        :return:
        """

        # 回复 friend 的消息 (优先匹配后注册的函数!)
        @self.bot.register(friend)
        def reply_my_friend(msg):
            return 'received: {} ({})'.format(msg.text, msg.type)

    # 自动接受新的好友请求
    def auto_accept(self):
        @self.bot.register(msg_types=FRIENDS)
        def auto_accept_friends(msg):
            # 接受好友请求
            new_friend = msg.card.accept()
            # 向新的好友发送消息
            new_friend.send('哈哈,我接受了你的好友请求')
Beispiel #6
0
from wxpy import Bot, Tuling, embed, ensure_one

bot = Bot(cache_path=True)

# 想和机器人聊天的好友的备注
# my_friend = ensure_one(bot.search('Say Hello'))

# 记得把名字改成想用机器人的群
my_group = bot.groups().search('chatbot')[0]
tuling = Tuling(api_key='29fcb3f764504aea9301df5630ed52dd')


# 使用图灵机器人自动与指定好友聊天
@bot.register(my_group, except_self=False)
def reply_my_friend(msg):
    tuling.do_reply(msg)


embed()
Beispiel #7
0
    return 'received: {} ({})'.format(msg.text, msg.type)


# 打印出所有群聊中@自己的文本消息,并自动回复相同内容
# 这条注册消息是我们构建群聊机器人的基础
@bot.register(Group, TEXT)
def print_group_msg(msg):
    if msg.is_at:
        print(msg)
        msg.reply(msg.text)


# 获取所有类型的消息(好友消息、群聊、公众号,不包括任何自己发送的消息)
# 并将获得的消息打印到控制台
@bot.register()
def print_others(msg):
    print(msg)


# 通过机器人对象 Bot 的 chats(), friends(),groups(), mps() 方法, 可分别获取到当前机器人的 所有聊天对象、好友、群聊,以及公众号列表。
bot.chats()
bot.friends()
bot.groups()
bot.mps()

# 堵塞线程 进入Python 命令行 让程序保持运行
embed()

# 或者仅仅堵塞线程
# bot.join()
from wxpy import Bot, embed, ensure_one  # 微信机器人
import os
import codecs
import json

bot = Bot()
sex_dict = {}
sex_dict['0'] = "其他"
sex_dict['1'] = "男"
sex_dict['2'] = "女"
department_group = ensure_one(bot.groups().search('我们运维部'))
# 通常可用在查找聊天对象时,确保查找结果的唯一性,并直接获取唯一项
# 定位部门群
manager = ensure_one(
    department_group.search(nick_name='龙'))  # 定位部门经理,nick_name(精准名称)


def download_images(friend_list):  # 下载好友头像
    image_dir = 'info/' + bot.self.name + '/images/'
    for myfriend in friend_list:
        print('正在保存 %s 的头像...' % myfriend['NickName'])
        image_name = str(myfriend['NickName']) + '.jpg'
        img = bot.core.get_head_img(userName=myfriend["UserName"])
        with open(image_dir + image_name, 'wb') as file:
            file.write(img)


def save_data(frined_list):
    out_file_name = 'data/myfriends.json'
    with codecs.open(out_file_name, 'w', encoding='utf-8') as json_file:
        json_file.write(json.dumps(frined_list, ensure_ascii=False, indent=4))
Beispiel #9
0
import sys
import time

from wxpy import Bot
from database import db
from tools.hash_tools import hash_tool
from tools.oss2 import OSS2
from config.config import cfg

oss2 = OSS2(cfg['ACCESS_KEY_ID'], cfg['ACCESS_KEY_SECRET'])
oss2_url = cfg['OSS_URL']

robot = Bot(cache_path=True,
            console_qr=cfg.getint('CONSOLE_QR'),
            logout_callback=sys.exit)
robot.groups(update=True, contact_only=False)
groups = robot.groups()
itchat = robot.core


class GroupMember:
    def manager_group_member(self):
        print(
            "***************************** MANAGER_GROUP_MEMBER START ******************************"
        )
        if groups is not None and len(groups) > 0:
            # group_data_insert_list = []
            member_data_insert_list = []
            none_name_member_list = []
            for group_tmp in groups:
                print('group_name:{0}'.format(group_tmp.name))
group_name = []
msg = None
send_time = None

groups = []
log_msg = None
send_init_flag = False

msg_input = None
check_buttons = None
list_items = None
my_group = None

try:
    bot = Bot(cache_path=True)
    bot.groups(update=True, contact_only=False)
    groups = bot.groups()
    1/len(groups)
except:
    tk.messagebox.showerror(
        'Error', '登陆失败!请尝试登录网页版微信: https://wx.qq.com ,若网页版无法登录,则此脚本无法正常运行!')
    exit(-1)


gui_thread = threading.Thread(target=gui, name='gui_thread')
gui_thread.setDaemon(True)
gui_thread.start()

while not send_init_flag:
    pass
while True:
Beispiel #11
0
class Basic(tk.Tk):
    def __init__(self):
        super().__init__()
        self.v_tuling = tk.StringVar(self)
        self.v_documents = tk.StringVar(self)
        self.v_services = tk.StringVar(self)

        #变量定义
        self.chats = set()
        #一
        self.basic_frame = tk.Frame(self, bg="#8A2BE2")
        # self.basic_frame.pack(side=tk.TOP,fill=tk.BOTH,expand=1)
        self.basic_frame.bind("<1>", self.reset)
        self.basic_frame.bind("<3>", self.reset)

        self.bg_frame = tk.Frame(self)
        self.bg_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=1)

        # 背景图片指针
        self.bg_status = True
        self.bg_status_0_49 = 0
        self.bg_stop = False

        self.bg_files = ["bg/bg0" + str(i) + ".png" for i in range(50)]
        Bak.py_data_file("bg")
        self.photo = tk.PhotoImage(file=self.bg_files[self.bg_status_0_49])
        self.bg_label = tk.Label(self.bg_frame,
                                 image=self.photo,
                                 text="请点击扫码登陆微信",
                                 bg="black",
                                 fg="green",
                                 compound=tk.CENTER,
                                 font=("华文行楷", 20))
        self.bg_label.place(relx=0, rely=0, relheight=1, relwidth=1)

        #二
        self.login_button = tk.Button(self.bg_frame,
                                      bg="#4B0082",
                                      fg="black",
                                      text="登陆",
                                      command=self.login)
        self.login_button.place(relx=0.42,
                                rely=0.55,
                                relheight=0.1,
                                relwidth=0.2)
        #二
        self.basic_listbox = tk.Listbox(self.basic_frame,
                                        height=24,
                                        width=30,
                                        selectmode=tk.EXTENDED)
        self.basic_listbox.place(x=0, y=30)
        self.information = ["1、支持群聊、好友自动聊天功能", "2、支持下载手机群聊、好友文件", "3、提供服务监控功能"]
        for data in self.information:
            self.basic_listbox.insert(tk.END, data)
        self.scrollbar = tk.Scrollbar(self.basic_frame,
                                      orient="vertical",
                                      command=self.basic_listbox.yview)
        self.basic_listbox["yscrollcommand"] = self.scrollbar.set
        self.scrollbar.pack(side="right", fill="y")
        #绑定事件
        self.basic_listbox.bind("<ButtonPress-1>", self.listenBases)
        self.basic_listbox.bind("<Control-a>", self.listenBases)
        self.basic_listbox.bind("<Shift-Button-1>", self.listenBases)

        #群聊
        self.group = tk.Button(self.basic_frame,
                               bg="green",
                               fg="black",
                               text="群聊",
                               command=self.display_groups)
        self.group.place(x=0, y=0)
        #好友
        self.friend = tk.Button(self.basic_frame,
                                bg="green",
                                fg="black",
                                text="好友",
                                command=self.display_friends,
                                anchor="w")
        self.friend.place(x=29, y=0)
        #设置主窗体
        self.title("木火应")
        x = self.winfo_screenmmwidth()
        y = self.winfo_screenheight()
        self.geometry("500x500+%d+%d" % (x, y / 2 * 0.5))
        self.resizable(0, 0)
        self.datafriends, self.datagroups = ([], [])
        #显示列表
        self.v = tk.StringVar(self.basic_frame)
        self.display = tk.Label(self.basic_frame,
                                bg="green",
                                fg="black",
                                textvariable=self.v)
        #聊天机器人
        self.tulingbtn = tk.Button(self.basic_frame,
                                   textvariable=self.v_tuling,
                                   bg="#00FA9A",
                                   fg="black",
                                   stat="disable",
                                   command=self.tuling)
        self.v_tuling.set("聊天机器人")
        self.tulingbtn.place(x=215, y=100)
        #收集聊天文件
        self.documentsbtn = tk.Button(self.basic_frame,
                                      textvariable=self.v_documents,
                                      bg="#00FF7F",
                                      fg="black",
                                      stat="disable",
                                      command=self.documents)
        self.v_documents.set("收集聊天文件")
        self.documentsbtn.place(x=215, y=150)
        #服务监控
        self.servicesbtn = tk.Button(self.basic_frame,
                                     textvariable=self.v_services,
                                     bg="#66CDAA",
                                     fg="black",
                                     stat="disable",
                                     command=self.service)
        self.v_services.set("微信服务监控")
        self.servicesbtn.place(x=215, y=200)
        #隐藏self.basic_frame
        self.basic_frame.pack_forget()
        #机器人对象
        self.bot = None

        #生成二维码删除图标
        Bak.py_data_file("erweima.png")

    def chatTuling(self):
        raise Exception

    def reset(self, event):
        raise Exception

    def documents(self):
        raise Exception

    def tuling(self):
        raise Exception

    def service(self):
        raise Exception

    def listenBase(self, event):
        raise Exception

    def logout(self):
        raise Exception

    def bgFile(self):
        if self.bg_stop:
            return
        if self.bg_status:
            self.bg_status_0_49 += 1
        else:
            self.bg_status_0_49 -= 1
        if self.bg_status_0_49 == 49:
            self.bg_status = False
        if self.bg_status_0_49 == 0:
            self.bg_status = True
        self.photo.configure(file=self.bg_files[self.bg_status_0_49])
        self.after(30, self.bgFile)

    def tips(self):
        self.basic_listbox.delete(0, tk.END)
        self.basic_listbox.insert(tk.END, "微信掉线,正重新登陆!")
        self.friend["stat"] = "disable"
        self.group["stat"] = "disable"

    def display_friends(self):
        self.tulingbtn["stat"] = "active"
        self.documentsbtn["stat"] = "active"
        self.servicesbtn["stat"] = "active"
        if len(self.datafriends) > 0 or len(self.datagroups) > 0:
            self.basic_listbox.delete(0, tk.END)
            self.v.set("好友列表")
            self.display.place(x=90, y=0, height=30)
            self.friend["stat"] = "disable"
            self.group["stat"] = "active"
            for friend in self.datafriends:
                if friend:
                    self.basic_listbox.insert(tk.END, friend[0])
            return True
        else:
            self.tips()
            self.login()

    def display_groups(self):
        self.tulingbtn["stat"] = "active"
        self.documentsbtn["stat"] = "active"
        self.servicesbtn["stat"] = "active"
        if len(self.datafriends) > 0 or len(self.datagroups) > 0:
            self.basic_listbox.delete(0, tk.END)
            self.v.set("群聊列表")
            self.display.place(x=90, y=0, height=30)
            self.friend["stat"] = "active"
            self.group["stat"] = "disable"
            for group in self.datagroups:
                if group:
                    self.basic_listbox.insert(tk.END, group[0])
            return True
        else:
            self.tips()
            self.login()

    def login(self):
        self.bg_stop = True
        #机器人对象,有的微信无法登陆...
        self.bot = Bot(cache_path=True)
        try:
            location = pyautogui.locateOnScreen(image=Bak.erweima_png_path)
            x, y = pyautogui.center(location)
            pyautogui.click(x=x, y=y, clicks=1, button='left')
        except:
            pass

        try:
            #真实环境
            self.datafriends = self.friends()
            self.datagroups = self.groups()
        except:
            pass
        if len(self.datafriends) > 0 or len(self.datagroups) > 0:
            self.login_button.pack_forget()
            self.bg_frame.pack_forget()
            self.basic_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
            self.logout_button = tk.Button(self.basic_frame,
                                           width=10,
                                           text="退出",
                                           bg="red",
                                           fg="black",
                                           command=self.logout)
            self.logout_button.place(x=400, y=5)
            self.friend["stat"] = "active"
            self.group["stat"] = "active"
            self.basic_listbox.delete(0, tk.END)
            self.basic_listbox.insert(0, "恭喜,登陆成功!")
            return True
        else:
            msg.showerror("提示", "登陆失败,请稍后再试!")
            return False

    def friends(self):

        db_friend = (self.friends.__name__ + ".db", self.friends.__name__)
        if os.path.exists(db_friend[0]):
            names = self.load_tasks(*db_friend)
            if names[0][0] == Bak.regex_clear(
                    Bak.name_emoji(self.bot.self.nick_name)).strip():
                return names
            else:
                os.remove(db_friend[0])
                return self.init_friend(db_friend)
        return self.init_friend(db_friend)

    def init_friend(self, db_table):
        names = []
        friends = self.bot.friends()
        for friend in friends:
            names.append(
                Bak.regex_clear(Bak.name_emoji(friend.nick_name)).strip())
        Basic.connectDB(*db_table)
        for name in iter(names):
            self.save_task(*db_table, name)
        names = self.load_tasks(*db_table)
        return names

    def init_group(self, db_table):
        names = []
        groups = self.bot.groups()
        for group in groups:
            names.append(
                Bak.regex_clear(Bak.name_emoji(group.nick_name)).strip())
        Basic.connectDB(*db_table)
        for name in iter(names):
            self.save_task(*db_table, name)
        names = self.load_tasks(*db_table)
        return names

    def groups(self):
        db_group = (self.groups.__name__ + ".db", self.groups.__name__)
        if os.path.exists(db_group[0]):
            os.remove(db_group[0])
            return self.init_group(db_group)
        return self.init_group(db_group)

    def members(self):
        pass

    def save_task(self, namedb, table, task):

        insert_task_query = "INSERT INTO " + table + " VALUES (?)"
        insert_task_data = (task, )
        self.runQuery(insert_task_query, insert_task_data, namedb=namedb)

    def load_tasks(self, namedb, table):
        load_tasks_query = "SELECT name FROM " + table
        my_tasks = self.runQuery(load_tasks_query, receive=True, namedb=namedb)
        return my_tasks

    def delete_tasks(self, namedb, table, text):
        delete_task_query = "DELETE FROM " + table + " WHERE name=?"
        delete_task_data = (text.cget("text"), )
        self.runQuery(delete_task_query, delete_task_data, namedb=namedb)

    def delete_all(self):
        dbs = [self.friends.__name__ + ".db", self.groups.__name__ + ".db"]

    @staticmethod
    def runQuery(sql, data=None, receive=False, namedb=None):
        conn = sqlite3.connect(namedb)
        cursor = conn.cursor()
        if data:
            cursor.execute(sql, data)
        else:
            cursor.execute(sql)

        if receive:
            return cursor.fetchall()
        else:
            conn.commit()

        conn.close()

    @staticmethod
    def connectDB(namedb, table):
        create_tables = "CREATE TABLE " + table + "(name TEXT)"
        Basic.runQuery(create_tables, namedb=namedb)
Beispiel #12
0
class XWechat(object):
    def __init__(self, interval=0.5):
        self.db = MessageDb()
        self.bot = Bot(console_qr=True)
        self.bot.enable_puid("/tmp/wxpy_puid.pkl")
        self.interval = interval
        self.mwin = MainWindow(curses.initscr(), self.db)
        self.loop = asyncio.get_event_loop()
        self.executor = ThreadPoolExecutor()
        self.friends = self.bot.friends()
        self.groups = self.bot.groups()
        self.friends.extend(self.groups)
        self.mwin.rwin.friends = self.friends

    async def update_db(self):
        try:
            while True:
                if self.bot.messages.updated:
                    new_messages = [
                        _Message(m) for m in self.bot.messages if not m.read
                    ]
                    self.bot.messages.updated = False
                    self.db.process(new_messages)
                # wxpy retrieves messages every 0.5s, keep the db updating messages every 0.5s as well
                await asyncio.sleep(0.5)

        except CancelledError:
            return

    async def print_msg(self):
        try:
            while True:
                # query chaters which has sent messages to you after you login
                results = self.db.search_chats()
                chats = [
                    ensure_one(self.bot.search(puid=chat)) for chat in results
                ]
                non_none = lambda x: x is not None and x != ""
                self.mwin.rwin.chats = list(filter(non_none, chats))
                # query all received messages which will be displayed in the left screen
                self.mwin.lwin.messages = self.db.search_all()
                # if chose chater, then query all messages received from or sent to this chater
                if self.mwin.rwin.chater:
                    self.mwin.rwin.messages = self.db.search_user_msg(
                        self.mwin.rwin.chater.puid)
                self.mwin.update()
                # Make sure the cursor will back to the right bottom screen after updating the messages
                if self.mwin.rwin.is_typed:
                    self.mwin.rwin.right_bottom_screen.refresh()

                await asyncio.sleep(self.interval)

        except CancelledError:
            return

    async def listener_executor(self):
        # https://docs.python.org/3/library/asyncio-eventloop.html
        # The listener is a blocking function, calling the listener in a Executor
        # which is pool of threads will avoid blocking other tasks
        self.loop.set_default_executor(self.executor)
        await self.loop.run_in_executor(None, self.mwin.listener)

    async def asynchronous(self):
        tasks = [
            asyncio.ensure_future(task) for task in
            [self.listener_executor(),
             self.update_db(),
             self.print_msg()]
        ]
        done, pending = await asyncio.wait(tasks, return_when=FIRST_EXCEPTION)
        for pending_task in pending:
            pending_task.cancel()

        # listener is running in executor, can not cancel a running task inside executor,
        #   just manually exit the blocking process window.getch() by push 'q' to getch()
        if not self.mwin.isendwin:
            self.mwin.exit(raise_exception=False)

    def terminal(self):
        # Send 'q' to the listener of curses to raise a Exception
        #   so that asyncio.wait return and cancel all pending tasks
        self.mwin.exit(raise_exception=True)

    def cleanup(self):
        self.mwin.destroy()
        self.bot.logout()
        self.db.close()

    def run(self):
        try:
            self.loop.add_signal_handler(signal.SIGTERM, self.terminal)
            self.loop.add_signal_handler(signal.SIGINT, self.terminal)
            self.loop.run_until_complete(self.asynchronous())
            self.executor.shutdown(wait=True)
            self.loop.close()
        finally:
            self.cleanup()
Beispiel #13
0
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 13 18:55:04 2018

@author: Administrator
"""

from wxpy import Bot, Tuling, embed

bot = Bot(cache_path=True)
my_group = bot.groups().search('群聊名称')[0]  # 记得把名字改成想用机器人的群
tuling = Tuling(api_key='72bce33cb2b248a199d07175225a5264')  # 一定要添加,不然实现不了


@bot.register(my_group, except_self=False)  # 使用图灵机器人自动在指定群聊天
def reply_my_friend(msg):
    print(tuling.do_reply(msg))


embed()