简易词/机器人底盘

简化您的Telegram机器人开发

dev-master 2016-12-11 11:51 UTC

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,并介绍了基本功能ControllerMetaData

有关更多替代方案,请参阅集成指南[配置]。

安装

安装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命令时,都会调用CountControllerreset()方法。每次我们向机器人发送文本(这并不是命令)时,都会调用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以持续运行您的机器人。

有关更多功能和详细信息,请参阅文档文档