Пример #1
0
def test_wxpy():
    """
    """
    n_ret = ERR_FAIL
    n_ret_api = 0    
    desc = ""
    
    for nwf in [1]:
        
        try:
          
            # 导入模块
            from wxpy import Bot, MALE
            # 初始化机器人,扫码登陆
            bot = Bot()
            
            # 搜索名称含有 "游否" 的男性深圳好友
            my_friend = bot.friends().search('郑小霞', sex=MALE, city="深圳")[0]
            
            # 发送文本给好友
            my_friend.send('robot 男人的长寿是女人给的')
            # 发送图片
            my_friend.send_image('d:/frog.jpg')            
                  
                  
                                    
        except Exception as e:            
            logging.exception("An exception was thrown!")            
                        
    return n_ret
Пример #2
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()
Пример #3
0
def get_friends_signature(bot: wxpy.Bot) -> dict:

    signature_data = {}
    friends = bot.friends()
    for friend in friends:
        signature_data[friend.nick_name] = friend.signature
    return signature_data
Пример #4
0
def save_picture(path):
    bot = Bot()
    freinds = bot.friends(update=True)  #:rtype: :class:`wxpy.Chats`
    for freind in freinds:
        freind_name = freind.name
        # 获取每个好友的头像,以名称命名的话,同名的情况下会替换
        freind.get_avatar(path + '{}.jpg'.format(freind_name))
    print('微信头像获取完成!')
Пример #5
0
def send_note(bot: Bot):
    while True:
        with open(note_file) as fp:
            all_notes = fp.readlines()
            for text in all_notes:
                note = text.split(',')
                name = note[0]
                alert_time = note[1]
                alert_msg = note[2]
                friend = bot.friends().search(name)[0]
                if _should_send(alert_time):
                    friend.send(alert_msg)
                    all_notes.remove(text)
            fp.write('\n'.join(all_notes))
        news = [get_weekly_news(), get_hellogit_news()]
        friend = bot.friends().search('秦')[0]
        for new in news:
            friend.send(f'news: {new}')
        time.sleep(60 * 59)
Пример #6
0
def main():
    # 登录微信
    bot = Bot(cache_path=True)

    # 获取好友列表
    friends = bot.friends()

    # 下载好友头像
    down_img(friends)

    # 拼接好友头像
    show_img()
def main():
    bot = Bot()  #登录微信的命令
    my_friend = bot.friends()  #发给所有好友

    @bot.register(my_friend)
    def SHARING_Msg(msg):
        if msg.type == 'Sharing':

            msg.reply(msg.url)
        else:
            print('waiting......')

    embed()  #保持监听状态
Пример #8
0
def main():
    bot = Bot(cache_path=True)#扫描二维码登陆微信 #issue1195 avoiding scanning again shortly
    my_friend = bot.friends()#回复对象为所有好友
    @bot.register(my_friend)
    @bot.register(msg_types='Sharing')#监听好友分享的消息 why 'Sharing'expression? SHARING got errors why oh why? input distinguish problems again?
    def auto_reply(msg):
        response = requests.get(msg.url)#msg.url为分享的网址
        document = PyQuery(response.text)
        content = document('#js_content').text()
        #像d11一样处理文本
        result = sw.stats_text_cn(content,count=10)
        wechat_word = ''.join(str(i)for i in result) # seems better str this type in case causing trouble in reading
        return wechat_word#将结果返回给好友

    embed()#d堵塞线程,保持监听
def main():
    bot = Bot()  #登录微信的命令
    my_friend = bot.friends()  #发给所有好友

    @bot.register(my_friend)
    def SHARING_Msg(msg):
        if msg.type == 'Sharing':
            response = requests.get(msg.url)
            document = PyQuery(response.text)
            contect = document('#js_content').text()
            c = str(stats_word.stats_text(content, 10))
            msg.reply(c)
        else:
            print('waiting......')

    embed()  #保持监听状态
    print(msg)
Пример #10
0
def main():
    bot = Bot(cache_path=True)#扫描二维码登陆微信 #issue1195 avoiding scanning again shortly
    my_friend = bot.friends()#回复对象为所有好友
    @bot.register(my_friend)
    @bot.register(msg_types='Sharing')#监听好友分享的消息 why 'Sharing'expression? SHARING got errors why oh why? input distinguish problems again?
    
    def reply_my_friend(msg):
         
        wechat = requests.get(msg.url)
        document = PyQuery(wechat.text)
        content = document('#js_content').text()
