一种简单的电报时间跟踪器的创建

一种简单的电报时间跟踪器的创建

时间:2021-2-4 作者:admin

如今的电报是一种方便、易用、直观和安全的信使–当然,我们都喜欢贴纸。除了个人信息外,我们还经常与家人、朋友和同事进行小组聊天。除了生活中的普通用户外,还有电报上的机器人。它们是为了自动回复而创建的,这意味着机器人响应特定的消息(命令)并执行某些操作。动作可以是简单的响应问候,也可以是执行特定逻辑操作的一系列特定问题和答案。

例如,就我个人而言,我经常使用@vkMusic_bot_newchatbot。这是一个简单的音乐搜索和聆听机器人。用户发送带有组合或作者名称的消息,而bot提供与请求匹配的变体。

在我的例子中,我要求一首歌表演必须继续并收到了几个可供选择的变体。在选择了第一个变体之后,我在下一个消息中收到了一个音轨。你可以在和机器人聊天的时候听音乐是很方便的。这样,机器人就可以完全取代第三方应用程序,就像你手机上的播放器一样。你只要马上搜索和听音乐就行了。

因此,我们可以看到,电报聊天机是信使的一个相当方便和多功能的特点。这就是为什么本文专门讨论一个简单的聊天机器人创建。我决定制作一个原始的时间跟踪器给你看一个例子。这是与Telegram API交互的最简单的例子。

简单电报聊天机器人的创建

所以我们开始吧。

你可以在这里找到文档:Https://core.telegram.org/bots/api.

首先,你应该在电报中创建并注册机器人。让我们找到全机器人父亲@Bot神父。是机器人注册的机器人。

我们通知他,我们想创建我们自己的聊天机器人:

1
/newbot

对于下一个请求,他请求为bot创建一个名称。因为我的机器人会跟踪时间,所以我给他相应的名字并写:

1
timeTrackerBot

下一步是创建bot的用户名(它将用于搜索@username)。条件是用户名必须以bot或_bot结尾。我写道:

1
my_time_tracker_bot

准备好了!我们收到一个令牌作为响应,这意味着我们已经注册了一个新的聊天机器人。

发展

首先,我决定看看互联网提供给我们的图书馆。变体是多个的。建议的选项的完整列表可以找到。这里。我的选择是Telegram BotApiBundle为了塞弗尼。我们安装它:

1
composer require borsaco/telegram-bot-api-bundle

然后继续。

包一次支持多个机器人的工作;此外,还有调整(只发送给开发人员)和通过代理工作的选项。对于测试示例,我们不需要太多,所以我们删除了我们不需要的东西。

1
config/packages/telegram.yaml

一种简单的电报时间跟踪器的创建

我还将令牌带到了变量APP_Telegram_Tokenв.env中:

一种简单的电报时间跟踪器的创建

一点理论

Telegram API的工作模式有两种:您可以通过getUpdate()方法从服务器获得更新,也可以调整webHook。第一个变体很好,因为它非常简单,但是它的缺点是您应该经常请求服务器是否有任何更新。WebHook变体允许您不必考虑如何获得更新,而是关注它们的呈现。在这种情况下,Telegram会将更新发送到我们将指出的URL。

第二种方法的优点是显而易见的。

要注册Web钩子,我们将执行以下操作:

1
$bot = $botService->getBot(‘timeTracker’);
2
$bot->setWebhook(
3
[
4
‘url’=>’https://myWebSite.com/webhook’
5
]
6
);

Url值中的Web钩子是一条路由,我们稍后再做。

$botService是Borsao\Telegram BotApidle\Service\Bot服务的对象,可以在项目的任何位置注入该对象。

重要:电报API只支持发送到https!

现在我们来看看我们的网络钩子。如果您向我们的电报机器人发送消息,它将向我们发送这样的数据集以响应:

1
{
2
“update_id”: 21406673,
3
“message”: {
4
“message_id”: 24,
5
“from”: {
6
“id”: 701891111,
7
“is_bot”: false,
8
“first_name”: “aleksei”,
9
“language_code”: “ru”
10
},
11
“chat”: {
12
“id”: 701891111,
13
“first_name”: “aleksei”,
14
“type”: “private”
15
},
16
“date”: 1580672814,
17
“text”: “/help”,
18
“entities”: [
19
{
20
“offset”: 0,
21
“length”: 5,
22
“type”: “bot_command”
23
}
24
]
25
}
26
}

我们对消息文本的部分感兴趣。在这种情况下,很明显我派了机器人帮助.

当然,他不回答。

