利用 EasyWeChat 和 ChatterBot 简单搭建一个公众号「自动回复机器人」_weixin_34275734的博客-程序员宅基地

技术标签: python  php  

自从公众号列表页改版以来,很多人都说会弱化公众号菜单的作用。

363F584F-0C0A-4D9C-B23B-7A6EAA0B0A3B

而且,对于个人号来说,开发模式下是不能操作菜单开发的。

所以我们索性「放弃菜单」,制作「自动回复」来替代菜单功能。

开发「自动回复」功能,本文特推荐两个工具:

  • EasyWeChat

微信开发,从未如此简单
每一个功能设计,都经过精心打磨,只为了提供更好的开发体验

https://www.easywechat.com/

在我的「Laravel 学习图谱」https://github.com/fanly/laravel-awesome中,把这个 EasyWeChat 作为首推,值得大家一试。

  • ChatterBot

ChatterBot is a Python library that makes it easy to generate automated responses to a user’s input.

https://chatterbot.readthedocs.io/en/stable/

注: 上图来自 ChatterBot 网站

下面简述对这两个工具的使用,来构建我们的「自动回复」功能。

EasyWeChat

正如其官网所述的那样,只要简单引入,几步就可以开发公众号管理系统了。

1. 安装 EasyWeChat 插件
composer require "overtrue/laravel-wechat:~4.0"

2. 添加配置文件
php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"

3. 在 config/wechat.php 配置文件加入公众号参数

4. 添加路由
Route::any('wechat', '[email protected]');

5. 增加 WeChatController
public function serve()
{
    $app = app('wechat.official_account');
    $app->server->push(function ($message) {
        switch ($message['MsgType']) {
            case 'text':
                return $this->getChatBotMessage($message['Content']);
                break;
            default:
                $data = $this->article->random();
                if ($data) {
                    return $data->title
                        ."\n"
                        ."https://www.coding01.cn/"
                        .$data->slug;
                }
                return '收到其它消息';
                break;
        }
    });

    return $app->server->serve();
}

好了,我们根据获取的消息的类型,做对应的处理,如,发送的文本消息,则通过 ChatterBot 自动聊天回复;如果是其他的消息,则随机回复一篇我们的文章。

可以看看效果:

1F022C85-8757-4338-B2DB-CB6732D0ADE6

对于「EasyWeChat」其它功能,可以参考官网说明。目前暂时够用,就不再深入分析了。

ChatterBot

无论国内网,有很多做「自动机器人」的

  • 国外:wit.ai, api.ai, luis.ai
  • 国内:yige.ai, ruyi.ai

但对于程序员来说,使用平台来达到目标,好像显得有点 low,不够装逼

所以我们还是折腾折腾,找一些比较简单又易于扩展的开源代码来用用,而且还能学习扩展,一举多得。

在我读书的时候,知道要实现 AI,主要步骤包含:

  1. 模式建立;
  2. 训练集训练;
  3. 特征提取;
  4. 模式识别,智能匹配;
  5. 测试

而寻找了一圈,发现 ChatterBot 比较合适我们使用和学习。

当然今天的目标是看如何使用:

安装 ChatterBot

使用 pip 安装,还是很方便:

pip install chatterbot

初次使用

简单加入几条语句用于训练。

from chatterbot import ChatBot
from chatterbot.trainers import ListTrainer

chatbot = ChatBot("yemeishuBot")

conversation = [
    "Hello",
    "Hi there!",
    "How are you doing?",
    "I'm doing great",
    "That is good to hear",
    "Thank you.",
    "You're welcome."
]

chatbot.set_trainer(ListTrainer)
chatbot.train(conversation)

response = chatbot.get_response("How are you doing?")
print(response)

看看运行结果:

TerminalAdapter

使用终端输入输出。

from chatterbot import ChatBot
from chatterbot.trainers import ListTrainer

chatbot = ChatBot(
    "yemeishuBot",
    input_adapter="chatterbot.input.TerminalAdapter",
    output_adapter="chatterbot.output.TerminalAdapter",
    )