#        result = sw.stats_text_cn(content,count=100)
#        wechat_word = ''.join(str(i)for i in result) # seems better str this type in case causing trouble in reading
#        return
        list_a = sw.stats_text_cn(content,100)#接收发来的分享链接的文字,并处理成词频统计结果
           
        msg.reply_image(chartImg(list_a)) #回复刚才保存的图片给好友        
        return

    embed()#让程序执行到这里后返回,以便于重新执行
Пример #11
0
def main():
    bot = Bot() #登录微信的命令
    my_friend = bot.friends() #发给所有好友

    @bot.register(my_friend)

    def SHARING_Msg(msg):
        print(msg)
        if msg.type == 'Sharing':
            response = requests.get(msg.url)
            document = PyQuery(response.text)
            content = document('#js_content').text()
            print('line 21 ==>',stats_word.stats_text(content,10))
            c=stats_word.stats_text(content,10)
            np_list=np.array(c)
            word_list=[]
            number_list=[]
            for i in range(len(np_list)):
                word_list+=[np_list[i][0]]
                number_list+=[int(np_list[i][1])]
            
            #为了能在matplotlib中显示中文,需要中文字体的支持
            font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=8)
            
            plt.rcdefaults()
            fig,ax=plt.subplots()
            y_pos=np.arange(len(word_list))

            ax.barh(y_pos,number_list,align='center',color='green',ecolor='black')
            ax.set_yticks(y_pos)
            ax.set_yticklabels(word_list,fontproperties=font)
            ax.invert_yaxis()
            ax.set_xlabel('词频',fontproperties=font)
            ax.set_title('词频统计',fontproperties=font)
            plt.savefig("stats.png")
            msg.reply_image("stats.png")
            
        else:
            print('waiting......')

    embed() #保持监听状态
Пример #12
0
    def get_friend():
        bot = Bot()
        friends = bot.friends(update=True)

        friend_data = []
        for friend in friends:
            if friend.sex == 1:
                sex = "男"
            elif friend.sex == 2:
                sex = "女"
            else:
                sex = ""
            friend_dict = {
                "city": friend.city,
                "province": friend.province,
                "sex": sex,
                "signature": friend.signature,
            }
            friend_data.append(friend_dict)

        return friend_data
Пример #13
0
    def get_friend():
        bot = Bot(console_qr=False)
        friends = bot.friends(update=True)

        friend_data = []
        for friend in friends:
            if friend.sex == 1:
                sex = '男'
            elif friend.sex == 2:
                sex = '女'
            else:
                sex = ''
            friend_dic = {
                "city": friend.city,
                "province": friend.province,
                "sex": sex,
                "signature": friend.signature
            }
            friend_data.append(friend_dic)

        return friend_data
Пример #14
0
import requests
from pyquery import PyQuery
from mymodule import stats_word
from wxpy import Bot, Message, embed
#初始化机器人,扫码登陆
bot = Bot()
#找到好友
my_friend = bot.friends().search('PrincessAKing')[0]
#发送文本给好友
my_friend.send('分享任意微信文章给我')


#监听消息
#回复my_friend的消息
@bot.register(my_friend)
def reply_my_friend(msg):
    if msg.type == 'Sharing':
        response = requests.get(msg.url)
        document = PyQuery(response.text)
        content = document('#js_content').text()
        reply = stats_word.stats_text_cn(content, 100)
        return reply


embed()
Пример #15
0
import time
from wxpy import Bot

bot = Bot()
my_friend = bot.friends().search('庄伟斌')[0]

for i in range(100):
    time.sleep(1)
    my_friend.send('Hello WeChat!' + str(i))

print(my_friend)
Пример #16
0
from wxpy import Bot,Message,embed

bot = Bot()
my_friend = bot.friends().search('武曲63')  #定位朋友
#预先注册,利用Bot.register()完成
#Bot.register(chats=None,msg_types=None,except_self=True,run_async=True,enable=True)
@bot.register(chats = my_friend,msg_types = 'Sharing',except_self = True)
def auto_reply(msg):
    import requests
    from pyquery import PyQuery
#r = requests.get('https://api.github.com/user', auth=('user', 'pass')) 官方事例
    response = requests.get(msg.url)
    document = PyQuery(response.text)
    content = document('#js_content').text()
    from mymodule.stats_word import stats_text as a
    msg1 = dict(a(content,20))
    
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.font_manager as fm
    import pandas as pd
    from pandas import DataFrame,Series
    plt.rcParams['font.sans-serif']=['SimHei']
    group_x = list(msg1.keys())
    group_y = list(msg1.values())
    df = pd.DataFrame(group_y,index = group_x)
    df.plot(kind = 'barh')
    
    plt.savefig('day13.png')
    
    msg.reply_image('day13.png')
