alexvkokin / telegram-bot-app
用于创建Telegram机器人应用程序的工具
Requires
- php: >=7.0
This package is auto-updated.
Last update: 2024-09-29 05:56:12 UTC
README
要安装,请在命令行中运行以下命令
composer require alexvkokin/telegram-bot-app
路由器
键盘映射
项目中使用的路由器是KeyboardMap
类的静态变量keyboardMap
,以下将其称为按钮图
,它描述了到达控制器和方法的完整路径,以及启动它们的命令。
例如
protected static $keyboardMap = [ 'Tbot/TestApp/StartController' => [ 'actionStart' => [ "setButton" =>[ ["icon" => 'F09F91A4', "text" => 'Профайл', "controller" => "Tbot/TestApp/ProfileController", "action" => "actionIndex"], ], "inline" => [ ["command" => '/start'] ] ], 'actionGoodluck' => [ "inline" => [ ["command" => '/goodluck'] ] ] ], 'Tbot/TestApp/ProfileController' => [ 'actionIndex' => [ "setButton" =>[ ["icon" => 'E284B9', "text" => 'Информация о профайле', "controller" => "Tbot/TestApp/ProfileController", "action" => "actionData"], ["icon" => 'E2988E', "text" => 'Мой контакт', "controller" => "Tbot/TestApp/ProfileController", "action" => "actionContact", 'params' => ["request_contact" => true]], ["icon" => 'E29780', "text" => 'Назад', "controller" => "Tbot/TestApp/StartController", "action" => "actionStart"], ], "inline" => [ ["command" => '/profile'], ["callback" => 'profileGet'] ] ], 'actionMessage' => [ 'message' => 'Tbot/Message/Text', ], ], ];
从示例中可以看出,数组中的每个元素都是控制器描述
'Tbot/TestApp/StartController'
- 控制器的完整路径。在描述自己的类时,务必使用命名空间,以避免冲突
'actionStart'
- 在'Tbot/TestApp/StartController'
类中的方法名称
'setButton'
- 当执行'actionStart'
方法时,将安装到机器人中的keyboard
按钮的描述。但是,仅描述按钮图中的按钮不足以安装它们,还需要从类方法中显式设置安装请求(有关更详细的信息,请参阅'Tbot/TestApp/StartController'->'actionStart'
方法代码)。按钮格式
- icon - 按钮图标的代码,按钮代码。取自Bytes列,从代码中删除所有
\x
,例如代码\xC2\xAE
应转换为C2AE
- text - 按钮名称
- controller - 点击机器人中的按钮时调用的控制器
- action - 点击机器人中的按钮时调用的操作
- params - 按钮的附加参数,例如如果我们想点击机器人中的按钮时发送用户联系人,则在参数中指定
'params' => ["request_contact" => true]
'inline'
- 描述inline命令,当从Telegram机器人执行时,将启动相应类的'actionStart'
方法
'callback'
- 与inline键盘相关的事件。在此参数中,我们指定将处理具有callback_data
的按钮的方法名称。例如,我们有一个按钮"显示我的数据"
$keyboard = [ "inline_keyboard" => [ [ [ "text" => "Вывести мои данные", "callback_data" => "profileGet|id=5|parent_id=1", ], ] ] ];
为了在服务器端捕获对按钮的点击,我们应在按钮图中指定将捕获该事件的控制器和方法。为此,我们将添加以下条目
'Tbot/TestApp/ProfileController' => [ 'actionIndex' => [ "inline" => [ ["callback" => 'profileGet'] ] ] ]
这样,我们就指定了当点击按钮"显示我的数据"
时,将执行Tbot/TestApp/ProfileController
控制器的profileGet
方法。参数id=5|parent_id=1
将作为数组在callbackParams
字段中可用
[ 'id' => 5, 'parent_id' => 1, ]
'message'
- 上面描述了通过点击捕获事件的方式。此属性包含将被捕获并传递到'actionMessage'
方法的类消息名称,该方法是'Tbot/TestApp/ProfileController'
类的
要描述自己的按钮图,创建一个新类,例如AppKeyboardMap
,将其扩展为基本类KeyboardMap
,并在其中描述所有应用程序类和它们的方法。请参阅test/map/AppKeyboardMap.php
文件夹中的示例
处理控制器
上面我们创建了一个包含我们的控制器、方法和与它们相关的按钮和命令的描述的自己的AppKeyboardMap
类。接下来,我们需要创建所有这些控制器和方法。
我们将创建一个扩展Controller
基本类的StartController
类,并创建一个actionStart()
方法。当此方法被触发时,我们将设置用户机器人的按钮。哪些按钮将设置已在我们的按钮图中描述(请参阅上面的部分)。请参阅test/controllers/StartController.php
文件夹中的StartController类示例
public function actionStart() { $keyboard = [ "keyboard" => [ Helper::keyboard(static::$keyboardMap, get_class($this), 'actionStart'), ], "one_time_keyboard" => false, "resize_keyboard" => true ]; $api = new ApiRequest($this->token); $api->sendButtons($this->message->getChatId(), $keyboard, 'Добро пожаловать в наш бот'); }
如您所见,这里执行了对Telegram机器人API的请求以安装按钮。按钮的构建是通过使用Helper::keyboard
辅助器完成的。
Helper::keyboard(static::$keyboardMap, get_class($this), 'actionStart'),
我们将我们的地图、类名和方法的名称发送给它。如果按钮地图中指定的地址存在setButton
安装按钮的选项,那么其中的所有按钮都将被安装在用户机器人中。
启动项目
首先,我们需要通过Webhook设置脚本,该脚本将捕获来自Telegram机器人的消息。在脚本中写入以下代码:
$message_data = file_get_contents('php://input'); // получаем сообщение от телеграм бота $tbot_key = 'API Ключ от вашего бота'; $keyboardMap = \Tbot\TestApp\AppKeyboardMap::getKeyboardMap(); // Получаем вашу карту кнопок if ($app = new \Tbot\TestApp\StartController($message_data, $tbot_key, $keyboardMap)) { $app->run(); }
\Tbot\TestApp\AppKeyboardMap
- 您的地图,创建方法请参阅 键盘地图 部分 \Tbot\TestApp\StartController
- 您的启动控制器,创建方法请参阅 控制器操作 部分