响应中存在的实体表明,机器人将消息视为命令(以斜杠开头并以拉丁文编写的所有内容都是用于电报的命令)。

让我们创建一个控制器。它将是来自Telegram API的请求的入口点,更新将在哪里进行。

一种简单的电报时间跟踪器的创建

为了方便起见,我将所有的逻辑放入MessageProcessor服务中,在该服务中传递从Telegram接收的字符串。

本质很简单。有四个命令:帮助,开始,停止,报告。

帮助消息或任何其他不适合此列表的消息,bot应该返回一条带有可用命令列表的消息。

每个命令都以特定的行为为前提。

也有两种情况下,答案会告诉用户,这个动作目前是禁止的(直到时间跟踪器停止-你不能启动一个新的。因此,虽然没有活动,但也不能停止任何事情。)

我增加了以下实体:

  1. User,它具有字段名、电报ID和集合时间线。
  2. 时间线,它有一个开始日期和一个结束日期开始,停止在。

也就是说,用户可以有多个时间表(其中有一个开始时间和一个停止时间)。

我们得到一个JSON字符串,我做的第一件事就是解码字符串并获取对象。

1
$response = \json_decode((string)$telegramUpdate);

进一步地,我检查数据库中是否有这样的用户(有关向bot写信的用户的数据是从响应中获取的)。>消息>来自)。如果没有这样的用户,我们就创建它。

因为我们想要帮助帮助以同样的方式,我们将用户消息的文本转换为小写,并删除普通和反斜杠。

1
$messageText = mb_strtolower($response->message->text);
2
$messageText = str_replace([’\\’, ’/’], ’’, $messageText);

现在我们检查接收到的命令–如果它包含在我们可以处理的命令列表中。现在,根据我们得到的,我们发送了一个回复。

1
$messageCommand = $this->isSupports($messageText) ? $messageText : false;

如果是开始命令或停止命令,我们将为这个用户创建一个时间线,或者相应地结束当前的时间线,并将其告知用户。

如果这是一份报告,我们将计算今天所有时间线中的时间,并向用户发送总时数和分钟数。我们使用sendMessage方法发送消息,该方法接受一个参数数组。必需的参数是:chat_id和text。

可以找到完整的命令列表。这里.

因为这是一个测试用例,所以我只使用一个简单的开关/用例来选择命令。

1
switch ($messageCommand) {
2
  case self::HELP_COMMAND :
3
     $this->bot->sendMessage(['chat_id' => $user->getTelegramId(),      'text' => self::ANSWERS[self::HELP_COMMAND]]);
4
     break;
5
  case self::START_COMMAND :
6
     if ($this->timelineService->doesActiveExist($user)) {
7
        $this->bot->sendMessage(['chat_id' => $user->getTelegramId(), 'text' => self::BAD_ANSWERS['existNotStoppedTimeLine']]);
8
        break;
9
     }
10
     $this->telegramService->startTimeForUser($user);
11
     $this->bot->sendMessage(['chat_id' => $user->getTelegramId(), 'text' => self::ANSWERS[self::START_COMMAND]]);
12
     break;
13
  case self::STOP_COMMAND :
14
     if ($this->timelineService->doesActiveExist($user)) {
15
        $this->bot->sendMessage(['chat_id' => $user->getTelegramId(), 'text' => self::ANSWERS[self::STOP_COMMAND]]);
16
        break;
17
     };
18
     $this->bot->sendMessage(['chat_id' => $user->getTelegramId(), 'text' => self::BAD_ANSWERS['timeLineNotFound']]);
19
     break;
20
  case self::REPORT_COMMAND :
21
     $timeForToday = $this->timelineService->getTodayTotalByUser($user);
22
     $this->bot->sendMessage(['chat_id' => $user->getTelegramId(), 'text' => \sprintf(self::REPORT_COMMAND, $timeForToday)]);
23
     break;
24
  default:
25
     $this->bot->sendMessage(['chat_id' => $user->getTelegramId(), 'text' => self::ANSWERS[self::HELP_COMMAND]]);
26
}

对这项服务的总体看法如下:

一种简单的电报时间跟踪器的创建

一种简单的电报时间跟踪器的创建

因此,我们有一个机器人,它可以帮助你跟踪一天中的时间。

一种简单的电报时间跟踪器的创建

结语

为了划清界限,我们可以放心地说,Telegram API功能很好,而且很容易掌握。一个巨大的优势是良好的文档和现成的库可供使用。

福州软件开发哪家强?

版权所有:https://www.eraycloud.com 转载请注明出处