Пример #17
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)
Пример #18
0
    from pyquery import PyQuery
    document = PyQuery(response.text)
    content = document('#js_content').text()

    #统计文章汉语词频
    output = stats_word.stats_text_cn(content, 100)
    output_str = str(output)
    return output_str


#导入wxpy 模块
from wxpy import Bot, Message, embed

bot = Bot()  #初始化机器人,扫码登录

my_friend = bot.friends().search('somebody')[0]  #搜索名称含有‘somebody’的微信好友
my_friend.send('Hello, please send me a message.')  #给微信好友发送信息


@bot.register(my_friend)  #装饰器,匹配好友,空默认匹配所有
def auto_reply(msg):
    '''This function aims to gain the url from weichat message

    and to reply  words frequency of Sharing Chinese articels.'''

    if msg.type == 'Sharing':  #只处理类型为Sharing的信息
        url = msg.url
        re_friend = data_cn(url)
        msg.reply(re_friend)  #给好友返回结果
    else:
        print("Your friend doesn't send a message")
Пример #19
0
from wxpy import Bot, Message, embed

bot = Bot()
my_friend = bot.friends().search('大牙')  #定位朋友


#预先注册,利用Bot.register()完成
#Bot.register(chats=None,msg_types=None,except_self=True,run_async=True,enable=True)
@bot.register(chats=my_friend, msg_types='Sharing', except_self=True)
def auto_reply(msg):
    import requests
    from pyquery import PyQuery
    #r = requests.get('https://api.github.com/user', auth=('user', 'pass')) 官方事例
    response = requests.get(msg.url)
    document = PyQuery(response.text)
    content = document('#js_content').text()
    from mymodule.stats_word import stats_text as a
    msg1 = a(content, 100)
    return msg1


embed()
Пример #20
0
        #             print('再等等')
        #             continue

        #     time.sleep(3)

        # print(list)
        # time.sleep(5)
        # if list == '预约':
        #     break

    # list_1 = list.find_elements_by_xpath('a')
    # for i in list_1:
    #     condition = i.get_attribute('title')
    #     print(condition)


if __name__ == '__main__':

    bot = Bot()

    me = bot.friends().search('我是地球人')[0]

    url = 'https://www.91160.com/doctors/index/docid-200161473.html'
    # url = 'https://www.91160.com/doctors/index/unit_id-200003204/dep_id-200055338/docid-200139309.html'

    order(url)

    bot.join()

    exit()
Пример #21
0
# -*- coding: utf-8 -*-
"""
Created on Fri Mar 16 08:22:17 2018

@author: Administrator
"""

# -*- coding: utf-8 -*-
"""
微信好友性别及位置信息
"""

#导入模块
from wxpy import Bot
'''Q
微信机器人登录有3种模式,
(1)极简模式:robot = Bot()
(2)终端模式:robot = Bot(console_qr=True)
(3)缓存模式(可保持登录状态):robot = Bot(cache_path=True)
'''
#初始化机器人,选择缓存模式(扫码)登录
robot = Bot(cache_path=True)

#获取好友
robot.chats()
#robot.mps()#获取微信公众号信息

#获取好友的统计信息
Friends = robot.friends()
print(Friends.stats_text())
Пример #22
0
import io
import sys
from collections import Counter
import jieba
import requests
from pyquery import PyQuery
import getpass
import yagmail
from wxpy import Bot, SHARING, embed
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

bot = Bot(login_callback=True)

my_friend = bot.friends().search('Steve')


@bot.register()  #打印来自好友的消息
def print_other(msg):
    print(msg)


@bot.register(my_friend)  #回复my_friend的消息
def reply_my_friend(msg):
    return 'received:{}({})'.format(msg.text, msg.type)


# 中文字频分析

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
from wxpy import Bot, Message, embed
import d11_training1

bot = Bot()

my_friend = bot.friends().search('老婆叶', city="深圳")[0]
my_friend.send('请分享文章,谢谢您!')


@bot.register(my_friend)
def get_msg(msg):
    if msg.type == 'Sharing':
        target_url = msg.url
        stats_msg = d11_training1.stats(target_url)
        msg.reply(stats_msg)
    else:
        pass


