如何使用PHP启动电报机器人

如果您正在阅读本文,您就会知道聊天机器人是2016年最大的技术趋势之一。

机器人革命不仅涉及人工智能。 机器人可以是您的Messenger中的工具,具有简单的聊天界面,可用于扩展站点或服务的功能,甚至可以是独立的应用程序。 机器人的开发成本较低且易于安装,而另一个强大的功能是可以在各种类型的设备(笔记本电脑,智能手机和平板电脑)上使用Messenger。 这就是为什么现在每个人都对机器人感到疯狂的原因。

开放式机器人API的最大使者是Telegram

我们要做什么

在本文中,我们将创建一个简单的秒表Telegram机器人。 我将向您展示如何创建机器人,与分析进行连接,编写一些代码以及最终将机器人添加到机器人商店。

顺便说一下,我已经准备好一个演示,因此您只需将@stopwatchbot添加到您的Telegram联系人列表中就可以对其进行测试。

用BotFather创建一个Bot

创建机器人的第一步是在Telegram中注册您的机器人帐户。 为此,有一个名为BotFather的机器人 。 只要将其添加到您的联系人列表中,您就可以通过键入/newbot命令并按照BotFather的说明来创建和设置Telegram机器人。

BotFather运行电报

注册新的漫游器后,您会收到一条带有授权令牌的祝贺消息。 我们将很快使用此令牌来授权漫游器并将请求发送到Bot API。

稍后,您可以使用BotFather将描述或照片添加到机器人的配置文件中,重新生成令牌,设置要使用的命令列表,删除帐户等。 要获取命令的完整列表,只需在聊天中键入/help即可获取BotFather的命令列表。

连接到Botan Analytics

Telegram Bots API中没有内置的分析功能,但是了解您有多少用户,他们的行为方式以及触发更多命令的命令很重要。 当然,我们可以使用我们自己的引擎来收集这些信息,但是如果我们要关注机器人功能而不是指标,我们只需要使用一个现成的解决方案即可。

有一个简单的工具称为Botan ,可将您的机器人连接到分析程序。 它基于Yandex AppMetric,并且完全免费。 使用Botan,您可以细分受众群体,获取有关用户个人资料的信息,获取最常用的命令以及在Messenger中获取精美的图形,如下所示:

机器人分析图

首先,您需要在Botan中注册您的机器人并获得令牌。 同样,您可以使用BotanioBot机器人来做到这一点:

在电报中注册机器人

只需单击对话框键盘上的“添加bot”键,键入bot的昵称,即可获得bot跟踪令牌。 现在,Botanio已准备好跟踪您的机器人事件,您可以在Messenger中按用户,会话,保留和事件获取统计信息。

创建并注册SSL Webhook

在Telegram中,有两种从用户那里获取消息的方法:长时间轮询和webhooks。

Telegram API图

基本上,对于长时间轮询,您需要从API请求新消息,对于Webhooks,您需要设置一个回调,如果有新消息来自用户,则Telegram API将调用该回调。 我喜欢使用webhooks,因为它看起来像实时通信,因此在本文中我们也将使用此方法。 现在,我们需要为Webhook选择一个回调URL,该URL必须通过HTTPS协议访问,并且需要将其设置为真正安全,因此将脚本隐藏在秘密路径中,如手册所述:

如果您想确保Webhook请求来自Telegram,我们建议在URL中使用秘密路径,例如https://www.example.com/<token> 。 由于没有人知道您的漫游器令牌,因此您可以确定它是我们。

如果您的SSL证书受信任,则只需在浏览器中打开以下URL:

https://api.telegram.org:443/bot[token]/setwebhook?url=[webhook]

否则,您必须生成一个自签名证书。 这是Linux上的命令示例:

openssl req -newkey rsa:2048 -sha256 -nodes -keyout /path/to/certificate.key -x509 -days 365  -out /path/to/certificate.crt -subj "/C=IT/ST=state/L=location/O=description/CN=yourdomain.com"

并且不要忘记打开SSL端口:

sudo ufw allow 443/tcp

要检查证书并将Webhook域设置为受信任,您需要上传公钥证书:

curl \
  -F "url=https://yourdomain.com/path/to/script.php" \
  -F "certificate=/path/to/certificate.key" \
  "https://api.telegram.org/bot[token]/setwebhook"

最终,您将获得如下的JSON回复:

{"ok":true,"result":true,"description":"Webhook was set"}

它说已经设置了Webhook,我们准备启动机器人的引擎。

建立资料库

现在我们需要为计时器建立一个数据库。 我们需要在其中存储什么? 当用户命令秒表启动时,我们将获取聊天ID并保存带有聊天ID和当前Unix时间的行,该时间是从现在到Unix Epoch开始的秒数,即1970年1月1日。在UTC。 因此,我们将保存带有当前Unix时间的聊天ID和整数时间戳的行。

