
Python-Wechaty:
聊天机器人框架面向IM软件
私信01可以获得大量的python学习资料
Python-wechaty可以用少量代码完成机器人,使用非常简单。基于OOP的设计理念,可以很好地监控和处理微信内的大量事件,如自动回复、定期发送、拉人入群、朋友申请同意等。此外,目前的插件系统中还有许多即用工具,如拉人入群等。当然,开发自己的插件也很简单,不需要深刻的概念,只需要你能理解事件和OOP。
python-wechaty项目起源于wechaty,甚至很大程度上代码是直接从它翻译的,然后添加一些python的特性,使它更加pythonic。作为IM的入口工具,我们将在未来添加更多的chatbot元素,使其成为真正的聊天机器人。
在介绍python-wechaty之前,简要介绍一下wechaty。

wechaty
也许很多人会把wechaty和wechat联系起来,毕竟名字上只有一个字的区别。这必须从wechaty的起源开始。起初,该项目只是微信的一个工具库,可以进行一些简单的自动化操作流程,如定期发送消息、群发消息、朋友申请接受等。
但随着项目的逐步更新,wechaty已经支持微信、钉钉等主流IM软件Telegram。
自2016年以来,该项目已获得8kstar。这是一个非常稳定和庞大的用户项目。官方介绍如下:
AConversationalAIRPASDKforChatbot
因此,作为IMChatbot的入口工具,wechaty是许多聊天机器人的基本结构组件,并将逐步支持主流聊天机器人的功能。

python-wchaty的诞生
在2019年底的一次技术沙龙会议上,我意识到原来的六行代码可以开发出一个足够灵活的机器人,这给了我很大的震惊。微信作为我们的日常聊天工具之一,如果我们能做一些自动化过程,可以大大减少繁琐过程的工作量,如:拉人进入小组,定期提醒用户打卡,提醒女朋友阿姨来等等。而且wechaty能很好地支持上述所有功能,只需几行简单的代码即可完成。回去后,立即开始查阅相关资料,然后逐步进入wechaty社区。
一个巧合的机会小组说可以开发一个go-wechaty。当时我在想为什么不能有python-wechaty,然后自我推荐,成为python-wechaty的联合作者之一。由于对开源软件和Devops不太熟悉,在起步阶段遇到了很多问题,但在社区老板的耐心指导下,issue和feature的开发和管理已经能够完成。亲身经历,建议你有机会参加开源项目,让你学到很多知识点。

最简单的Bot
使用python-wechaty可以简单地开发Bot,特别是在使用插件系统后,如下所示:
上述代码实现了两个主要功能:当Bot接收到#ding信号时,立即回复dong信息,这是一个基本的ding-dong-bot。当接收到查阅天气的文本语句时,返回相应的天气查询结果,如:今天的天气如何?
以上两个插件都是系统内置的,以后会增加更实用的即时插件。当然,用户也可以创建自己的插件,方法非常简单。
如何开发插件系统?
在知道如何开发插件系统之前,可以先移动Plug-in`,插件系统支持插件的安装、卸载、自定义配置等内容。至于具体的实现形式,我相信我们也需要面对具体的应用场景。在面部事件和交互逻辑非常简单的场景中,插件的设计和开发非常简单。
现在让我们来看看如何实现系统内置的丁咚插件。
“””basicding-dongbotforthewechatyplugin”””
fromtypingimportUnion
fromwechatyimportMessage,Contact,Room,FileBox
fromwechaty.pluginimportWechatyPlugin
classDingDongPlugin(WechatyPlugin):
“””basicding-dongplugin”””
@property
defname(self):
“””nameoftheplugin”””
return’ding-dong’
asyncdefon_message(self,msg:Message):
“””listenmessageevent”””
from_contact=msg.talker()
text=msg.text()
room=msg.room()
iftext==’#ding’:
conversation:Union[
Room,Contact]=from_contactifroomisNoneelseroom
awaitconversation.ready()
awaitconversation.say(‘dong’)
代码很简单,但也需要介绍几个层次的氛围。WechatyPluginon_[event_name]init_plugin
WechatyPlugin
这类是抽象类,所有插件都必须继承这个基类,并重写函数。name属性函数为抽象函数,必须重写。主要是为了识别插件的名称,作为插件的唯一身份认证。init_plugin初始化函数可以支持插件的初始化过程,如初始化定时器对象、数据库延迟连接对象等。on_[event_name]该函数主要用于监控系统中的不同事件,如:on_message,on_login,on_friendship等事件的监控只需重写函数即可完成。不同的插件和不同的事件是独立的,可以很好地关注不同业务场景的发展。
event_name
python-wechaty在很大程度上是由事件驱动的。毕竟很多操作都是基于新闻接收触发的。因此,事件监控是其基本特征。也许第一感觉是实用的eventemiter模式来监控事件,这样我就可以注册不同的函数来监控每个事件,每个函数都会有不同的逻辑处理。这也是一种传统的事件监控方法,但至少会给开发带来一些不便:函数参数需要参考文档才能知道,标准函数编程。
我不是说函数编程不好,但是在这种情况下系统性能提升不了多少,python-wechaty也不能太注重性能。
这扩展了OOP的方式,用户可以继承Wechaty或WechatyPlugin来监控不同的事件,并在传统的代码编辑器中重写函数时自动填写函数参数,从而减少访问事件函数参数的问题。
监控事件的类型有:error,friendship,heartbeat,login,logout,message,ready,room_invite,room_join,room_leave,room_topic,scan。
上面已经展示了如何开发WechatyPlugin,需要注意。接下来,我将详细介绍如何开发最基本的日常机器人。
每天谈机器人
顾名思义,每天在每个固定时间段发送祝福或提醒,具体内容可以自定义。需要注意的是,机器人内部有一个调度器,用于触发调度时间事件。机器人可以将相应的内容发送给制定的人和组。
我将上述功能封装成插件,然后注入python-wechaty。
“””dailywordplugin”””
fromdatetimeimportdatetime
fromapscheduler.schedulers.asyncioimportAsyncIOScheduler
fromwechatyimportWechaty
fromwechaty.pluginimportWechatyPlugin
classDailyPlugin(WechatyPlugin):
saysomethingeveryday,like`DailyWords`
@property
defname(self)->str:
“””getthenameoftheplugin”””
return’dayily’
asyncdeftick(self):
“””timetickforthepluginscheduler”””
room_id=get_room_id()
room=self.bot.Room.load(room_id)
awaitroom.ready()
awaitroom.say(f’iloveyou->{datetime.now()}’)
asyncdefinit_plugin(self,wechaty:Wechaty):
“””initplugin”””
awaitsuper().init_plugin(wechaty)
scheduler=AsyncIOScheduler()
scheduler.add_job(self.tick,’cron’,hour=6,minute=16)
scheduler.start()
插件开发完毕,然后注入Wechaty就可以跑了。
asyncdefmain():
bot=Wechaty().use(DailyPlugin())
awaitbot.start()
asyncio.run(main())
是不是超级简单?插件系统帮助您隔离所有业务场景,使代码非常容易开发和维护。
python-还可以做更多的wechaty
现在python-wechaty只完成了基本的chatbot入口工具,离真正的聊天机器人还有很长的路要走,所以未来还有很多工作要做。也欢迎更多研究chatbot和nlp的朋友联系我,共同开发大家都喜欢使用的开源软件。




















