alexvkokin/telegram-bot-app

用于创建Telegram机器人应用程序的工具

1.1.0 2021-02-01 19:18 UTC

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 - 您的启动控制器,创建方法请参阅 控制器操作 部分