gusaln / simple-tg-bot-api
极简主义强类型Telegram机器人API
Requires
- php: ^8.0
- ext-json: *
- guzzlehttp/guzzle: ^6.0|^7.0
Requires (Dev)
- php: ^8.0
- friendsofphp/php-cs-fixer: ^3.8
- phpro/grumphp-shim: ^1.11
- phpstan/phpstan: ^1.5
- symfony/css-selector: ^6.0
- symfony/dom-crawler: ^6.0
This package is auto-updated.
Last update: 2024-09-27 04:09:42 UTC
README
极简主义强类型Telegram机器人API。
本包深受 tg-bot-api/bot-api-base 的启发。
注意:此包仍在alpha阶段。
在使用此包之前,请先阅读测试部分。
此包提供什么?
- 它提供了一种使用强类型参数与Telegram API交互的方法。
- 它提供了一种在webhook中捕获更新的方法。
此包不提供什么?
处理命令、内联查询或跟随对话的框架。这些需要您自己实现。
支持的Telegram机器人API
支持Telegram机器人API 6.0(2022年4月16日)
安装
通过Composer
composer require gusaln/simple-tg-bot-api
使用
您需要实例化BotApi类,该类提供Telegram机器人API的所有方法。
$botToken = '<bot token>'; $api = new \GusALN\TelegramBotApi\BotApi( $botToken, new \GusALN\TelegramBotApi\Client\GuzzleClient() ); // If no ClientInterface is provided as second argument, a GuzzleClient is created by default. $api = new \GusALN\TelegramBotApi\BotApi($botToken);
所有API方法在BotApi类中都有一个对应的方法,该方法接受一个包含该方法所有参数的MethodRequest对象。
$userId = '<user id>'; $message = $api->sendMessage( new \GusALN\TelegramBotApi\MethodRequests\SendMessageRequest($userId, "Hello") ); $editedMessage = $api->editMessageText( new \GusALN\TelegramBotApi\MethodRequests\EditMessageTextRequest( $message->chat->id, $message->messageId, "Good bye!" ) );
这样,您可以防止输入任何错误的参数或打乱它们的类型。
警告:例如,editMessageText方法可以接受普通消息的chat_id和message_id,或内联消息的inline_message_id,但不能同时接受这三个参数。 目前,此包不提供针对此无效状态的防护,但未来可能会提供。 目前,请始终阅读构造函数描述。
更多示例,请查看examples文件夹。
类型
所有来自Telegram机器人API的类型,如Update、Message等,都作为类在GusALN\TelegramBotApi\Types\命名空间中提供。它们实现JsonSerializable,并有一个静态的fromPayload(array $payload): self方法,允许您反序列化它们。
抽象类型的fromPayload方法,如具有子类型MenuButtonCommands、MenuButtonWebApp和MenuButtonDefault的MenuButton,在可能的情况下返回特定子类型的实例。大多数抽象类型都有一个属性,其值指定了其子类型。以MethodButton类型家族为例,属性type可以是
commands用于MenuButtonCommands,web_app用于MenuButtonWebApp,或default用于MenuButtonDefault。
这些值作为常量提供在所有抽象类型中
// omitted code abstract class MenuButton implements JsonSerializable { public const MENU_BUTTON_COMMANDS_TYPE = 'commands'; public const MENU_BUTTON_WEB_APP_TYPE = 'web_app'; public const MENU_BUTTON_DEFAULT_TYPE = 'default'; // omitted code }
此模式的第一个例外是InputMessageContent类型家族,它没有用于定义它们的特定属性值对,并使用其他方法来识别它们。
另一个例外是类型MessageEntity,尽管它不属于家族,但其在常量中指定了类型字符串。
枚举
为某些魔法字符串提供了枚举类。目前有两个:GusALN\TelegramBotApi\Enums\ParseMode::*和GusALN\TelegramBotApi\Enums\ChatAction::*。
您可以使用ParseMode::*常量指定消息的parse_mode参数。
$message = $api->sendMessage( new \GusALN\TelegramBotApi\MethodRequests\SendMessageRequest( $userId, "<b>bold</b>, <strong>bold</strong>, <i>italic</i>, <em>italic</em>", parseMode: \GusALN\TelegramBotApi\Enums\ParseMode::HTML ) );
从webhook获取更新
WebhookUpdateFetcher可以解析来自Psr\Http\Message\RequestInterface或string的更新。
$fetcher = new \GusALN\TelegramBotApi\WebhookUpdateFetcher(); $update = $fetcher->fetch($request);
轮询更新
请检查 examples/get_updates_polling.php 中的示例。
随着包的成熟,我可以期待哪些变化?
更好的API,包括
-
一些请求中的工厂方法。例如,
editMessageText可以接受常规消息的chat_id和message_id,或内联消息的inline_message_id。 -
BotApi上的通用方法,用于常见任务。例如,拥有一个接受所有发送某种内容的请求的send方法(sendMessage、sendPhoto、sendAudio等)。
测试
我并不总是测试我的代码,但当我测试时,我在生产环境中测试。
非常认真地讲,预期测试会在我对API进行足够的操作,对其形状有一个清晰的了解之后出现。我已经对一些方法进行了粗略的实际测试,以验证它们确实有效。
对于第一个beta版本(0.1.0),将有测试。
变更日志
有关最近更改的更多信息,请参阅CHANGELOG。
安全
如果您发现任何与安全相关的问题,请通过电子邮件git.gustavolopez.xyz@gmail.com联系,而不是使用问题跟踪器。
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。