conversation = [
    "Hello",
    "Hi there!",
    "How are you doing?",
    "I'm doing great",
    "That is good to hear",
    "Thank you.",
    "You're welcome."
]

chatbot.set_trainer(ListTrainer)
chatbot.train(conversation)

print("Type something to begin...")

# The following loop will execute each time the user enters input
while True:
    try:
        # We pass None to this method because the parameter
        # is not used by the TerminalAdapter
        bot_input = chatbot.get_response(None)

    # Press ctrl-c or ctrl-d on the keyboard to exit
    except (KeyboardInterrupt, EOFError, SystemExit):
        break

可以在终端输入,得结果了:

使用中文语料

我的公众号,主要针对国内用户,当然要使用中文语料来做智能回复。

from chatterbot import ChatBot

chatbot = ChatBot(
    "yemeishuBot",
    input_adapter="chatterbot.input.TerminalAdapter",
    output_adapter="chatterbot.output.TerminalAdapter",
    trainer='chatterbot.trainers.ChatterBotCorpusTrainer'
)

chatbot.train('chatterbot.corpus.chinese')
print("Type something to begin...")

# The following loop will execute each time the user enters input
while True:
    try:
        # We pass None to this method because the parameter
        # is not used by the TerminalAdapter
        bot_input = chatbot.get_response(None)

    # Press ctrl-c or ctrl-d on the keyboard to exit
    except (KeyboardInterrupt, EOFError, SystemExit):
        break

使用 flask 封装

当然最后,我们需要做成接口,供多地方使用。

本文推荐使用这个:https://github.com/chamkank/flask-chatterbot

Simple boilerplate for ChatterBot using Flask

安装插件:

pip install -r requirements.txt

在后台运行:

nohup python -u flush.py > flush.log 2>&1 &

结合 EasyWeChat 和 ChatterBot

这就很简单了,只要在我们的 PHP 代码中直接调用这个接口即可:

public function getChatBotMessage($content)
{
    $client = new Client(['base_uri' => 'http://localhost:5000']);
    $response = $client->request('GET', 'get', [
        'query' => ['msg' => $content]
    ]);

    return $response->getBody()->getContents();
}

显示效果:

总结

今天利用 EasyWeChat 和 ChatterBot 简单搭建一个公众号「自动回复机器人」,利用 EasyWeChat 桥接好公众号和机器人。

之后我们就可以不断完善 ChatterBot 功能,结合系统项目中的文章内容,作为我们自己的语料做训练,提高机器人的自动回复能力。

当然可以参考微软推出 AI 开发免费电子书,手把手教你构建智能聊天机器人《A Developer’s Guide to Building AI Applications》中的架构来设计:

最后,你也可以试试其他,如基于 tensorflow 的机器人。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34275734/article/details/88797406

智能推荐

历届蓝桥杯C/C++程序设计省赛试题_AndyMoe的博客-程序员宅基地

http://blog.csdn.net/u014552756/article/details/50583944

sqlite3 java 内存,嵌入式数据库SQLite与Java_欧明新的博客-程序员宅基地

嵌入式数据库SQLite与Java嵌入式数据库SQLite与JavaSQLite作为一个开源的嵌入式数据库产品,具有系统开销小,检索效率高的特性,适用于手机、PDA、机顶盒设备等电器,并且作为嵌入式数据库在可下载的消费类应用程序中运行的很好。这篇文章介绍嵌入式数据库产品SQLite的技术特点,并着重讨论研究与Java语言之间的接口,并以实例说明如何使用JAVA开发基于SQLite的应用程序。通常我...

ubuntu 20.04安装virtualenv和virtualenvwrapper安装及使用方法(含pip3的安装和使用)_shyvv的博客-程序员宅基地_ubuntu 安装virtualenv

一、安装1.1安装pip安装pip3sudo apt install python3-pip1.2安装virtualenv和virtualenvwrapperpip3 install virtualenvpip3 install virtualenvwrapper二、配置2.1创建虚拟环境的根目录mkdir $HOME/.virtualenvs$HOME无需更改2.2配置环境变量sudo gedit ~/.bashrc将下面的内容复制到最后。e

