不久前,我建议您使用我的电报机器人。
电报机器人-活动策划助手在PM中收到许多问题后,我意识到为Telegram创建机器人的问题非常流行。
他们问我机器人的源代码,问我分享各种机器人功能实现的具体示例,问我建议使用某种功能来处理机器人和消息。
我决定撰写一系列文章,在这些文章中,我将展示编写机器人所需的基本知识。
Java,Maven,TelegramAPI,Lombok和Log4j等着您。
谁在乎-请在猫下...
然后我马上去买王牌
上一篇文章中要求的内容。
您可以在
此处找到该项目的源代码。
在“
master ”分支中,将是bot的最终版本,我们将在出现新文章的过程中与您一起编写该bot的最终版本。
本文的完整资源将在“
Part1-Base ”分支中。
在这一部分中,我们将与您一起创建一个基本模板,该模板将能够:
- 在电报服务器上注册机器人
- 接收写入机器人的消息
- 响应/启动命令
创建一个标准的Maven项目
(
我会错过有关使用开发环境的手册以及Java编程的基础知识。所有这些东西都很容易在Google上找到。如果无法解决,请写下问题 )。
让我们看看在这个项目中我们需要什么依赖。首先,这是
龙目岛 。 这是什么以及为什么-例如,您可以
在这里阅读。
并确保添加记录器。 我将使用
log4j,并进一步说明如何在调试此应用程序时使用它,以及更深入地了解TelegramAPI的操作。
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
而且,因为 我们为Telegram编写了一个机器人,然后从Telegram编写了库本身:
<dependency> <groupId>org.telegram</groupId> <artifactId>telegrambots</artifactId> <version>3.5</version> </dependency>
pom文件的结构可以在
这里找到
。pom.xml文件的结构可以在
这里看到。
接下来,我们添加基类
Bot.java ,它将实现我们与Telegram服务的所有交互。 我们将与LongPolling合作,因为 此方法不需要加密证书,可以从装有Java的任何计算机上启动。
为此,我们从
TelegramLongPollingBot类继承并实现基本方法:
public void onUpdateReceived(更新更新)
公共字符串getBotUsername()
公共字符串getBotToken()从我们自己,我们将需要添加一个将机器人连接到TelegramAPI的过程:
公共无效botConnect() import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.apache.log4j.Logger; import org.telegram.telegrambots.TelegramBotsApi; import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.exceptions.TelegramApiRequestException; @AllArgsConstructor @NoArgsConstructor public class Bot extends TelegramLongPollingBot { private static final Logger log = Logger.getLogger(Bot.class); final int RECONNECT_PAUSE =10000; @Setter @Getter String userName; @Setter @Getter String token; @Override public void onUpdateReceived(Update update) {
原则上,一切。 此代码可以连接到Telegram服务器,并且在接收到发给它的消息后,它将在接收到更新的日志文件中记录信息。
让我们创建一个将运行我们的应用程序的类。
这将由类App.java完成。 链接到文件:
此处 package com.example.telegrambot; import com.example.telegrambot.bot.Bot; import org.apache.log4j.Logger; import org.telegram.telegrambots.ApiContextInitializer; public class App { private static final Logger log = Logger.getLogger(App.class); public static void main(String[] args) { ApiContextInitializer.init(); Bot test_habr_bot = new Bot("test_habr_bot", "1012522162:AAHLvPVqKF48LdqnsvS3l5YrJfvFey6dBa0"); test_habr_bot.botConnect(); } }
如您所见,为了使机器人正常工作,我们只需要“机器人名称”和“令牌”,就可以将它们传递给Bot类的构造函数。
您可以从所有bot的父亲那里获得该bot的名称和令牌:),方法是用电报给他写信。
他的昵称:
@BotFather与他的交流非常简单明了。
根据命令
/ newbot
因此,您应该获得以下对话框:

他们还在这里写道,它更准确,请勿向任何人显示此信息,否则其他人将可以控制您的机器人:)
您可能会说我不是很准确。也许吧,但是机器人之父允许我们更改令牌并回想那些公开访问的令牌。 因此,当您尝试连接我的数据时,您将收到以下消息:
2019-12-04 13:44:25,252[DEBUG][main ][ com.example.telegrambot.bot.Bot] - Bot token: 1012522162:AAF5D49N4NreEJfCk0aOsC-UnmIu_GLkoyc 2019-12-04 13:44:26,613[ERROR][main ][ com.example.telegrambot.bot.Bot] - Cant Connect. Pause 10sec and try again. Error: Error removing old webhook
因此,使用我的数据无法连接。 注册您的。 在类
App.java中指定新数据
现在,通过运行App类中的main方法,让我们的机器人连接并等待新消息。 他将写信给我们,介绍他在控制台中的操作和尝试。
Log4j
记住,上面我谈到了log4j库的实用程序。 在这里,出于好奇,有用数据的通俗易懂。
log4j.properties文件已经包含用于日志记录的基本设置以及第三方类以及在我们的机器人中可以使用的那些日志记录的特定日志记录级别。
log4j.rootLogger= error, file log4j.logger.com.example.telegrambot.App = debug, stdout log4j.logger.com.example.telegrambot.bot.Bot = debug, stdout
日志记录的基本级别指示为错误。
对于Bot和App类,指示了Debug级别的日志输出。
这些级别是什么以及它们之间的区别-您可以在Google中轻松找到。如果要查看电报库执行所有操作的方式和顺序,请将常规日志记录模式切换到较低级别:信息或调试。
启动应用程序时,您将在控制台中看到在连接,工作过程中发生了多少有趣的事情。 使用漫游器名称和令牌对您的函数进行多少次轮询。
记录级别随以下行而变化:
要根据信息级别获取日志,请输入以下内容:
log4j.rootLogger= info, file
对于调试级别,如下所示:
log4j.rootLogger= debug, file
最后
现在我们有了一个机器人:它可以连接并向我们显示漂亮的日志,并报告有消息正在向它发送。
但在上面,我向您保证机器人会响应启动命令。 让我们稍微更改负责处理收到消息的过程。
@Override public void onUpdateReceived(Update update) { log.debug("Receive new Update. updateID: " + update.getUpdateId()); Long chatId = update.getMessage().getChatId(); String inputText = update.getMessage().getText(); if (inputText.startsWith("/start")) { SendMessage message = new SendMessage(); message.setChatId(chatId); message.setText("Hello. This is start message"); try { execute(message); } catch (TelegramApiException e) { e.printStackTrace(); } } }
从代码中可以看到,该机器人执行以下操作:
- 它接收更新并在日志中捕获其ID号。
- 从发送的消息中检索聊天ID和消息的文本
- 检查此文本是否为“ /开始”命令
- 如果比较成功,它会创建一条消息作为响应,并将其发送到聊天中,并且ID会较早收到
希望您觉得它有用和有趣。
以后,我将向您展示如何在我的机器人中实现它:
- 使用各种团队
- 将这些命令绑定到处理程序
- 多线程:独立接收和发送消息
- 讯息格式
- 使用按钮和回调
- 编辑旧帖子
在此基础上,在公共访问中,我的两个机器人现在为我工作。
您知道的一件事是
活动策划助手 。
还有第二位
厚脸皮的电影迷 。 他热爱电影,并且对电影了解很多。 他甚至更喜欢与您分享他的知识。 他
通过电报引导
频道 ,在其中确定自己喜欢的电影并将其提供给您。 他知道如何按流派创建个人选择并创建个性化推荐的订阅。 他知道如何找到您从未听说过的杰作,甚至都不知道如何找到这些电影。
例如,您是否认为有些电影具有“狂野”的类型组合,例如:纪录片,恐怖片,喜剧片。
但是机器人在命令
2010-
他会说,从2010年到现在,这类电影已拍摄了6部:)
如何使用类似的命令,如何解析字符串和命令序列,我们将在以下出版物中与您讨论。
谢谢您的关注。 编程很有趣:)