Author: wj-Mcat

Code: python-wechaty

个人开发项目,且行且不易,有感兴趣的朋友可以去给一波关注,你们的支持就是我最大的动力,谢谢大家。

Python-wechaty能够使用少量代码即可完成一个机器人,使用起来非常简单,基于OOP的设计思路能够很好监听和处理微信内部大量的事件,比如:自动回复消息,定时发送消息,拉人入群,好友申请同意等等。此外,目前的插件系统里面有很多拿来即用的工具,比如拉人入群等。当然开发一个自己的插件也是非常简单,无需很高深的概念,只需要你能够理解事件和OOP即可。

python-wechaty项目源于wechaty,甚至说很大程度上代码是直接从其翻译过来的,然后加上一些python的特性,让其更加pythonic。作为一个IM的入口工具,未来我们也将添加更多的Chatbot元素进去,让其能够成为一个真正的聊天机器人。

在介绍python-wechaty之前,还是简要介绍一下wechaty。

wechaty

或许有很多人会把wechatywechat联系起来,毕竟在名称上面只是一字之差。这个得从wechaty的起源开始说起,起初,此项目只是作为微信的一个工具库,能够进行一些简单的自动化操作过程,比如:定时发送消息,入群消息发送,好友申请接受等。

可随着项目的逐步更新,wechaty已支持主流的IM软件,比如:微信,钉钉,Telegram。

这个项目从2016年开始,到现在已经获取8k star,是一个非常稳定且用户量非常庞大的项目。官方对其给出的介绍是:

A Conversational AI RPA SDK for Chatbot

所以wechaty作为IM ChatBot的入口工具,是很多聊天机器人的基础架构组件,也将会逐步支持主流聊天机器人的功能。

python-wchaty的诞生

与Wechaty的结缘是在2019年底的一次技术沙龙会上,认识到了原来6行代码就能够开发出一款足够灵活的机器人,当时给我一个很大的震撼。微信作为我们日常聊天工具之一,如果能够对其做一些自动化的过程,能够很大程度上减少繁琐过程的工作量,比如说:办活动时的拉人入群,定时提醒用户打卡,提醒女朋友姨妈快来了等等。而wechaty能够很好的支持以上所有功能,只需要简单的几行代码即可完成。回去之后就立马着手相关资料的查阅,然后逐步进入wechaty的社区。

一个很巧的机会群里面说可以开发一款go-wechaty的开发,当时我就在想,为什么不能够有一款python-wechaty呢,然后就毛遂自荐,成为了python-wechaty的联合作者之一。由于对开源软件和DevOps不是很熟悉,起步阶段遇到了很多的问题,不过经过社区大佬的耐心指导,目前已能够完成对issue和feature的开发和管理。亲身经历,建议大家有机会一定要参加开源项目,能够让你学习到很多知识点。

最简单的Bot

使用python-wechaty能够很简单的开发一款Bot,特别是使用了一个插件系统之后,如下所示:

以上代码中实现了两个主要的功能:

  • 当Bot接受到一个#ding信号,就立马回复一个dong消息,这就是一个基本的ding-dong-bot
  • 当接受到查阅天气的文本语句时,则返回对应的天气查询结果,比如:今天天气如何?

以上两个插件是系统内置的,后续也会增加更多的拿来即用的实用插件,当然用户也可创建自己的插件,方式很简单。

如何开发插件系统

