gusaln / simple-tg-bot-api

极简主义强类型Telegram机器人API

0.1.0-alpha.2 2022-04-26 22:56 UTC

This package is auto-updated.

Last update: 2024-09-27 04:09:42 UTC


README

Telegram bot api Latest Version on Packagist Software License

极简主义强类型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_idmessage_id,或内联消息的inline_message_id,但不能同时接受这三个参数。 目前,此包不提供针对此无效状态的防护,但未来可能会提供。 目前,请始终阅读构造函数描述。

更多示例,请查看examples文件夹。

类型

所有来自Telegram机器人API的类型,如UpdateMessage等,都作为类在GusALN\TelegramBotApi\Types\命名空间中提供。它们实现JsonSerializable,并有一个静态的fromPayload(array $payload): self方法,允许您反序列化它们。

抽象类型的fromPayload方法,如具有子类型MenuButtonCommandsMenuButtonWebAppMenuButtonDefaultMenuButton,在可能的情况下返回特定子类型的实例。大多数抽象类型都有一个属性,其值指定了其子类型。以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\RequestInterfacestring的更新。

$fetcher = new \GusALN\TelegramBotApi\WebhookUpdateFetcher();
$update = $fetcher->fetch($request);

轮询更新

请检查 examples/get_updates_polling.php 中的示例。

随着包的成熟,我可以期待哪些变化?

更好的API,包括

  1. 一些请求中的工厂方法。例如,editMessageText 可以接受常规消息的 chat_idmessage_id,或内联消息的 inline_message_id

  2. BotApi 上的通用方法,用于常见任务。例如,拥有一个接受所有发送某种内容的请求的 send 方法(sendMessagesendPhotosendAudio 等)。

测试

我并不总是测试我的代码,但当我测试时,我在生产环境中测试。

非常认真地讲,预期测试会在我对API进行足够的操作,对其形状有一个清晰的了解之后出现。我已经对一些方法进行了粗略的实际测试,以验证它们确实有效。

对于第一个beta版本(0.1.0),将有测试。

变更日志

有关最近更改的更多信息,请参阅CHANGELOG

安全

如果您发现任何与安全相关的问题,请通过电子邮件git.gustavolopez.xyz@gmail.com联系,而不是使用问题跟踪器。

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件