fsa / telegram-bot-api
Telegram Bot API
Requires
- php: ^8.1
- ext-curl: *
- psr/log: ^3.0
Requires (Dev)
- phpstan/phpstan: ^1.10
README
该库可以用于简化与Telegram Bot API的交互 - https://core.telegram.org/bots/api。通过它,可以生成API请求并将其发送到服务器,同时支持使用Webhook。
此包装器可以在PHP的简单项目中使用,也可以在框架中作为一部分使用。在使用框架库时,需要创建以下服务(根据需要)
- TelegramBotApi -- 生成用于请求API的对象;
- TelegramBotQuery -- 用于向API发送请求的服务;
- TelegramBotWebhook -- 用于处理Webhook的辅助服务。
示例:Symfony,文件 config/services.yaml
FSA\Telegram\TelegramBotApi: FSA\Telegram\TelegramBotQuery: bind: $token: '%env(resolve:TELEGRAM_BOT_API_TOKEN)%' FSA\Telegram\TelegramBotWebhook: bind: $token: '%env(resolve:TELEGRAM_BOT_API_SECRET)%'
安装
使用composer安装此库
composer require fsa/telegram-bot-api
创建请求服务器的消息
为Telegram Bot API的方法创建了相应的类。方法名与类名不同之处在于,类名以大写字母开头。
通过库可用的API方法
- getFile;
- getMe;
- getUpdates;
- getWebhookInfo;
- sendAnimation;
- sendAudio;
- sendDice;
- sendDocument;
- sendLocation;
- sendMessage;
- sendPhoto;
- sendSticker;
- sendVideo;
- setWebhook.
可以像通过TelegramBotApi类调用相应的方法一样,也可以直接使用相应的类来创建所需的请求。类的方法和构造函数作为参数需要为所选请求提供相应的必选参数。对于安装可选参数,可以使用方法链,例如
$message = (new FSA\Telegram\SendDice($chat_id, 1))->setDisableNotification()->setProtectContent();
或
$message = (new FSA\Telegram\TelegramBotApi)->sendDice($chat_id, 1)->setDisableNotification()->setProtectContent();
如果请求需要附加文件,则可以使用CURLFile
来完成,包括通过过程式风格
$file = curl_file_create(realpath('my_photo.jpg')); $message = (new FSA\Telegram\TelegramBotApi)->sendPhoto($chat_id, $file);
执行服务器请求
使用httpGet()
、httpPost()
或httpPostJson()
方法执行服务器请求。在此过程中,需要在FSA\Telegram\TelegramBotQuery
构造函数中设置访问令牌。
// Создание нового запроса $telegram_bot_query = new FSA\Telegram\TelegramBotQuery('TOKEN'); // Создание метода sendMessage $message = new FSA\Telegram\SendMessage($chat_id, "Привет"); // Передача запроса на сервер $telegram_bot_query->httpPostJson($message);
或者在使用框架控制器时,将TelegramBotApi
服务传递给$telegramBotApi
,将TelegramBotQuery
传递给$telegramBotQuery
$telegramBotQuery->httpPostJson($telegramBotApi->sendMessage($chat_id, 'Привет'));
任何用于API的方法的对象都实现了TelegramBotMethodInterface
接口
getMethodName()
- 允许获取API方法名;getRequestParameters()
- 请求参数以数组形式;getWebhookResponse()
- 获取用于生成Webhook
响应的数组。
处理Webhook
使用TelegramBotWebhook
不是必需的。它可以用来存储当前的Update
,解码它,并验证秘密令牌。
$webhook = new FSA\Telegram\TelegramBotWebhook('SECRET'); $update = $webhook->verify($request->headers->get('X-Telegram-Bot-Api-Secret-Token'))->setUpdate($request->getContent())->getDecodedUpdate();
如果想要检查来自服务器的请求中的X-Telegram-Bot-Api-Secret-Token
头,则需要指定SECRET
值。
数据可以以原始形式、字符串形式获取
$update = $webhook->getUpdate();
可以多次获取请求数据。原始请求被保存在类内部。
可以通过任何API方法的getWebhookResponse()
方法获取Webhook的响应
$this->json($telegramBotApi->sendMessage($chat_id, "Привет")->getWebhookResponse())->setEncodingOptions(JSON_UNESCAPED_UNICODE);
Update实体
如果需要,可以使用symfony/serializer
或类似功能的包将Update分解成实体。所有必要的实体都收集在命名空间Entity
中。
$webhook = new FSA\Telegram\Webhook; $update = $serializer->deserialize($webhook->getUpdateRaw(), FSA\Telegram\Entity\Update::class, 'json');
此外,还可以在IDE中使用命名空间Entity
中的类来生成提示,而无需直接使用。