在了解如何开发插件系统之前,可先移驾Plug-in`,插件系统支持对插件的安装,卸载,自定义配置等内容 ,至于具体的实现形式我相信也是需要面对具体的应用场景。而在Wechaty这个面相事件型且交互逻辑非常简单的场景下,插件的设计与开发就非常简单。

我们现在直接来看看,系统内置的叮咚插件是如何实现的。

  1. """basic ding-dong bot for the wechaty plugin"""
  2. from typing import Union
  3. from wechaty import Message, Contact, Room, FileBox
  4. from wechaty.plugin import WechatyPlugin
  5. class DingDongPlugin(WechatyPlugin):
  6. """basic ding-dong plugin"""
  7. @property
  8. def name(self):
  9. """name of the plugin"""
  10. return 'ding-dong'
  11. async def on_message(self, msg: Message):
  12. """listen message event"""
  13. from_contact = msg.talker()
  14. text = msg.text()
  15. room = msg.room()
  16. if text == '#ding':
  17. conversation: Union[
  18. Room, Contact] = from_contact if room is None else room
  19. await conversation.ready()
  20. await conversation.say('dong')

代码很简单,不过也是需要氛围一下几个层面来介绍。

  • WechatyPlugin
  • on_[event_name]
  • init_plugin

WechatyPlugin

此类为一个抽象类,所有的插件必须要继承此基类,并重写其中的函数。

  • name 属性函数

    为抽象函数,必须重写。主要是为了标识插件的名称,作为插件唯一性身份认证。

  • init_plugin 初始化函数

    能够支持插件的初始化过程,比如初始化定时器对象,数据库延迟连接对象等。

  • on_[event_name]

    此类函数主要是为了监听系统中的不同事件,比如:on_message, on_login, on_friendship等事件的监听都只需要重写一下函数即可完成。不同插件之间以及不同事件之间都是独立的,能够很好的专注于不同业务场景下的开发。

event_name

python-wechaty很大程度上是由事件驱动,毕竟很多操作都是基于消息接受触发,由此事件的监听是其基础特性,可能第一感觉就是实用EventEmitter这种模式来监听事件,这样每个事件我都可以注册不同的函数来监听,每个函数中会有不同的逻辑处理。这也是传统的事件监听方法,可这至少会给开发上带来一些不方便:函数的参数需要查阅文档才能够获知,标准的函数式编程。

我不是说函数式编程不好,只是在这种场景下对系统性能并不能提升多少,且python-wechaty 也并不能太注重性能。

由此将其扩展了OOP的方式,用户可继承WechatyWechatyPlugin来监听不同的事件,且在常规的代码编辑器里面重写函数时就可以自动填充函数参数,从而减少查阅事件函数参数的问题。

监听事件的类型有:error, friendship, heartbeat, login, logout, message, ready, room_invite, room_join, room_leave, room_topic, scan

在上面已经展示了WechatyPlugin如何开发,需要注意的地方,那接下来我将给大家详细介绍一下最基础的每日一说的机器人如何开发。

每日一说机器人

每日一说,顾名思义每天每个固定时间段发送一个祝福或提醒,具体内容可自定义。这其中需要注意几点:

  • 机器人内部有一个调度器,用于调度时间事件的触发。
  • 机器人可给制定的人和群发送对应的内容。

以上的功能我封装成一个插件,然后注入到python-wechaty中即可。

  1. """daily word plugin"""
  2. from datetime import datetime
  3. from apscheduler.schedulers.asyncio import AsyncIOScheduler
  4. from wechaty import Wechaty
  5. from wechaty.plugin import WechatyPlugin
  6. class DailyPlugin(WechatyPlugin):
  7. """
  8. say something everyday, like `Daily Words`
  9. """
  10. @property
  11. def name(self) -> str:
  12. """get the name of the plugin"""
  13. return 'dayily'
  14. async def tick(self):
  15. """time tick for the plugin scheduler"""
  16. room_id = get_room_id()
  17. room = self.bot.Room.load(room_id)
  18. await room.ready()
  19. await room.say(f'i love you -> {datetime.now()}')
  20. async def init_plugin(self, wechaty: Wechaty):
  21. """init plugin"""
  22. await super().init_plugin(wechaty)
  23. scheduler = AsyncIOScheduler()
  24. scheduler.add_job(self.tick, 'cron', hour=6, minute=16)
  25. scheduler.start()

插件就开发完了,然后将其注入到Wechaty中即可跑起来。

  1. async def main():
  2. bot = Wechaty().use(DailyPlugin())
  3. await bot.start()
  4. asyncio.run(main())

是不是超级简单,插件系统帮你隔离所有的业务场景,让代码非常易于开发和维护。

python-wechaty还可以做更多

现在python-wechaty只完成了基本的Chatbot入口工具,离真正的聊天机器人还距离很远,所以未来还有很多工作量可以做,也欢迎更多的研究chatbot,nlp的小伙伴联系我,共同开发让大家都喜欢用的开源软件。

微信号:pure-_--love

Python-Wechaty: 面向所有IM软件的聊天机器人框架的更多相关文章

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

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

  2. 聊天机器人框架Rasa资源整理

      Rasa是一个主流的构建对话机器人的开源框架,它的优点是几乎覆盖了对话系统的所有功能,并且每个模块都有很好的可扩展性.参考文献收集了一些Rasa相关的开源项目和优质文章. 一.Rasa介绍 1.R ...

  3. 一个使用 Python 的人工智能聊天机器人框架

    一个Python 的 AI Chatbot框架 建立一个聊天室可以听起来很棒,但它是完全可行的. IKY是一个内置于Python中的AI动力对话对话界面. 使用IKY,很容易创建自然语言会话场景,无需 ...

  4. python 小脚本升级-- 钉钉群聊天机器人

    一则小脚本(工作中用) 在这篇文章中写的监控的脚本,发送监控的时候 是利用的邮箱,其实在实际,邮箱查收有着不方便性,于是乎升级, 我们工作中,经常用钉钉,那么如果要是能用到钉钉多好,这样我们的监控成功 ...

  5. Rasa Stack:创建支持上下文的人工智能助理和聊天机器人教程

    相关概念 Rasa Stack 是一组开放源码机器学习工具,供开发人员创建支持上下文的人工智能助理和聊天机器人: • Core = 聊天机器人框架包含基于机器学习的对话管理 • NLU = 用于自然语 ...

  6. 智能聊天机器人——基于RASA搭建

    前言: 最近了解了一下Rasa,阅读了一下官方文档,初步搭建了一个聊天机器人. 官方文档:https://rasa.com/docs/ 搭建的chatbot项目地址: https://github.c ...

  7. 手把手教你用Python代码实现微信聊天机器人 -- Python wxpy

    关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 来学习了,微信聊天机器人. 环境要求: Windows / Li ...

  8. 【翻译】用AIML实现的Python人工智能聊天机器人

    前言 用python的AIML包很容易就能写一个人工智能聊天机器人. AIML是Artificial Intelligence Markup Language的简写, 但它只是一个简单的XML. 下面 ...

  9. Python之路,Day18 - 开发一个WEB聊天来撩妹吧

    Python之路,Day18 - 开发一个WEB聊天来撩妹吧   本节内容: 项目实战:开发一个WEB聊天室 功能需求: 用户可以与好友一对一聊天 可以搜索.添加某人为好友 用户可以搜索和添加群 每个 ...

随机推荐

  1. Spider--补充_None_global_urlparse

    # 知识点补充: # 1) None: a = None if a: print("非None") else: print("None") if a is no ...

  2. linux 网络编程 基础

    网络编程基础 套接字编程需要指定套接字地址作为参数,不同的协议族有不同的地址结构,比如以太网其结构为sockaddr_in. 通用套接字: struct sockaddr { sa_family_t ...

  3. JAVA内存模型和Happens-Before规则

    前言 上一篇文章王子给大家介绍了并发编程中比较关心的三个核心问题,可见性.有序性和原子性. 今天我们继续来探索并发编程的内容,聊一聊JAVA的内存模型和Happens-Before规则. JAVA内存 ...

  4. 还不懂Docker?一个故事安排的明明白白!

    程序员受苦久矣 多年前的一个夜晚,风雨大作,一个名叫Docker的年轻人来到Linux帝国拜见帝国的长老. "Linux长老,天下程序员苦于应用部署久矣,我要改变这一现状,希望长老你能帮帮我 ...

  5. Luogu Daily & Original Blog (reproduced)

    震惊,新的功能:可以按Ctrl + F 进行关键字查询. \(update\) on 10.26:把这两个月的日报也加入进去了,并且修复了几个错误. 本文会把小编用过的博客和比较好的博客放在这里. 可 ...

  6. SpringBoot WebSocket 消息交互

    1. Websocket原理 Websocket协议本质上是一个基于TCP的独立协议,能够在浏览器和服务器之间建立双向连接,以基于消息的机制,赋予浏览器和服务器间实时通信能力. WebSocket资源 ...

  7. PHP一些不一样的思路

    大多数来自p牛 SQL注入(left join) 源代码 <?php $link = mysqli_connect('localhost', 'root', 'root'); mysqli_se ...

  8. ubuntu16.04搭建LAMP(独立安装)

    修改APT源 备份原文件source.list sudo cp /etc/source.list /etc/source.list.bak 修改source.list sudo vi /etc/sou ...

  9. scala中的val,var和lazy

    转自:https://yerias.github.io/2020/03/19/scala/3/#3%EF%BC%9Alazy%E4%BF%AE%E9%A5%B0%E7%AC%A6%E5%8F%AF%E ...

  10. 微课制作软件Camtasia中如何添加并编辑字幕?

    除了能录制视频以外,Camtasia还能直接把录制下来的视频进行剪辑,并添加视频字幕等等一些后期效果.今天我们就来看一看字幕的添加方法. 导入视频 微课制作软件Camtasia录制的视频,默认在软件& ...