Winform 部署mshtml程序集出错的一个解决方案_weixin_30275415的博客-程序员宅基地

带mshtml的程序运行出错解决方案 在一个程序中引用了Microsoft mshtml.dll,做好之后本机测试没问题,发给客户以后,部分客户运行出错,提示: System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> System.IO.FileNotFoundException: 未能加载文件或程序集“Mi...

如何在SEP12.1的管理服务器和客户端之间启用SSL_林家大公子的博客-程序员宅基地

问题如何在SEP 12.1中的SEPM服务器和客户端之间启用安全套接层协议----Secure Sockets Layer (SSL)环境本文档仅针对于Symantec Endpoint Protection 12.1SSL在SEP 11.x版本中,使用的是IIS服务器,而不是Apache.这部分内容请参考http://www.symantec.com/docs/TECH102371(SEP 11.x: Configuring SSL to work with...

Web前端探索之滚轮事件(wheelEvent)_diaoxia7383的博客-程序员宅基地

  前段时间使用canvas做滚动条控件,添加滚轮事件时,查阅了一些资料,发现大都是文档描述或简单示例,对于开发者还是不够。wheelEvent对象中的一些属性(比如wheelDelta、detail等)虽然官方文档有完整描述,但部分或大部分浏览器厂商并没有(真正)实现,这就很容易诱导大家错误使用。所以我针对当前常用浏览器重新测试了一下。测试目标:探索wheelEvent事件中...

随便推点

C++友元函数和友元类的使用基础_Keycer的博客-程序员宅基地

友元函数百度百科:      友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。      友元类百度百科:      友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。

springboot集成通用mapper详细配置_终于等到伱的博客-程序员宅基地

通常,我们利用mybatis写持久层方法。要么按照传统定义mapper方法,定义xml文件的方式,全部手写。要么需要通过mybatis-generator逆向工程插件生成大量的xxxExample文件,使得系统看起来比较臃肿。而通用mapper的引入,我们不需再生成大量的Example文件,并且通用mapper已经封装好了所有的单表操作。通用mapper与springboot项目集成配置如下:...

MPP安装部署_带主备_qq_39693441的博客-程序员宅基地_mpp部署

01.MPP规划机器名 IP地址 初始状态MPP01 192.168.1.81 主库EP_01备库EP_02MPP02 192.168.1.82 主库EP_11备库EP_12监视器 192.168.1.83 监视器主库EP_01的备库是EP_12,主库EP_11的备库是EP_02主库端口规划:实例名 PORT_NUM MAL_INST_DW_PORT MAL_HOST MAL_PORT MAL_DW_PORT MPP实例序号EP_01 5236 5243 192.168.1.81 533

单片机中灯泡显示miss_帮忙看一下单片机流水灯程序哪里错了(亮灯控制出现问题) 请教高人..._weixin_39829501的博客-程序员宅基地

兄弟,main函数不是这样用的啊,你这C语言掌握的不是很好啊,有时间还是先看看C语言再编程,加油#include#include#define uchar unsigned charsbit button = P3^2;//外部中断P3^2和P3^3使用中断可以不用位定义sbit button1 = P3^3;//外部中断P3^2和P3^3使用中断可以不用位定义int i=8,j=8;bit pr...

GA005-181-05_Chasing stars的博客-程序员宅基地

Organization ChartOrganizationChart模式创建元素和图表,为组织的角色、职责和报告线建模。各种各样的线条样式和颜色被用来帮助布局和吸引人的图表。图1。显示已安排为显示为组织定义的角色组的报告行的类。讨论模式的目的是允许业务分析师、业务架构师或其他涉众创建一个组织图,以表示特定时间点的组织结构。组织部门、角色或指定人员可以作为图表的一部分。它通常在定义企业或业务体系结构时使用,并允许将角色包含在存储库的其他部分中,例如,表示哪个角色、职务或人员负责给定的业务流程、功

logging模块使用_星空-zsl的博客-程序员宅基地

基本用法import logginglogging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')logger = logging.getLogger(__name__)logger.info("Start print log")log...

推荐文章

热门文章

相关标签