几个月前学院组织了一次「晨起打卡」活动,要在每天的一个很早的时间向指定公众号发送指定消息,我就顺手做了SYSU-HitCard. 里面用到的itchat是一个针对微信的Python库,感觉挺强大的,就想用Python+itchat库实现微信聊天机器人。现有的轮子实现思路基本一致:关注一个真·人工智能机器人公众号(如微软小冰、图灵机器人),使用itchat库的接口编写转发策略,通过聊天好友和公众号之间的消息转发造成自动机器人回复的假象。

但这里有两个问题:

当我把脚本挂在服务器上的时候,我没有办法在不建立ssh连接的情况下得知脚本运行状态。考虑到微信严格的反机器人机制,被强制下线是很常见的事。这里需要设定一个定时确认运行状态的机制。

当我使用我的不常用微信号来运行机器人时,我希望我能用常用账号来监视机器人的活动状态,即每次聊天的内容能被转发到指定账号,最好还能注明机器人在和哪个好友对话。

由此,就做了一个能每日确认存活,且自动转发消息的聊天机器人。

聊天机器人部分

这部分只需要对已有的轮子按自己的需要修改一下。

#------------chat bot------------#

# answer by userId

userId = ''

# get friends' message

@itchat.msg_register([itchat.content.TEXT,itchat.content.PICTURE])

def text_reply(msg):

# let ice answer

global userId

userId = msg['FromUserName']

xbAnswer(msg)

# print(getUserNickName(msg) + "send:\n" + getText(msg))

# group message

@itchat.msg_register([itchat.content.TEXT,itchat.content.PICTURE], isGroupChat = True)

def group_reply(msg):

fromUserName = msg['FromUserName']

group = itchat.search_chatrooms(userName=fromUserName)

# print(group['NickName'] + "group " + msg['ActualNickName'] + " message:\n" + getText(msg) )

if msg['isAt'] == True :

global userId

userId = msg['FromUserName']

xbAnswer(msg)

# group message

@itchat.msg_register(itchat.content.PICTURE, isGroupChat = True)

def group_pic(msg):

msg['Text'](msg['FileName'])

itchat.send_image(msg['FileName'])

# mp message

@itchat.msg_register([itchat.content.TEXT,itchat.content.PICTURE], isMpChat = True)

def map_reply(msg):

text = getText(msg)

global userId

if msg['Type'] == 'Picture':

msg['Text'](msg['FileName'])

itchat.send_image(msg['FileName'],userId)

# itchat.send_msg(' ', userId)

else:

itchat.send_msg(text + " ", userId)

receiver = itchat.search_friends(name=u"Yzstr")[0]["UserName"]

itchat.send_msg(text+"\n----------\nauto reply", receiver)

# get name

def getUserNickName(msg):

fromUserName = msg['FromUserName']

fromUser = itchat.search_friends(userName=fromUserName)

nickName = fromUser['NickName']

return nickName

# get text

def getText(msg):

if msg['Type'] == 'Text':

return msg['Text']

else:

return " type failed "

# ask ice

def xbAnswer(msg):

xb = itchat.search_mps(name=u'小冰')[0]

quest = getText(msg)

if msg['Type'] == 'Picture':

msg['Text'](msg['FileName'])

itchat.send_image(msg['FileName'],xb['UserName'])

else:

receiver = itchat.search_friends(name=u"Yzstr")[0]["UserName"]

# target=itchat.search_friends(userName='xb['UserName']')

itchat.send_msg(quest+"\n----------\nsend by "+getUserNickName(msg), receiver)

itchat.send_msg(quest, xb['UserName'])

#--------------------------------#

注意在ask ice部分加入了

receiver = itchat.search_friends(name=u"Yzstr")[0]["UserName"]

itchat.send_msg(quest+"\n----------\nsend by "+getUserNickName(msg), receiver)

用以将 message 转发给微软小冰的同时也转发给自己的微信常用账号。同理,在mp message部分的:

receiver = itchat.search_friends(name=u"Yzstr")[0]["UserName"]

