如果您正在阅读本文,您就会知道聊天机器人是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中获取精美的图形,如下所示:


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


只需单击对话框键盘上的“添加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命令,然后按照说明进行操作。 系统将要求您输入漫游器的用户名,名称和描述,选择标准类别之一,然后通过发送其令牌来确认漫游器的所有权。


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

结论

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

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

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

如何使用PHP启动电报机器人相关推荐

  1. xebium周末启动_我如何在周末建立和启动聊天机器人

    xebium周末启动 by Mike Williams 由Mike Williams 我如何在周末建立和启动聊天机器人 (How I Built And Launched A Chatbot Over ...

  2. 法那科机器人初始化启动_FANUC机器人程序自动启动介绍

    <FANUC机器人程序自动启动介绍>由会员分享,可在线阅读,更多相关<FANUC机器人程序自动启动介绍(20页珍藏版)>请在人人文库网上搜索. 1.程序启动条件及时序介绍,上海 ...

  3. bat文件启动uipath机器人

    bat启动uipath机器人 创建一个txt文件,写入C:\Users${userName}\AppData\Local\UiPath\app-20.4.1\UiRobot.exe -file&quo ...

  4. 使用 电报机器人 tele bot 远程执行服务器上的命令

    环境:群晖 问题:想要通过teleg 手机APP远程执行群晖上的命令 解法:使用docker 快速搭建bot 响应服务器,使docker免密登陆群晖以远程执行命名 效果: 步骤 1.创建teleg 机 ...

  5. telegram电报机器人配置

    如何创建一个机器人 略 机器人配置 public class MyBot extends TelegramLongPollingBot {private String token = "xx ...

  6. Python电报机器人helloword

    先去botfather那申请一个机器人,拿到API,将API定义一个环境变量放到Secrets里: 在replit上码代码如下: import osimport telebotAPI_KEY = os ...

  7. python版电报API接入从零到一(有彩蛋)

    文章链接 编号 分类 文章及链接 介绍 作者 来源分类 撰写日期 收录日期 F1 框架 python版telegram接入开源bot python-telegram-bot Github 2023-0 ...

  8. 如何用 Slack 和 Kubernetes 构建一个聊天机器人?| 附代码

    作者 | Alexander Kainz 译者 | 天道酬勤,责编 | Carol 出品 | AI科技大本营(ID:rgznai100) ChatOps可以让你使用基于聊天的接口来管理DevOps任务 ...

  9. python---微信聊天机器人

    python真是越往后面学,你就越爱不释手. 真心感慨:人生苦短,我用Python! 不信我们就来看看今天这一篇随笔---20行代码实现微信聊天机器人!!! 依赖模块: 1:requests模块:网络 ...

最新文章

  1. 流式处理框架storm浅析(下篇)
  2. 目前最细致清晰的NSDictionary以及NSMutableDictionary用法总结
  3. html伪类选择器代码,CSS3中结构性伪类选择器—:first-of-type实现名言标签(代码实例 )...
  4. [CF850F] Rainbow Balls
  5. python股票预测代码_python用线性回归预测股票价格的实现代码
  6. springbatch开启任务的两种方式
  7. 帝国 listenews.php,帝国cms7.2后台信息列表页批量添加tags
  8. 使用Pycharm将代码同步到GitHub
  9. python dataframe中缺失值处理
  10. 为什么会出现“无法连接服务器-与网络有关或与实例有关的错误”?
  11. python创建文件对象的函数_Python学习笔记之—— File(文件) 对象常用函数
  12. 携程初赛 携程全球数据中心建设 球面上两点的最短距离 + 最小生成树
  13. 【宏】解决vcard乱码批量导入outlook
  14. uac2+android,iBasso UAC
  15. java面试英语自我介绍_程序员面试英文自我介绍
  16. Java ArrayList add()方法与示例
  17. 特斯拉将粉丝创意注册为商标 包括电动皮卡版书包
  18. Zynq-Linux移植学习笔记之24-VPVN温度监测
  19. Paging内部原理
  20. Cadence放置过孔总结:走线过孔、过孔复制和过孔阵列

热门文章

  1. linux脚本无法执行命令,为什么Shell脚本执行不成功?原来是这样
  2. 工作10年的我却没拼过刚毕业的美国女孩,亚裔们到底输在哪儿?
  3. 映像劫持,windows服务启动的两种形式
  4. 【feign】OpenFeign访问需要OAuth2授权的服务
  5. exp: Linux xsel命令(剪切板操作指令)
  6. 【那些年,我们一起追的女孩】第十二章
  7. 饺子播放器RecyclerView自动播放
  8. 树莓派4b风扇安装方法_树莓派安装OMV后靠被动散热和风扇散热温度对比
  9. Lesson 53 Hot snake 触电的蛇
  10. 练习 进程钩子 全局钩子