embed()
Пример #24
0
from threading import Thread
import time
'''
    使用图灵机器人自动回复消息:
        注册地址:http://www.tuling123.com/
'''

# 实例化,并登录微信,cache_path=True:缓存,并不需要每次都登录微信
bot = Bot(cache_path=True)

# 查找到要使用机器人来聊天的好友
# my_friend = ensure_one(bot.search(u'****'))

# friend_name_list = []
# # 获取好友
friends = bot.friends()
#
# for friend in friends:
#     friend_name_list.append(friend.name)

# 调用图灵机器人API   获取地址:http://www.tuling123.com/
tuling = Tuling(api_key='×××××××××××××××××××××××××××')


def handle_info(friend):
    # 使用图灵机器人自动与所有好友聊天
    # @bot.register([my_friend, Group], TEXT)
    # @bot.register([friend], msg_types=['TEXT', 'RECORDING', 'PICTURE'])
    @bot.register(friend)
    def reply_my_friend(msg):
Пример #25
0
    # 343bad09638b4d799bd876a77fca084b
    payload = {"key": api_key, "info": text, "userid": "666"}
    r = requests.post(url, data=json.dumps(payload))
    result = json.loads(r.content)
    if 'url' in result.keys():
        return "" + result["text"] + result["url"]
    else:
        return "" + result["text"]


# 登录缓存
bot = Bot(cache_path=True)
print('小新上线')

# 查找好友
my_friend = bot.friends().search('cute')[0]
print(my_friend)

# # 发送文本
# my_friend.send('Hello, WeChat!')
# # 发送图片
# my_friend.send_image('my_picture.png')
# # 发送视频
# my_friend.send_video('my_video.mov')
# # 发送文件
# my_friend.send_file('my_file.zip')
# # 以动态的方式发送图片
# my_friend.send('@img@my_picture.png')


@bot.register(my_friend)
Пример #26
0
from mymodule import stats_word
from wxpy import Bot, Message, embed
from pyquery import PyQuery
import requests

bot = Bot()   # 初始化机器人,扫码登录
my_friend = bot.friends().search('闫')[0]    # 查找好友
my_friend.send('分享任意微信文章给我')   # 发生文本给好友

# 监听消息
# 回复好友消息
@bot.register(my_friend)
def reply_my_friend(msg):
    if msg.type == 'Sharing':
        response = requests.get(msg.url)
        document = PyQuery(response.text)
        content = document('#js_content').text()
        reply = stats_word.stats_text_cn(content, 100)
    return reply
embed()


path = r'd:\用户目录\我的文档\GitHub\selfteaching-python-camp\exercises\1901010161\d11\mymodule\tang300.json'
with open(path, 'r', encoding='UTF-8') as f:     # byte编码的类型名称是 UTF-8
    read_date = f.read()


try:
    print('出现频率最高的前20个词: \n', stats_word.stats_text_cn(read_date, 20))
except ValueError:
    print('ValueError:type of argument is not string!')
Пример #27
0
from pyquery import PyQuery
import re
import jieba
from collections import Counter
from wxpy import Bot, Message, embed  #导入模块
import matplotlib.pyplot as plt
import numpy as np
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']  # 雅黑字体

bot = Bot()
my_friend = bot.friends()


@bot.register(my_friend, 'Sharing')
def print_others(msg):
    if msg.type == 'Sharing':
        response = requests.get(msg.url)
        document = PyQuery(response.text)
        content = document('p').text()
        content = re.sub('[a-zA-Z0-9’!"%&\'^\s+|\s+$()*+,-./:;,。?、…?“”‘’!]+',
                         "", content)
        seg_list = jieba.cut(content, cut_all=True)
        result = Counter()
        for seg in seg_list:
            if len(seg) > 1:
                result[seg] = result[seg] + 1
Пример #28
0
from wxpy import Bot, Message, embed  #导入模块
import d12_training1
# 初始化机器人,扫码登录
bot = Bot()

#搜索名称含有 "王小小" 的男性苏州好友
my_friend = bot.friends().search('王小小')[0]

print(my_friend)
my_friend.send('请给我分享一篇文章')


@bot.register(my_friend, 'Sharing')
def auto_reply(msg):
    url = msg.url
    print(url)
    stats_msg = d12_training1.stats(url)
    msg.reply(stats_msg)


embed()
Пример #29
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)
Пример #30
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('哈哈,我接受了你的好友请求')