python+itchat个人微信机器人功能介绍

1.自定义菜单(发送“菜单”给微信机器人即可获取到菜单)

2.自定义回复(关键字触发+精确匹配)

3.调用图灵机器人自动回复(仅当本地无法匹配用户发送的关键词时)

4.获取登录机器人的好友性别比例(男、女、未知)

5.设置特别关心,定时发送晚安,定时触发某事件(需要自己写方法)

6.群发助手(慎用,我就是用这个导致Web网页版无法登录)

7.获取某一地区的天气情况(需要自己改城市coding,默认重庆)

特色功能:

8.位置

通过识别小号发来的位置信息,录入到mapList里,mapList[0]代表位置,mapList[1]代表发送时间

其他人给微信机器人发送"位置"或"1"得到上传的位置信息。

9.支持多线程

定时任务和回复不冲突

更多功能,请看代码.....

【声明】

  1. 代码里暴露了自己的很多信息,欢迎交流技术,没事别骚扰
  2. 这是最终版本,微信被封,我也没办法再玩itchat

【效果图】

#菜单

#位置录入

#功能展示

#获取天气

# 自定义回复

【实现代码】

# coding = utf8
import requests
import itchat
from itchat.content import *
import time
import json
import datetime
import _thread
from apscheduler.schedulers.blocking import BlockingScheduler
import random# 去图灵机器人官网注册后会生成一个apikey,可在个人中心查看
KEY = ['49a00e3f45954dc1b****************','fd4540088c834dd9bdb****************','8c3efa5a7aa5489b9d4b****************','0689af9f1b****************d3b','47a942a42b****************295d2cd97d355']
# 个人位置信息
mapList = ['重庆电子工程职业学院(大学城东路76号)','2019-04-16 16:50:32']
# 群发消息
mesList = ['%s,\n好久都没联系了\n']
# 微信小号-管理 微信名称,微信备注,是否开启离线模式 ,离线默认回复
setting = ['AAAA','wybing小号',1,"沉睡中..."]
# 特别关注
attention =['wybing小号']
# 特别关注联系人的城市与coding
attention_city_coding = [['重庆','101040100'],['重庆','101040100'],['永州','101251401']]
# 定时问候语句(清晨,上午,中午,下午,傍晚,深夜,睡觉时间)
helloStr = [['早安','早上好',''],['上午好'],['中午好'],['下午好'],['吃晚饭了'],['快点睡觉了'],['睡觉时间']]def get_response(msg):apiUrl = 'http://www.tuling123.com/openapi/api'data = {'key'   : KEY[random.randint(0, 4)],'info'   : msg,   # 这是要发送出去的信息'userid'  : '吴耀兵',  #这里随意写点什么都行}try:# 发送一个post请求r = requests.post(apiUrl, data=data).json()# 获取文本信息,若没有‘Text’ 值,将返回Nonoereturn r.get('text')except:return
# 通过定义装饰器加强函数 tuling_reply(msg) 功能,获取注册文本信息
@itchat.msg_register(itchat.content.TEXT)
def tuling_reply(msg):# 机器人离线模式下设置,用于机器人设置修改,例如:离线回复# 离线默认回复设置if '离线回复' in msg['Text'] and msg['User']['RemarkName'] == setting[1]:setting[3] = str(msg['Text'].replace('离线回复', ''))itchat.send("设置成功", msg['FromUserName'])return "离线默认回复已设置为:" + setting[3]# 激活机器人if '开启' in msg['Text'] and msg['User']['RemarkName'] == setting[1]:setting[2] = 1return "机器人当前状态:在线"# 离线模式if setting[2] == 0:itchat.send(setting[3], msg['FromUserName'])time.sleep(random.randint(2,6))return# 自定义关键词回复if msg['Text'] == '吴耀兵' or msg['Text'] == 'wybing' or msg['Text'] == 'wyb':return '这是小主人吖~~~'if '在吗' in msg['Text']:itchat.send("正在帮你找...", msg['FromUserName'])time.sleep(random.randint(2,6))itchat.send("主人当前不在线", msg['FromUserName'])time.sleep(random.randint(2,6))itchat.send("主人忙着学习呢", msg['FromUserName'])time.sleep(random.randint(2, 6))return '很高兴为您服务\nby 小兵机器人'if '机器人' in msg['Text'] or '小兵' in msg['Text']:itchat.send('Hi \n%s' % "你召唤了一只强大的机器人\n-来自调皮的机器人~~~", msg['FromUserName'])time.sleep(random.randint(2,6))return '很高兴为您服务\n发送"菜单"解锁更多功能\nby 小兵机器人'if '你好' in msg['Text']:itchat.send("很高兴为您服务~~~", msg['FromUserName'])time.sleep(random.randint(2, 6))return '发送"菜单"解锁更多功能\nby 小兵机器人'if msg['Text'] == '天气':itchat.send(get_weather(), msg['FromUserName'])return "你好, %s \n当前仅支持重庆天气,发送 城市+天气 获取具体城市天气,例如(北京天气)" % msg['User']['NickName']if '傻子' in msg['Text']:return "哼~\n你才是傻子\nby  小兵机器人"if '功能' == msg['Text']:itchat.send('Hi`%s' % "你召唤了一只强大的机器人\n-来自调皮的机器人~~~", msg['FromUserName'])time.sleep(random.randint(2,6))return '很高兴为您服务\nby 小兵机器人'if '彩蛋' == msg['Text']:itchat.send('Hi%s' % "\n恭喜发现彩蛋\n-来自调皮的机器人~~~", msg['FromUserName'])time.sleep(random.randint(2,6))return 'by 小兵机器人'# 功能回复# 位置if msg['Text'] == '位置' or msg['Text'] == "1":mapList[1]=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())return "主人位置:\n %s" % mapList[0] + "\n" + "更新时间:"+mapList[1]+"\nPS:强大的小兵等你发现~~~"# 男女比例if msg['Text'] == '男女比例' or msg['Text'] == "2":# 爬取自己好友的相关信息,返回一个好友列表friends = itchat.get_friends(update=True)[0:]# 初始化好友性别计数器male=female=other=0for i in friends[1:]:sex=i["Sex"]if sex == 1:male += 1elif sex == 2:female += 1else:other += 1# 好友总数total=len(friends[1:])# 性别统计return "男性好友:%.2f%%" % (float(male)/total*100)+"\n"+"女性好友:%.2f%%" % (float(female)/total*100)+"\n"+"未知性别:%.2f%%" % (float(other)/total*100)# +"\n"+"男性好友:%d(人)" % male+"\n"+"女性好友:%d(人)" % female+"\n"+"未知性别:%d(人)" % other +"\n"+"总计:%d(人)" % total# 手机号码if msg['Text'] == '手机号码' or msg['Text'] == "3":itchat.send("正在查询中...", msg['FromUserName'])time.sleep(random.randint(2, 6))itchat.send("手机号码:18875272019", msg['FromUserName'])time.sleep(random.randint(2, 6))itchat.send("网站:http://wybing.com", msg['FromUserName'])time.sleep(random.randint(2, 9))return "by 小兵机器人\n"#群发助手if ('#群发' in msg['Text'] or msg['Text'] == "4") and  msg['User']['RemarkName'] == setting[1]:if msg['User']['RemarkName'] == setting[1]:mesList[0] = str(msg['Text'].replace('#群发', ''))send_group()return "已启用群发功能,%s表示用户微信名称"itchat.send("群发功能已被关闭\n-来自调皮的机器人~~~", msg['FromUserName'])return '群发助手无法使用,仅供调试'# 特别关心if msg['Text'] == '特别关心' or msg['Text'] == "5":itchat.send('%s' % "对不起,主人说不允许你看\n-来自调皮的机器人~~~", msg['FromUserName'])return "%s ,\n主人未将你添加进特别关心列表!" % msg['User']['NickName']# 离线模式if '退出' in msg['Text'] and msg['User']['RemarkName'] == setting[1]:setting[2]=0return "机器人当前状态:离线"# 状态if '状态' in msg['Text']:str_state = ''if setting[2] == 0:str_state = "离线"else:str_state = "在线"return "机器人当前状态:" + str_state# 菜单if msg['Text'] == '菜单':itchat.send("===菜单===\n1.位置\n2.男女比例\n3.手机号码\n4.群发助手\n5.特别关心\n更多功能等你发现......\n       by 小兵机器人\n", msg['FromUserName'])time.sleep(random.randint(2, 6))itchat.send("回复 状态 获取机器人当前状态",msg['FromUserName'])time.sleep(random.randint(2, 6))return "群发助手和特别关心不对外开放"# 设置一个默认回复,在出现问题仍能正常回复信息defaultReply = '么么哒,无法识别消息: ' +msg['Text']reply = get_response(msg['Text'])# a or b 表示,如有a有内容,那么返回a,否则返回breturn reply or defaultReply# 处理其他文本类信息,包括位置、名片、通知、分享
@itchat.msg_register([MAP,CARD,NOTE,SHARING])
def text_reply(msg):if setting[2]==0 and msg['User']['RemarkName'] != setting[1]:return setting[3]if msg['Type'] == 'Map':# RemarkName 备注  NickName 微信昵称if msg['User']['RemarkName'] == setting[1]:mapList[0] = msg['Text']mapList[1] = (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(msg['CreateTime'])))itchat.send('%s\n%s\n%s\n' % ("成功录入系统", mapList[0],  mapList[1]), msg['FromUserName'])else:itchat.send('%s' % "你发的位置已经收到\n-来自调皮的机器人~~~", msg['FromUserName'])elif msg['Type'] == 'Card':# itchat.send('%s: %s' % (msg['Type'], msg['Text']), msg['FromUserName'])itchat.send('%s' % '分享的名片已经收到 by 小兵机器人', msg['FromUserName'])time.sleep(random.randint(2,6))itchat.send('%s' % '提示:此操作未做进一步处理', msg['FromUserName'])else:itchat.send('%s' % '404\n我会悄悄告诉主人的\nby 小兵机器人\n', msg['FromUserName'])itchat.send('%s: %s' % (msg['Type'], msg['Text']), msg['FromUserName'])# 处理多媒体信息,包括图片、录音、文件、视频
@itchat.msg_register([PICTURE,RECORDING,ATTACHMENT,VIDEO])
def download_files(msg):# 离线模式if setting[2]==0:return setting[3]# msg['Text']是一个文件下载函数,传入文件名,将文件下载下来msg['Text'](msg['FileName'])# 把下载好的文件再发给发送者return '@%s@%s' % ({'Picture':'img','Video':'vid'}.get(msg['Type'],'fill'),msg['FileName'])# 收到好友邀请自动添加好友
@itchat.msg_register(FRIENDS)
def add_friend(msg):itchat.add_friend(**msg['Text']) # 该操作会自动将新好友的消息录入,不需要重载通讯录itchat.send_msg('你好!', msg['RecommendInfo']['UserName'])time.sleep(random.randint(2,6))itchat.send_msg('小兵机器人很高兴为您服务!', msg['RecommendInfo']['UserName'])# 处理群聊消息,在注册时增加isGroupChat=True 将判定为群聊回复
@itchat.msg_register(TEXT,isGroupChat=True)
def text_reply(msg):if msg['isAt']:itchat.send(u'@%s\u2005I received: %s' % (msg['ActualNickName'],msg['Content']), msg['FromUserName'])# 获取天气
def get_weather(city='重庆',coding='101040100'):# 重庆 101040100url = 'http://t.weather.sojson.com/api/weather/city/'+codingheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0'}response = requests.get(url, headers=headers)data = json.loads(response.text)# 今日信息today = data['data']['forecast'][0]['ymd']today_hightem = data['data']['forecast'][0]['high']today_lowtem = data['data']['forecast'][0]['low']today_win = data['data']['forecast'][0]['fx'] + ' ' + data['data']['forecast'][0]['fl']today_wea = data['data']['forecast'][0]['type']notice = data['data']['forecast'][0]['notice']# 明日信息tomorrow = data['data']['forecast'][1]['ymd']tomorrow_hightem = data['data']['forecast'][1]['high']tomorrow_lowtem = data['data']['forecast'][1]['low']tomorrow_win = data['data']['forecast'][1]['fx'] + ' ' + data['data']['forecast'][1]['fl']tomorrow_wea = data['data']['forecast'][1]['type']today_data = '[' + today + ']' + '\n    ' + '温度:' + today_hightem + '/' + today_lowtem + '\n    ' + '天气:' + today_wea + '\n    ' + '风力:' + today_win + '\n\n'tomorrow_data = '[' + tomorrow + ']' + '\n    ' + '温度:' + tomorrow_hightem + '/' + tomorrow_lowtem + '\n    ' + '天气:' + tomorrow_wea + '\n    ' + '风力:' + tomorrow_winnotice = '\n\n温馨提醒:' + noticeinfo = [today_data, tomorrow_data, notice]return '【'+city+'天气】\n\n' + info[0] + info[1] + info[2]def send_group():friendList = itchat.get_friends(update=True)[1:]  ###获取好友列表for friend in friendList:if friend['DisplayName'] == 'AAAA' or friend['NickName'] == 'AAAA':time.sleep(random.randint(15,100))if '%s' in mesList[0]:itchat.send(mesList[0] % (friend['DisplayName'] or friend['NickName']),toUserName = friend['UserName'])print(mesList[0] % (friend['DisplayName'] or friend['NickName']))else:itchat.send(mesList[0], toUserName = friend['UserName'])print(mesList[0])
# 根据时间发送问候语
def hello():# 获取问候的语句replystr=""# 是否发送天气weatherFlag = 0# 获取小时nowhour=datetime.datetime.now().hour# 清晨6-9点if nowhour>=6 and nowhour<9:replystr=helloStr[0][random.randint(0,len(helloStr[0])-1)]weatherFlag=1# 上午 9-12点elif nowhour>=9 and nowhour<12:replystr=helloStr[1][random.randint(0,len(helloStr[1])-1)]# 中午 12-15点elif nowhour >= 12 and nowhour < 15:replystr=helloStr[2][random.randint(0,len(helloStr[2])-1)]# 下午 15-18点elif nowhour >= 15 and nowhour < 18:replystr=helloStr[3][random.randint(0,len(helloStr[3])-1)]# 傍晚 18-21点elif nowhour >= 18 and nowhour < 21:replystr=helloStr[4][random.randint(0,len(helloStr[4])-1)]# 深夜 21-23点elif nowhour >= 21 and nowhour <= 23:replystr=helloStr[5][random.randint(0,len(helloStr[5])-1)]# 睡觉时间 0-6点else:replystr=helloStr[6][random.randint(0,len(helloStr[6])-1)]# 依照特别关心列表随机发送内容i = 0for name in attention:account = itchat.get_friends(name)  # 这里的aNickName是你给微信好友的备注for item in account:if item['RemarkName'] == name:  # 由于每次登录时朋友的UserName都会变,所以我们这样做user = item['UserName']  # 获取微信朋友的UserName# 给朋友发送信息if weatherFlag == 1:itchat.send(get_weather(attention_city_coding[i][0],attention_city_coding[i][1]), toUserName=user)itchat.send(replystr, toUserName=user)time.sleep(random.randint(2,6))i+=1# 使用热启动,不需要多次扫码
itchat.auto_login(hotReload=True)
# itchat.auto_login()
_thread.start_new_thread(itchat.run, ())
# 使用configured_reply方法while 1:itchat.configured_reply()# some other functionssched = BlockingScheduler()sched.add_job(hello, 'cron', day_of_week='0-6', hour=7, minute=00)sched.start()'''
# 未显式指定,那么则立即执行
sched.add_job(my_job, args=['text'])
# 在2009年11月6日执行
sched.add_job(my_job, 'date', run_date=date(2009, 11, 6), args=['text'])
# 在2009年11月6日 16:30:05执行
sched.add_job(my_job, 'date', run_date=datetime(2009, 11, 6, 16, 30, 5), args=['text']
sched.add_job(my_job, 'date', run_date='2009-11-06 16:30:05', args=['text'])
# 每2小时触发
sched.add_job(job_function, 'interval', hours=2)
# 周期触发的时间范围在2010-10-10 9:30 至 2014-06-15 11:00
sched.add_job(job_function, 'interval', hours=2, start_date='2010-10-10 09:30:00', end_date='2014-06-15 11:00:00')'''

pthon3+itchat微信机器人,自定义回复,定时发送晚安,微信小号控制,信息群发功能,获取位置相关推荐

  1. node.js wechaty实现微信机器人聊天,定时发送消息

    目录 1.介绍 2.插件安装运行 3.快速上手 1.介绍 本项目主要是node wechaty的一个小应用,其核心原理主要通过wechaty插件登录网页版微信接受消息进行通信以及其他功能等.这里只做了 ...

  2. 企业微信朋友圈这样定时发送!太省事了!

    ​我们在使用企业微信进行客户运营时,除了可以给客户或客户群发送消息,还可以使用企业微信朋友圈功能,通过发朋友圈的形式将产品或活动进行展示. 那么企业微信的朋友圈可以定时发送吗?今天和企业微信服务商小编 ...

  3. 爬虫抓取天气预报、定时发送给指定微信好友,自动回复

    效果展示 打包成exe文件之后的效果 选择城市 选择好友(可以对群组发送消息,群组需要先添加到微信通讯录中) 选择发送天气预报的频率 选择开启自动回复功能 功能实现思路 1.爬取天气信息 天气信息获取 ...

  4. python--实现微信自动回复机器人和定时发送每日一句与天气预报

    目录 关于wxpy 安装wxpy 利用机器人实现微信自动回复 获取金山词霸每日一句 获取天气预报数据 定时发送每日一句与天气预报 结束 关于wxpy wxpy其实是通过微信网页版的api实现对微信的一 ...

  5. 实现微信向多好友定时发送信息

    @TOC利用WeChat向好友定时发送关心及天气信息,表达自己对朋友的关心 第一篇博客,不喜欢不要说出来哈_ 在闲暇之余,通过学习整理了一份可以向微信好友批量发送消息的脚本,包含的内容如下: 1.获取 ...

  6. python+企业微信机器人把数据库数据发送到群的方法我悟了

    经常有很多的自动化任务,还有用户反馈什么的如果数据入库,想要查看一天的新增数量自动发送到群里,可以用python写一点代码让企业微信机器人从数据库拿到数据后拼接成通知格式发送到群.以下是小菜鸟的简单方 ...

  7. 利用Go制作微信机器人(一)发送消息

    这些天在学习Go,也写了几篇关于阅读Gin后端项目代码的博客.但编程这种,一定要实际上手练习,要不然都是纸上谈兵.于是就想上手自己实际写一些代码来练练手.思来想去,不知道能写些什么来练手.后来突然想到 ...

  8. python小程序设计每天定时微信发消息_定时发送微信小程序订阅消息

    微信小程序的消息推送从之前的模板消息更新到了现在的订阅消息,本篇文章就教你怎么使用小程序订阅消息,文后会附上使用python写的定时发送订阅消息的代码. 1.首先要添加一个订阅消息模板 登陆上微信小程 ...

  9. 企业微信如何简单实现定时发送文件到群:企业微信群机器人操作(Java代码实现)

    前言 不知道小伙伴们的公司组织架构通勤用的啥软件,我公司用的企业微信.然后业务销售部那边需要每天统计销售数据报表然后发在群里(我是开发,我不配在群里).知道这个背景以后,产品给我们的需求是:直接统计数 ...

  10. 【Python定时发送消息到微信】

    前言 哔咘:"你看下明天天气呢?我好准备明天穿的衣服鞋子." 叭卟没做回应,心想怎么又问啊,自己不知道看吗. 哔咘一个温柔的眼神,叭卟立刻回答道:"要得,天气预报马上看. ...

最新文章

  1. Spring 5.1.13 和 Spring Boot 2.2.3 发布
  2. Java程序内存分析:使用mat工具分析内存占用
  3. fork() || fork()和fork() fork()笔试题
  4. rust(63)-全局静态变量
  5. sysbench安装和使用(亲测)
  6. svn查看登录过的账号密码
  7. 2011年想要惊喜的5z20
  8. Python中添加中文注释报错SyntaxError: Non-UTF-8 code starting with '\xc1'
  9. iOS 13-Sign In with Apple
  10. php模板怎么导入数据类型,smarty模板引擎之分配数据类型,smarty模板数据类型_PHP教程...
  11. imos 学习笔记四 录像 c#
  12. 顺序查找、折半查找、索引查找
  13. fusioncharts的打印管理(printManager)
  14. MySQL 导入数据 时间数据 不准确 解决办法
  15. 记录一次keil调试过程:自动识别GPS厂家芯片
  16. 国外6大高效免费在线学习编程网站
  17. VS2012(2013、2015) OpenCV “HEAP:Invalid Address specified to RtlValidateHeap( 000D0000, 019FEF18 )
  18. 椭圆积分函数和雅各比椭圆函数
  19. java privatekey输出字符串_[Java教程]根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象_星空网...
  20. 计算机网络hdcp是什么意思,4.HDCP:支持高带宽数字内容保护协议HDCP

热门文章

  1. 计算机分析桁架受力,日光温室桁架式拱架的受力分析.doc
  2. Apparent connection leak detected
  3. M1芯片MacBook安装手机app
  4. 修改飞秋2013~随便改,瞬间提升你的逼格
  5. APP隐私合规检测工具Camille环境搭建
  6. 覆盖(重写)与重载的区别
  7. css三角形的IE兼容写法
  8. C++11中的原子操作(atomic operation)和自旋锁
  9. 黑色沙漠选择服务器无响应,黑色沙漠无法连接服务器是什么原因
  10. 对抗样本的创建和防御