itchat.send_msg(text+"\n----------\nauto reply", receiver)

用于将自动回复转发给常用账号。

运行状态确认部分

这一部分比较简单,和「微信打卡签到」类似。

#----------status check----------#

task_list = [("00:01", "I'm stay'in alive")]

def task_remind():

for task in task_list:

task_time = task[0]

task_content = task[1]

if datetime.datetime.now().strftime("%H:%M") == task_time:

receiver = itchat.search_friends(name="Yzstr")[0]["UserName"]

itchat.send_msg(task_content, receiver)

def remind_run():

sched = BlockingScheduler()

sched.add_job(task_remind, 'cron', second=0)

sched.start()

#--------------------------------#

这里实现了在每天的00:01向指定账户发送I'm stay'in alive,带来比基斯兄弟的问候。

同时运行

聊天机器人和运行状态确认是两个独立的部分,分别由itchat.run()和remind_run()两个函数进入,而且这两个函数必须同时运行,这让习惯了面向过程编程的我有点头疼。后来发现可以使用Python的threads来完成并行处理,只需要两行代码将这两个函数写入thread,再main函数里启动这两个线程即可。

创建线程:

#----------making threads--------#

t1=threading.Thread(target=itchat.run,name='itchat')

t2=threading.Thread(target=remind_run,name='remind')

#--------------------------------#

启动线程:

if __name__=='__main__':

itchat.auto_login(hotReload=True,enableCmdQR=0)

t1.start()

t2.start()

运行

桌面环境

完成配置以后,可以直接运行

python WeChatter.py

此时微信登陆二维码会被自动加载和打开,扫描二维码即可运行。

服务器环境

考虑到服务器没有桌面也没有图片查看器,需要使用命令行来加载二维码。

将代码第106行改为:

itchat.auto_login(hotReload=True,enableCmdQR=2)

其中enableCmdQR参数可以用来设置缩放比例,0表示不使用命令行加载二维码,1表示按原大小显示。

经过测试,在enableCmdQR=2时,二维码在PuTY或者Xshell上都会有较好效果。

如果要在服务器后台运行而不是一直开着终端,可以使用nohup来保持:

nohup python -u WeChatter.py

注意,使用nohup时,建议将参数enableCmdQR设为1.

完整源码

