如果您正在阅读本文,您就会知道聊天机器人是2016年最大的技术趋势之一。
机器人革命不仅涉及人工智能。 机器人可以是您的Messenger中的工具,具有简单的聊天界面,可用于扩展站点或服务的功能,甚至可以是独立的应用程序。 机器人的开发成本较低且易于安装,而另一个强大的功能是可以在各种类型的设备(笔记本电脑,智能手机和平板电脑)上使用Messenger。 这就是为什么现在每个人都对机器人感到疯狂的原因。
开放式机器人API的最大使者是Telegram 。
我们要做什么
在本文中,我们将创建一个简单的秒表Telegram机器人。 我将向您展示如何创建机器人,与分析进行连接,编写一些代码以及最终将机器人添加到机器人商店。
顺便说一下,我已经准备好一个演示,因此您只需将@stopwatchbot添加到您的Telegram联系人列表中就可以对其进行测试。
用BotFather创建一个Bot
创建机器人的第一步是在Telegram中注册您的机器人帐户。 为此,有一个名为BotFather的机器人 。 只要将其添加到您的联系人列表中,您就可以通过键入/newbot
命令并按照BotFather的说明来创建和设置Telegram机器人。
注册新的漫游器后,您会收到一条带有授权令牌的祝贺消息。 我们将很快使用此令牌来授权漫游器并将请求发送到Bot API。
稍后,您可以使用BotFather将描述或照片添加到机器人的配置文件中,重新生成令牌,设置要使用的命令列表,删除帐户等。 要获取命令的完整列表,只需在聊天中键入/help
即可获取BotFather的命令列表。
连接到Botan Analytics
Telegram Bots API中没有内置的分析功能,但是了解您有多少用户,他们的行为方式以及触发更多命令的命令很重要。 当然,我们可以使用我们自己的引擎来收集这些信息,但是如果我们要关注机器人功能而不是指标,我们只需要使用一个现成的解决方案即可。
有一个简单的工具称为Botan ,可将您的机器人连接到分析程序。 它基于Yandex AppMetric,并且完全免费。 使用Botan,您可以细分受众群体,获取有关用户个人资料的信息,获取最常用的命令以及在Messenger中获取精美的图形,如下所示:
![机器人分析图](https://cms-assets.tutsplus.com/uploads/users/34/posts/26329/image/unspecified.jpg)
首先,您需要在Botan中注册您的机器人并获得令牌。 同样,您可以使用BotanioBot机器人来做到这一点:
![在电报中注册机器人](https://cms-assets.tutsplus.com/uploads/users/1203/posts/26329/image/%D0%97%D0%BD%D1%96%D0%BC%D0%BE%D0%BA%20%D0%B5%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202016-04-07%20%D0%BE%2018.34.42.jpeg)
只需单击对话框键盘上的“添加bot”键,键入bot的昵称,即可获得bot跟踪令牌。 现在,Botanio已准备好跟踪您的机器人事件,您可以在Messenger中按用户,会话,保留和事件获取统计信息。
创建并注册SSL Webhook
在Telegram中,有两种从用户那里获取消息的方法:长时间轮询和webhooks。
基本上,对于长时间轮询,您需要从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 SDK或PHP 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
命令,然后按照说明进行操作。 系统将要求您输入漫游器的用户名,名称和描述,选择标准类别之一,然后通过发送其令牌来确认漫游器的所有权。
![](https://cms-assets.tutsplus.com/uploads/users/1203/posts/26329/image/%D0%97%D0%BD%D1%96%D0%BC%D0%BE%D0%BA%20%D0%B5%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202016-04-07%20%D0%BE%2018.34.42.jpeg)
一段时间后,您的机器人将通过提交过程,并显示在Storebot图表中。 现在,您和您的用户可以在bot商店中对您的bot进行投票,查找和评级,以使其升至图表的顶部。
结论
从创建婴儿机器人到在商店中进行注册以供实际用户使用,我们已经走了很长一段路。 如您所见,有很多工具可以使您更轻松地创建和传播bot,并且无需太多代码即可启动一个简单的bot。 现在您已经准备好自己动手了!
如有任何疑问,请随时在文章评论中提问。
翻译自: https://code.tutsplus.com/articles/how-to-start-a-telegram-bot-with-php--cms-26329