diff --git a/FixedReply.py b/FixedReply.py new file mode 100644 index 0000000..b88a09b --- /dev/null +++ b/FixedReply.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- + +import time + +import XiaoIReply +import adminData + +#管理员手册 +handbook_admin = ''' +机器人主人: +01.私聊 启动/关闭机器人--------- + 发送:启动/休眠 +02.群聊 启动/关闭机器人--------- + 发送:@机器人 启动/休眠 +03.移出群成员--------- + 发送:@机器人 移出 @被移除成员 +04.私聊 添加/取消管理员--------- + 发送:添加管理员 @某朋友 +05.群聊 添加/取消管理员--------- + 发送:@机器人 添加管理员 @某成员 + +其他管理员: +06.私聊 关闭机器人一分钟--------- + 发送:休眠 +07.群聊 关闭机器人一分钟--------- + 发送:@机器人 休眠 + +所有管理员: +08.当前群回复/免打扰--------- + 发送:@机器人 免打扰/取消免打扰 +09.私聊 查看管理员列表--------- + 发送:管理员列表 +10.群聊 查看管理员列表--------- + 发送:@机器人 管理员列表 +11.私聊 查看管理员手册--------- + 发送:管理员手册 +12.群聊 查看管理员手册--------- + 发送:@机器人 管理员手册 +13.退出登录--------- + 发送:登出''' +# print(handbook_admin) + +#用户手册 娱乐 +handbook_user_entertainment = '''01.笑话大全------讲个笑话 +02.故事大全------讲个故事 +03..歇后语-------说个歇后语 +04.绕口令--------说个绕口令 +05.顺口溜--------说个顺口溜 +06.脑经急转弯----说个脑经急转弯 +07.天气查询------南京天气 +08.新闻资讯------今日新闻 +09.星座运势------天秤座运势 +10.吉凶查询------某个名字好不好 +11.生活百科------图灵机器人简介 +12.图片搜索------图灵机器人的图片 +13.成龙接龙------成语接龙一诺千金 +14.数字计算------3乘3等于多少 +15.日期查询------今天农历多少 +16.问答百科------天为什么蓝的 +17.中英互译------苹果的单词是什么 +18.影视搜索------最近热门电影''' + +#用户手册 实践 +handbook_user_practical = ''' +01.快递查询---查询快递123456789 +02.城市邮编---南京邮编 +03.菜谱查询---回锅肉怎么做 +04.果蔬报价---南京菠萝的价格 +05.股票查询---腾讯股票 +06.航班查询---今天南京到上海的飞机 +07.列车查询---今天重庆到南京的火车 +08.附近餐厅---南京江宁附近的餐厅 +09.附近酒店---南京江宁附近的餐厅 +10.实时路况---南京双龙大道堵车吗 +11.公交查询---南京南站到新街口的公交 +12.路程报价---从南京禄口机场到南京南站多少钱 +13.租房信息---在南京新街口附近租房 +14.汽油报价---重庆汽油的价格''' + +#准点报时 +def repot_time(group_free): + while 1: + hour = time.strftime('%H', time.localtime(time.time())) + minutes = time.strftime('%M', time.localtime(time.time())) + seconds = time.strftime('%S', time.localtime(time.time())) + + if (hour == '07' and minutes == '30' and seconds == '00'): + nowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + group_free[0].send( + '早上好!\n起床啦,为您整点报时:\n{}\n------------今日天气------------\n{}'.format(nowTime, XiaoIReply.text_reply('重庆沙坪坝区天气'))) + group_free[1].send( + '早上好!\n起床啦,为您整点报时:\n{}\n------------今日天气------------\n{}'.format(nowTime, XiaoIReply.text_reply('南京江宁区天气'))) + elif (hour == '13' and minutes == '30' and seconds == '00'): + nowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + for group in group_free: + group.send('下午好!\n该干活了,为您整点报时:\n{}\n------------轻松一下------------\n{}'.format(nowTime, XiaoIReply.text_reply('讲个笑话'))) + elif (hour == '00' and minutes == '00' and seconds == '00'): + nowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + for group in group_free: + group.send('晚上好!\nIt\'s 宵夜time,为您整点报时:\n{}\n----------晚安全世界----------'.format(nowTime)) + + time.sleep(1) + +#增加管理员函数 +def admin_add(robot_master,group_admin,name,name_temp): + if name in group_admin: + robot_master.send('当前管理员组--{}'.format(group_admin)) + return '[{}]已经是管理员,无需再次添加!'.format(name_temp) + else: + group_admin.append(name) + robot_master.send('当前管理员组--{}'.format(group_admin)) + adminData.admin_write(group_admin) + return '已添加[{}]为管理员'.format(name_temp) + +#取消管理员函数 +def admin_sub(robot_master,group_admin,name, name_temp): + for admin in group_admin: + if (admin == name): + group_admin.pop(group_admin.index(admin)) + robot_master.send('当前管理员组--{}'.format(group_admin)) + adminData.admin_write(group_admin) + return '已取消[{}]的管理员身份'.format(name_temp) + +# 验证入群口令 +def valid(msg): + return 'wechat' in msg.text.lower() + +# 新人欢迎消息 +welcome_text = '''******\U0001F389\U0001F389\U0001F389\U0001F389******\n + 欢迎 @{} 加入本群!\n\n*******************************''' diff --git a/TuLingReply.py b/TuLingReply.py new file mode 100644 index 0000000..b0304ea --- /dev/null +++ b/TuLingReply.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- + +#图灵机器人 +import json + +import requests +from wxpy import * + +tuling = Tuling(api_key='0d26f7c76ecf4623a536368eaf3d26ea') + +#图灵自动消息 +def auto_reply(msg): + tuling.do_reply(msg) + +#图灵机器人返回文本 +def text_reply(msg): + api_url = 'http://www.tuling123.com/openapi/api' + apikey = '0d26f7c76ecf4623a536368eaf3d26ea' + data = {'key': apikey,'info': msg} + req = requests.post(api_url, data=data).text + replys = json.loads(req)['text'] + return replys \ No newline at end of file diff --git a/WeChatRobot V2.0.py b/WeChatRobot V2.0.py new file mode 100644 index 0000000..f8bd6ea --- /dev/null +++ b/WeChatRobot V2.0.py @@ -0,0 +1,320 @@ +# -*- coding: utf-8 -*- + +import os +import re +import threading +import time + +from wxpy import * + +#本地py +import adminData +import FixedReply +import TuLingReply + +#微信机器人 +robot=Bot(True) + +# 定义远程管理员 (用于远程管理),使用备注名更安全 +admin_remark_name = "Husen" +admin_signature = '潜心修行,不卑不亢。' +robot_master = ensure_one(robot.friends().search(remark_name=admin_remark_name, signature=admin_signature)) + +# 获得一个专用 Logger +#当不设置 `receiver` 时,会将日志发送到随后扫码登陆的微信的"文件传输助手" +logger = get_wechat_logger(robot_master) + +#管理员组 +#group_admin=[robot_master] + +group_admin = adminData.admin_read(robot) +if robot_master not in group_admin: + group_admin.insert(0,robot_master) + +#robot_master.send('机器人主人--{}'.format(robot_master)) +robot_master.send('机器人上线\n当前管理员组--{}'.format(group_admin)) + +#mps = robot.mps(update=True) +group_1 = robot.groups().search('来呀。来呀。')[0] +#group_2 = robot.groups().search('只是爱要怎么说 出口')[0] +group_2 = robot.groups().search('421永不断片')[0] + +#不用艾特也可以接受消息的群组 +group_free = [group_1,group_2] + +#动态关闭除启动函数之外的注册函数 +def remote_down(): + robot.registered.disable() + robot.registered.enable(remote_up) + robot.registered.enable(remote_admin_up) + +#休眠一分钟 +def remote_down_minute(): + robot.registered.disable() + robot.registered.enable(remote_up) + robot.registered.enable(remote_admin_up) + + time.sleep(60) + robot.registered.enable() + +#开启所有注册函数 +def remote_reup(): + robot.registered.enable() + +# 远程启动函数 +@robot.register([Group]) +def remote_up(msg): + if (msg.is_at and msg.member == robot_master and '启动' in msg.text): + thread = threading.Thread(target=remote_reup) + thread.start() + thread.join() + return '已启动' + else: + return + +#远程管理员发送消息启动 +@robot.register(robot_master) +def remote_admin_up(msg): + if ('启动' in msg.text): + thread = threading.Thread(target=remote_reup) + thread.start() + thread.join() + return '已启动' + +# 回复来自其他好友(不包括管理员)的消息 +@robot.register([Friend]) +def reply_my_friend(msg): + if('用户手册 娱乐' in msg.text): + return FixedReply.handbook_user_entertainment + elif('用户手册 实用' in msg.text): + return FixedReply.handbook_user_practical + elif FixedReply.valid(msg): + invite(msg.sender) + else: + TuLingReply.auto_reply(msg) + +# 如果是群聊,但没有被 @,则不回复 +@robot.register([Group]) +def auto_reply(msg): + if(msg.is_at): + if ('休眠' in msg.text and msg.member in group_admin): + if(msg.member == robot_master): + thread = threading.Thread(target=remote_down) + thread.start() + thread.join() + return '机器人已休眠' + else: + msg.chat.send('机器人休眠一分钟') + thread = threading.Thread(target=remote_down_minute) + thread.start() + thread.join() + return '机器人休眠一分钟结束' + elif('取消免打扰' in msg.text and msg.member in group_admin): + group_free.append(msg.chat) + return '此群已取消免打扰' + elif(msg.chat.is_owner and '移出' in msg.text and msg.member == robot_master): + try: + name_to_kick = re.search(r'移出\s*@(.+?)(?:\u2005?\s*$)', msg.text).group(1) + except AttributeError: + robot_master.send('无法解析命令') + return + + member_to_kick = ensure_one(msg.chat.search(name_to_kick)) + if member_to_kick == robot_master: + robot_master.send('在尝试移出自己吗?') + return + else: + member_to_kick.remove() + return '已移出 [{}]'.format(name_to_kick) + elif ('用户手册 娱乐' in msg.text): + return FixedReply.handbook_user_entertainment + elif ('用户手册 实用' in msg.text): + return FixedReply.handbook_user_practical + elif('管理员列表' in msg.text and msg.member in group_admin): + return group_admin + elif('管理员手册' in msg.text and msg.member in group_admin): + return FixedReply.handbook_admin + else: + TuLingReply.auto_reply(msg) + +# 如果是群聊,而且是语音,但没有被 @,则不回复 +@robot.register([Group],RECORDING) +def auto_reply(msg): + if not (isinstance(msg.sender, Group) and not msg.is_at): + replys = '机器人暂时无法识别语音哦。' + return replys + +@robot.register([Friend],RECORDING ) +def auto_reply(msg): + replys = '机器人暂时无法识别语音哦。' + return replys + +#忽略公众号自动回复 +@robot.register([MP]) +def ignore_mps(msg): + # 啥也不做 + return + +#特定的群接收消息并自由回复 +@robot.register(group_free) +def recieve_some(msg): + if (msg.is_at and '休眠' in msg.text and msg.member in group_admin): + if (msg.member == robot_master): + thread = threading.Thread(target=remote_down) + thread.start() + thread.join() + return '机器人已休眠' + else: + msg.chat.send('机器人休眠一分钟') + thread = threading.Thread(target=remote_down_minute) + thread.start() + thread.join() + return '机器人休眠一分钟结束' + elif(msg.is_at and '免打扰' in msg.text and msg.member in group_admin): + for j in range(len(group_free)): + if(group_free[j] == msg.chat): + group_free.pop(j) + return '此群已免打扰' + return + elif(msg.is_at and msg.chat.is_owner and '移出' in msg.text and msg.member == robot_master): + try: + name_to_kick = re.search(r'移出\s*@(.+?)(?:\u2005?\s*$)', msg.text).group(1) + print(name_to_kick) + except AttributeError: + robot_master.send('无法解析命令') + return + + member_to_kick = ensure_one(msg.chat.search(name_to_kick)) + if member_to_kick == robot_master: + robot_master.send('在{}群组尝试移出自己!'.format(msg.chat)) + return '在{}群组尝试移出自己!'.format(msg.chat) + else: + member_to_kick.remove() + return '已移出 [{}]'.format(name_to_kick) + elif (msg.is_at and msg.member in group_admin and '添加管理员' in msg.text): + try: + name_temp = re.search(r'添加管理员\s*@(.+?)(?:\u2005?\s*$)', msg.text).group(1) + except AttributeError: + robot_master.send('无法解析命令') + return + + try: + new_admin = ensure_one(msg.chat.search(name_temp)) + except: + return '管理员名称输入错误' + return FixedReply.admin_add(robot_master,group_admin,new_admin,name_temp) + elif(msg.is_at and msg.member == robot_master and '取消管理员' in msg.text): + try: + name_temp = re.search(r'取消管理员\s*@(.+?)(?:\u2005?\s*$)', msg.text).group(1) + except AttributeError: + robot_master.send('无法解析命令') + return + try: + old_admin = ensure_one(msg.chat.search(name_temp)) + except: + return '管理员名称输入错误' + return FixedReply.admin_sub(robot_master,group_admin,old_admin, name_temp) + elif (msg.is_at and '管理员列表' in msg.text and msg.member in group_admin): + return group_admin + elif (msg.is_at and '管理员手册' in msg.text and msg.member in group_admin): + return FixedReply.handbook_admin + elif ('用户手册 娱乐' in msg.text): + return FixedReply.handbook_user_entertainment + elif ('用户手册 实用' in msg.text): + return FixedReply.handbook_user_practical + else: + TuLingReply.auto_reply(msg) + +@robot.register([Group], NOTE) +def welcome(msg): + try: + new_member_name = re.search(r'邀请"(.+?)"|"(.+?)"通过', msg.text).group(1) + except AttributeError: + return + + return FixedReply.welcome_text.format(new_member_name) + +#接收远程管理员命令 +@robot.register(group_admin) +def remote_admin_command(msg): + if('休眠' in msg.text): + if (msg.sender == robot_master): + thread = threading.Thread(target=remote_down) + thread.start() + thread.join() + return '机器人已休眠' + else: + msg.chat.send('机器人休眠一分钟') + thread = threading.Thread(target=remote_down_minute) + thread.start() + thread.join() + return '机器人休眠一分钟结束' + elif('管理员手册' in msg.text): + return FixedReply.handbook_admin + elif('管理员列表' in msg.text): + return group_admin + elif ('用户手册 娱乐' in msg.text): + return FixedReply.handbook_user_entertainment + elif ('用户手册 实用' in msg.text): + return FixedReply.handbook_user_practical + elif (msg.sender == robot_master and '添加管理员' in msg.text): + try: + name_temp = re.search(r'添加管理员\s*@(.+?)(?:\u2005?\s*$)', msg.text).group(1) + except AttributeError: + robot_master.send('无法解析命令') + return '无法解析命令' + + try: + new_admin = ensure_one(robot.friends().search(name_temp)) + except: + return '管理员名称输入错误' + return FixedReply.admin_add(robot_master, group_admin, new_admin, name_temp) + elif(msg.sender == robot_master and '取消管理员' in msg.text): + try: + name_temp = re.search(r'取消管理员\s*@(.+?)(?:\u2005?\s*$)', msg.text).group(1) + except AttributeError: + robot_master.send('无法解析命令') + return '无法解析命令' + + try: + old_admin = ensure_one(robot.friends().search(name_temp)) + except: + return "管理员名称输入错误" + return FixedReply.admin_sub(robot_master, group_admin, old_admin, name_temp) + elif("登出" in msg.text): + #print('已成功退出') + robot.logout() + else: + TuLingReply.auto_reply(msg) + +# 邀请入群 +def invite(user): + if user in group_2: + user.send('你已加入 {}'.format(group_2.nick_name)) + else: + if (len(group_2) < 5): + group_2.add_members(user, use_invitation=True) + else: + group_2.add_members(user, use_invitation=False) + +# 自动接受好友请求 +@robot.register(msg_types=FRIENDS) +def auto_accept_friends(msg): + new_friend = robot.accept_friend(msg.card) + # 或 new_friend = msg.card.accept() + # 向新的好友发送消息 + new_friend.send('哈哈,我自动接受了你的好友请求。') + + if FixedReply.valid(msg): + invite(new_friend) + else: + return + +#准点报时 +FixedReply.repot_time(group_free) + +#开始监听和自动处理消息 +#robot.start() +#embed() +robot.join(); +os.system("pause") \ No newline at end of file diff --git a/XiaoIReply.py b/XiaoIReply.py new file mode 100644 index 0000000..8284064 --- /dev/null +++ b/XiaoIReply.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +#小i机器人 +from wxpy import XiaoI + +xiaoI = XiaoI('oxlPCEDxod6n', 'jjZQvJmwIqjaTbuDDwe6') + +def auto_reply(msg): + xiaoI.do_reply(msg) + +def text_reply(msg): + return xiaoI.reply_text(msg) \ No newline at end of file diff --git a/adminData.py b/adminData.py new file mode 100644 index 0000000..97d199d --- /dev/null +++ b/adminData.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +import os + +from wxpy import * + +#robot = Bot(True) + +#robot_master = ensure_one(robot.friends().search(remark_name='Husen')) +#group_admin = [robot_master] +#print(group_admin) + +#写入管理员的名称数据 +def admin_write(group_admin): + file=open('admin_data.txt','w') + + try: + for admin in group_admin: + file.write(str(admin) + '\n') + file.close() + finally: + file.close() + +#读取管理的名称数据 +def admin_read(robot): + result = [] + if not os.path.exists('admin_data.txt'): + file = open("admin_data.txt","w") + file.close() + file = open("admin_data.txt", "r") + + try: + for line in file.readlines(): + line.encode('utf-8') + str1 = line.split(':', 1) + str2 = str1[1].split('>', 1) + try: + next_admin = ensure_one(robot.friends().search(str2[0])) + except: + continue + result.append(next_admin) + file.close() + finally: + file.close() + + return result + +#admin_read(robot)