为了显示当前的秒表时间,我们将获取已保存的时间戳并将其与当前时间戳进行比较。 时差将是当前时间(以秒为单位)。 如果用户停止计时器,我们将只删除具有当前聊天ID的行。

因此,让我们创建一个数据库和表来存储秒表信息:

CREATE TABLE IF NOT EXISTS `stopwatch` (
  `chat_id` int(10) unsigned NOT NULL,
  `timestamp` int(10) unsigned NOT NULL,
  PRIMARY KEY (`chat_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建秒表类

最后,我们准备开始编码。 让我们在一个名为stopwatch.php的文件中创建一个与数据库一起使用的类,并从一个设置两个私有变量的构造函数开始,我们将在其中存储聊天ID和当前的MySQL连接:

class Stopwatch
{
    /** @var mysqli */
    private $mysqli;
    /** @var int */
    private $stopwatch_id;
    /**
     * Stopwatch constructor
     * @param mysqli $mysqli
     * @param $stopwatch_id
     */
    public function __construct(\mysqli $mysqli, $stopwatch_id)
    {
        $this->mysqli = $mysqli;
        $this->stopwatch_id = intval($stopwatch_id);
    }
}

当用户启动计时器时,我们将获取当前的Unix时间并将其与聊天ID保存在一行中,因此这是start()方法:

public function start()
{
    $timestamp = time();
    $query = "
        INSERT INTO  `stopwatch` (`chat_id`, `timestamp`)
        VALUES ('$this->stopwatch_id', '$timestamp')
        ON DUPLICATE KEY UPDATE timestamp = '$timestamp'        
    ";
    return $this->mysqli->query($query);
}

如果计时器停止,我们需要从数据库中删除一行:

/**
 * Delete row with stopwatch id
 * @return bool|mysqli_result
 */
public function stop()
{
$query = "
    DELETE FROM `stopwatch`
    WHERE `chat_id` = $this->stopwatch_id
    ";
    return $this->mysqli->query($query);
}

现在是课程的主要部分。 当用户请求计时器状态时,我们需要从当前对话中找到带有秒表的行,并计算已保存的Unix时间与当前时间之间的秒数差。 幸运的是,Unix时间是一个整数,因此我们可以从另一个中减去一个值。 要将结果值格式化为时间,我们将使用gmdate函数。

/**
 * Find row with stopwatch id and return difference in seconds from saved Unix time and current time
 * @return string
 */
public function status()
{
    $query = "
        SELECT `timestamp` FROM  `stopwatch`
        WHERE `chat_id` = $this->stopwatch_id        
    ";
    $timestamp = $this->mysqli->query($query)->fetch_row();
    if (!empty($timestamp)) {
        return gmdate("H:i:s", time() - reset($timestamp));
    }
}

如您所见,如果数据库中没有值,则方法status()将不返回任何值,并且我们将像停止计时器一样处理空值。

选择一个PHP库

存在许多与Telegram API配合使用的PHP库,但是,至少在撰写本文时,只有一个库同时支持Telegram Bot API包装器和Botan跟踪。 它被称为PHP Telegram Bot API。

使用Composer安装此库:

composer require telegram-bot/api

如果您对使用分析不感兴趣,请尝试使用具有Lavarel集成的Telegram Bot API PHP SDKPHP Telegram Bot

启动Webhook脚本

现在主要部分开始了—我们将创建一个脚本来处理来自Telegram Bot API的回调。 启动一个名为index.php的文件,并包含Composer自动加载和一个新的Stopwatch类。 打开一个MySQL连接,创建一个新的Telegram API客户端,然后运行它:

require_once 'vendor/autoload.php';
require_once 'stopwatch.php';

// connect to database
$mysqli = new mysqli('database_host', 'database_user', 'database_password', 'database_name');
if (!empty($mysqli->connect_errno)) {
    throw new \Exception($mysqli->connect_error, $mysqli->connect_errno);
}

// create a bot
$bot = new \TelegramBot\Api\Client('bot_token', 'botanio_token');
// run, bot, run!
$bot->run();

创建命令

现在,我们需要设置一个机器人以对命令/start进行回答。 此命令用于启动所有Telegram机器人,并且在第一次聊天开始时,将向用户显示我们的欢迎消息。

$bot->command('start', function ($message) use ($bot) {
    $answer = 'Howdy! Welcome to the stopwatch. Use bot commands or keyboard to control your time.';
    $bot->sendMessage($message->getChat()->getId(), $answer);
});

在这里,在command()方法中,我们定义了一个用于接收命令的闭包。 此关闭获取当前聊天的ID并发送欢迎消息。 同样,所有注册的命令都将自动作为命令名称进行跟踪。

要启动秒表,我们将定义/go命令:

$bot->command('go', function ($message) use ($bot, $mysqli) {
    $stopwatch = new Stopwatch($mysqli, $message->getChat()->getId());
    $stopwatch->start();
    $bot->sendMessage($message->getChat()->getId(), 'Stopwatch started. Go!');
});

这将创建Stopwatch类的实例,并启动一个计时器,调用我们已经定义的start()方法。

要定义/status命令,我们需要做同样的事情。 只需调用status()方法并返回结果即可。 如果该方法返回null,则告诉用户计时器未启动。

$bot->command('status', function ($message) use ($bot, $mysqli) {
    $stopwatch = new Stopwatch($mysqli, $message->getChat()->getId());
    $answer = $stopwatch->status();
    if (empty($answer)) {
        $answer = 'Timer is not started.';
    }
    $bot->sendMessage($message->getChat()->getId(), $answer);
});

而且,如果用户停止计时器,我们需要首先获取状态,显示结果时间,然后使用stop()方法停止计时器。

$bot->command('stop', function ($message) use ($bot, $mysqli) {
    $stopwatch = new Stopwatch($mysqli, $message->getChat()->getId());
    $answer = $stopwatch->status();
    if (!empty($answer)) {
        $answer = 'Your time is ' . $answer . PHP_EOL;
    }
    $stopwatch->stop();
    $bot->sendMessage($message->getChat()->getId(), $answer . 'Stopwatch stopped. Enjoy your time!');
});

而已! 现在,您可以将所有文件上传到webhook目录并测试您的机器人。

添加键盘

为了向用户建议他或她可以运行哪些命令,我​​们可以在消息中添加键盘。 我们的秒表可以运行,也可以停止,每种状态都有两个。 要向用户显示键盘,我们只需要扩展sendMessage()方法即可:

$keyboard = new \TelegramBot\Api\Types\ReplyKeyboardMarkup([['/go', '/status']], null, true);

$bot->sendMessage($message->getChat()->getId(), $answer, false, null, null, $keyboards);
});

现在,您可以将键盘添加到机器人的每个命令中。 我不会在此处提供完整的示例,但是您可以在存储库页面中看到它。

将Bot添加到商店

好的,现在我们有了工作中的机器人,并希望向世界展示它。 最好的方法是在机器人目录中注册该机器人。 目前,Telegram还没有这样的官方目录,但有一些非官方的目录,最大的是Storebot.me ,其中已经注册了数千个机器人。

还有一个... bot在机器人商店中注册您的机器人! 将@storebot添加到您的联系人列表,键入/add命令,然后按照说明进行操作。 系统将要求您输入漫游器的用户名,名称和描述,选择标准类别之一,然后通过发送其令牌来确认漫游器的所有权。


一段时间后,您的机器人将通过提交过程,并显示在Storebot图表中。 现在,您和您的用户可以在bot商店中对您的bot进行投票,查找和评级,以使其升至图表的顶部。

结论

从创建婴儿机器人到在商店中进行注册以供实际用户使用,我们已经走了很长一段路。 如您所见,有很多工具可以使您更轻松地创建和传播bot,并且无需太多代码即可启动一个简单的bot。 现在您已经准备好自己动手了!

如有任何疑问,请随时在文章评论中提问。

翻译自: https://code.tutsplus.com/articles/how-to-start-a-telegram-bot-with-php--cms-26329

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电报机器人的Webhook服务器搭建是指创建一个能够接收来自Telegram Bot API的消息并处理它们的后端服务。Telegram Webhooks功能允许Bot在收到特定事件(如用户发送消息、更新状态等)时自动执行预定义的操作,而不是轮询API。 以下是搭建电报机器人Webhook服务器的基本步骤: 1. **创建Telegram Bot**: 首先,你需要注册一个Telegram开发者账户,并创建一个新的Bot。获取Bot的Token和HTTP地址,这是Webhook设置的关键信息。 2. **选择服务器语言与框架**: - 常用的语言有Python (Flask, Django)、Node.js (Express)、Java等。 - 选择一个你熟悉的框架或库来快速开发服务器,如Python的`requests`库用于与Telegram API交互。 3. **设置Webhook URL**: - 在Telegram BotFather中,点击"修改"按钮,将“Webhook URL”设为你的服务器地址(通常是`https://yourdomain.com/telegram webhook`),同时启用TLS加密(如果可能的话)。 4. **编写Server代码**: - 编写服务器端接收POST请求的代码,检查请求头中的验证令牌(通常包含在请求头的`Authorization`字段)是否匹配Bot的Token。 - 解析JSON数据,提取事件类型和具体内容,然后根据你的需求定制响应逻辑。 5. **错误处理与日志记录**: - 添加适当的错误处理和异常捕获,防止因网络中断或其他问题导致服务不可用。 - 记录关键操作的日志,以便于调试和追踪。 6. **测试与部署**: - 测试Webhook是否正常工作,发送一些消息到Bot,确认能否接收到并正确处理。 - 将服务器部署到可靠的环境,比如云服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值