python自动聊天机器人_Python实现微信聊天机器人相关推荐

  1. python 微信自动回复机器人_python实现微信自动回复机器人+查看别人撤回的消息(部署到云服务器)...

    前言首先你的微信号能够登录网页版微信,才能打造你的专属个人微信号机器人,点击跳转网页版微信登录页面 类似的文章网上也都有,其实我也是受到别的文章的一些启发,因为不是每个人都想实现同样的功能的,直接套用 ...

  2. python 微信聊天机器人_python操作微信自动发消息的实现(微信聊天机器人)

    前言 最近在学习python,发现一个微信自动发消息的小demo感觉很有意思,试了一下,不成功,因为demo中用的是itchat这个库来操作微信,而这个库是通过微信网页版来操作微信的,现在微信网页版已 ...

  3. python微信自动发消息_python操作微信自动发消息的实现(微信聊天机器人)

    前言 最近在学习python,发现一个微信自动发消息的小demo感觉很有意思,试了一下,不成功,因为demo中用的是itchat这个库来操作微信,而这个库是通过微信网页版来操作微信的,现在微信网页版已 ...

  4. 微信公众号图灵机器人开发php,使用图灵机器人api搭建微信聊天机器人php实现,图灵微信聊天机器人...

    使用图灵机器人api搭建微信聊天机器人php实现,图灵微信聊天机器人之前通过hook技术实现了微信pc端发送消息功能,如果在结合图灵机器人就能实现微信聊天机器人. 代码下载:http://blog.y ...

  5. 【Python撩妹合集】微信聊天机器人,推送天气早报、睡前故事、精美图片分享...

    福利时间,福利时间,福利时间 如果你还在为不知道怎么撩妹而烦恼,不知道怎么勾搭小仙女而困惑,又或者不知道怎么讨女朋友欢心而长吁短叹. 那么不要犹豫徘徊,往下看.接下来我会分享怎么使用 Python 实 ...

  6. python分配红包程序_Python版微信红包分配算法

    Python版微信红包分配算法 发布于 2015-05-08 10:54:23 | 151 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对象.解释型计算机 ...

  7. python 企业微信群机器人_企业微信群机器人应用:使用python从网站抓取行业资讯并定时推送...

    在企业经营过程中,及时了解行业相关信息(市场动态.竞品策略.行业数据等等)是非常必要的.通常情况下,商品部门.营销部门.市场部门可能都会安排专门的人员定期进行这些信息的搜集.整理,再进行内部的分享. ...

  8. 微信聊天新技能!微信聊天彩色字体!个性炫酷~

    上一篇关于微信聊天界面个性签名的文章推送以后,有小伙伴留言问微信聊天彩色字体设置方法,就为大家分享一下微信彩色字体~ 首先,下载安装软件[微信炫字体].软件的功能也比较简单,没有任何复杂的设置. 软件 ...

  9. h5聊天页面 jquery_HTML5仿微信聊天界面、微信朋友圈实例代码

    这几天使用H5开发了一个仿微信聊天前端界面,尤其微信底部编辑器那块处理的很好,使用HTML5来开发,虽说功能效果并没有微信那么全,但是也相当不错了,可以发送消息.表情,发送的消息自动回滚定位到底部,另 ...

  10. python代码手机壁纸_Python制作微信好友背景墙教程(附完整代码)

    引言 前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张大图片中展示出自己的所有微信好友的头像. 效果如下图,出于隐私考虑,这里作了模糊处理. 是不是很炫,而且这还是独一无二的,毕竟 ...

最新文章

  1. 为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式...
  2. arcgis python脚本实现从界面选择输入输出_arcgis python脚本实现从界面选择输入输出_ArcGIS Python编程案例(2)-使用ArcPy编写脚本......
  3. HTML的BODY内标签介绍
  4. Exception in thread main org.apache.thrift.transport.TTransportException: Could not create ServerS
  5. 179. 最大数 golang (自定义sort)
  6. Abbey加入了FreeCodeCamp团队,担任编辑
  7. 23种设计模式之迭代器模式
  8. 一起来玩树莓派---树莓派3B+安装Ubuntu16.04系统
  9. android 广播 关闭对话框,Android 对话框、信息提示和菜单
  10. MySQL关键字constra_mysql总结笔记(一)
  11. C++之基类构造函数初始化
  12. 一、auto_test_base
  13. table TD 超出省略号
  14. DDD实战进阶第一波(七):开发一般业务的大健康行业直销系统(实现产品上下文接口与测试)...
  15. wifi网卡工作模式和iwconfig
  16. MySQL基础学习(三)————SQL语句的常用操作
  17. typename和class
  18. HDS不玩了,高端存储还能玩多久?
  19. 直方图均衡化(Histogram equalization)与直方图规定化
  20. 无须数据线,实现电脑手机快速互传

热门文章

  1. 基于Java毕业设计在线商城系统源码+系统+mysql+lw文档+部署软件
  2. Chart控件,chart、Series、ChartArea曲线图绘制的重要属性介绍(Windows窗体)
  3. Raspberry Pi 4b CUPS AirPrint 共享网络打印机
  4. 中南民族大学计算机科学学院2011级2014年至2015年度课表,中南民族大学应用心理学专业2012-2013-2学期辅修-双学位课表(2010、2011级)...
  5. [War3]Fdf文件详解,简单的UI教程演示 - 魔兽争霸3
  6. 九行代码自动下载instagram原图
  7. 吉林大学线性代数知识点及解题方法
  8. winform DevComponents.DotNetBar2 添加到工具栏方法
  9. 红黄绿灯控制系统c语言,微机课设-红、黄、绿灯的控制系统设计.doc
  10. 大连芒果云计算机,芒果网manGO怎么样