简易词 / 机器人底盘
简化您的Telegram机器人开发
Requires
- php: >=7.0.0
- illuminate/contracts: ~5.0
- irazasyed/telegram-bot-sdk: dev-master
- predis/predis: ^1.1
Requires (Dev)
- phpspec/prophecy: ^1.5
- phpunit/phpunit: ^5.0
Suggests
- illuminate/container: Illuminate Container implementation
This package is not auto-updated.
Last update: 2024-09-28 20:25:20 UTC
README
警告:目前处于 ALPHA 状态,因为
- 快速入门未测试,controller.md 未完成
- 目前使用的telegram-bot-sdk没有稳定版本
- 测试覆盖率低(但正在缓慢增长)
- 纯PHP的集成选项不足
- Chassis API没有参数验证
什么?
在基本telegram API(telegram-bot-sdk)之上添加一个功能完整的层,以极大地加快telegram机器人开发
为什么?
telegram-bot-sdk为机器人开发提供了一个稳定的API层。然而,对于功能齐全的机器人,许多方面都缺失了。您不能直接进入定义机器人的行为,您首先需要一个路由系统来处理任意更新,一个跟踪用户对话和持久化相关数据的系统等。这个包旨在实现这个中间层,并使您能够直接进行有趣的部分!
功能概述
-
基于telegram-bot-sdk,并使所有功能易于访问
-
使用控制器轻松处理任何传入的更新。例如
-
处理命令(/text)
-
处理任何(其他)文本消息
-
处理内联和回调查询
-
对事件做出反应,如用户加入和离开聊天等。
-
使用简单但强大的配置来连接和链式控制器
-
开箱即用集成Laravel(和Redis作为后端)
-
开箱即用持久化存储元数据
-
每个会话(与用户和聊天相关联),消息(对于回调查询),聊天或用户
-
支持会话(消息链)和控制消息流的助手
-
轻松将处理程序附加到您的回调查询
文档
请参阅下面的 快速入门教程
配置(进行中)
安装方法、配置选项、框架集成和telegram-bot-sdk集成。
控制器(即将推出)
将更新路由到控制器、控制器功能和持久化元数据存储
API(即将推出)
Telegram机器人API
机器人只能做到官方Telegram机器人API定义的那样。
telegram-bot-sdk (Github, 文档)
bot-chassis基于telegram-bot-sdk构建,支持所有功能。如果您来自telegram-bot-sdk,请查看迁移指南。
反馈、问题、贡献
您可以使用 问题跟踪器 进行所有这些操作。
您也可以在 Slack PHP Chat 上找到我和其他机器人开发者(直接向irazasyed发送消息以获取对#telegram-bot-sdk的访问权限)
如果拉取请求使用PSR-2编码标准,有测试并且可以从功能分支中拉取,则非常受欢迎。
快速入门
本教程使用Laravel和Redis,并介绍了基本功能Controller
和MetaData
。
有关更多替代方案,请参阅集成指南[配置]。
安装
安装PHP7、Laravel和Redis。配置Laravel以使用您的数据库和Redis实例。
告诉composer使用telegram-bot-sdk
并设置dev
稳定性(在我们可以使用稳定版本之前需要使用)
composer require irazasyed/telegram-bot-sdk:@dev
将bot-chassis
添加到composer.json
composer require sloothword/bot-chassis
在app.php中添加LaravelServiceProvider
'providers' => [
...
Chassis\Laravel\ChassisServiceProvider::class,
发布配置(和迁移)
artisan vendor:publish
打开config/chassis.php
并插入您的机器人凭据。
测试运行
向机器人发送命令(命令有/echo
、/delayed
、/double
等,见Chassis/Controller/EchoController.php),然后调用artisan chassis:handle
来处理它。
教程机器人
本教程机器人将具有三个功能
- 机器人在聊天中添加每个整数消息。
/reset
将计数器重置为0/set
将计数器设置为发送的下一个整数
控制器
在您的应用程序命名空间和结构下创建一个新的控制器。
<?php namespace App\Controller; use Chassis\Controller\Controller; class CountController extends Controller { public function add(){ // Add sent number to counter } public function reset(){ // Reset the counter } public function set(){ // Set the counter to the next integer message } }
并将其添加到chassis.php中的控制器列表中(并移除其他控制器)
'bots' => [
'mybot' => [
'username' => 'BOT-USERNAME',
'token' => env('TELEGRAM_BOT_TOKEN', 'BOT-TOKEN'),
'shared' => [],
'controllers' => [
['text', App\Controller\CountController::class, 'add'],
['/reset', App\Controller\CountController::class, 'reset'],
['/set', App\Controller\CountController::class, 'set']
],
],
],
现在每次您向机器人发送/reset
命令时,都会调用CountController
的reset()
方法。每次我们向机器人发送文本(这并不是命令)时,都会调用add()
方法。
学习计数
通过调用$this->getConversationData()
($this->getUpdate()->getMessage()->getText()
的快捷方式)获得的元数据在Chassis框架中被持久化,并与当前对话相关联。在这里使用它意味着每个用户和聊天都有自己的计数器。
我们还可以使用与用户关联的元数据对象($this->getMetaData($this->getUser())
)为每个用户在整个聊天中获得单个计数器。使用$this->getMetaData($this->getChat())
,聊天中的所有用户可以一起计数。
class CountController extends Controller
{
public function add(){
$value = intval($this->getText());
$conversationData = $this->getConversationData();
$counter = $conversationData->get('count', 0);
$conversationData['count'] = $counter + $value;
$this->replyWithMessage(['text' => 'New value: ' .$conversationData['count']]);
}
public function reset(){
$this->getConversationData()->forget('count');
$this->replyWithMessage(['text' => 'Reset counter']);
}
}
注意
- 您不需要担心保存已更改的元数据,因为它将自动完成。
- 元数据扩展了Illuminate/Support/Collection(请参阅
get()
、has()
和forget()
方法)。 $this->getText()
是$this->getUpdate()->getMessage()->getText()
的快捷方式- 控制器使用了
Telegram\Bot\Answers\Answerable
特质,因此您可以使用所有reply*
方法
输入和会话流程
对于/set
命令,我们需要做三件事
- 指示用户发送新的计数
- 定义应处理响应的控制器方法
- 在该方法中,将计数器设置为消息文本
public function set(){
$this->replyWithMessage(['text' => 'Insert new value:']);
$this->getConversationData()->nextConversationStep(self::class, 'saveCounter');
}
public function saveCounter(){
$value = intval($this->getText());
$conversationData = $this->getConversationData();
$conversationData['count'] = $value;
$this->replyWithMessage(['text' => 'Set counter to ' .$value]);
$conversationData->clearConversation();
}
注意最后一行:因为我们设置了下一个处理方法为saveCounter()
,所以机器人将一直调用该方法,直到我们告诉他不要这样做->clearConversation()
。
注意:此行为将很快更改。
完成
尝试使用您的完成机器人。
还可以尝试artisan chassis:handle --loop
以持续运行您的机器人。
有关更多功能和详细信息,请参阅文档文档。