
碰巧,您是在电影开始之前来电影院看预告片的,而其中一些人却非常执着地坚持着,如果没有在电影院看电影,那么您将向自己保证要看这部电影,至少在以后,当电影可供下载时, ? 我敢建议是的。 但通常最终会导致您成功忘记它,并且在最佳情况下,通过滚动浏览已经发行的电影列表来偶然找到这部电影。
我经常遇到这样的问题,因此决定用Eve-Telegram-bot创建它,这有助于我避免忘记自己喜欢的电影的发行。 它是什么,它是如何工作的以及它是如何开发的,您可以直接阅读!
前言
本文不是有关创建Telegram机器人的详细指南。 尽管在本文中我经常提到我的项目,但是该材料的目的是关于总体发展的故事,即我所遇到的技术选择,关键点和陷阱。
怎么了
因此,正如我在上面所写,我经常忘记看那些我喜欢预告片的电影。 我一直在考虑解决此问题的时间很长。 我想到的第一件事是为智能手机创建了本机应用程序,但是 我以前从未做过,这将花费很多时间,而最终结果却无法满足我的需求以及潜在用户的需求。
下一个想法是创建PWA。 为了熟悉该技术,这是一个非常有趣的选择,但我决定将其留给未来。 同时,我已经使用Telegram很长时间了,在这段时间里,我积累了足够数量的机器人,这些机器人会定期使我的生活更轻松一些。 最终,在权衡了所有利弊之后,我决定该平台非常适合该想法。
技术选择
如果您浏览了Github for Telegram机器人,您会发现其中大多数都是用Python编写的。 Python确实是一种很棒的语言,并且非常适合这个想法,但是我想专门在NodeJS + TypeScript上实现这个项目。 应用适当的过滤器,我遇到了两个非常流行的工具:
node-telegram-bot-api和
Telegraf.js 。
在我没有开发机器人的经验之前,因此从这两种机器人中进行选择时,尚不清楚应该考虑哪些参数。 结果,在查看了文档并研究了每个库的问题之后,我选择了Telegraf.js。 决定性因素是中间件的可用性,该中间件的设计方式与流行的Express.js框架相同。 Telegraf.js还具有更频繁的更新历史记录和结构良好的文档,这表明开发人员正在投入足够的精力来改进该工具。 此外,它还包含TypeScript的小费,这对于所选堆栈肯定是一个加号。
Telegraf.js
Telegraf.js是编写项目的主要库。 它使用了几种有趣的方法,使您可以创建复杂的机器人,同时保持代码的简单性。 以下是最有趣的机制:
项目结构
有人怀疑这篇文章篇幅太长,因此,为了不进一步延伸,我将省略一些要点。 例如,要使机器人开始工作,您需要首先获取Telegram Bot API令牌。 您可以在正式的Telegram
文档或Telegraf.js
文档中阅读有关如何执行此操作的
信息 。
该项目的文件结构如下:
其工作方式如下:
- src / controllers-这些是上面编写该脚本的场景。 在该项目中,每个场景都是一个单独的控制器,用于处理相应的请求。
- src / locales-不同语言的翻译。 Telegraf.js使使用中间件向机器人添加本地化变得相对容易。
- src / models -MongoDB的模型。
- src / types -TypeScript的小费。 不幸的是,并非项目中使用的所有库都具有默认时间。
- src / util-在项目的不同部分中使用的各种帮助程序功能。 在这里,您可以看到电影的下载,会话管理,创建键盘,错误处理程序以及更多功能的可用性。
- src / bot.ts-完成bot的所有准备和启动的主文件。
- src / telegram.ts-在这种情况下,我们从Telegraf.js库创建Telegram类的对象。 使用此对象,我们可以首先使用用户的ID向用户发送消息,而不必等到他们写东西。 例如,在这个项目中,我们向用户发送一条消息,指出他所关注的电影已经可以下载。 当然,该对象提供了更多功能。
- 其他所有内容都是项目不同部分的配置,本文将不再讨论。
初始化和启动
当我们弄清项目的结构时,让我们看看机器人是如何启动的。 同样,为了缩短本文的篇幅,我不会在此处插入整个代码,而在我看来,仅会讨论主要的时刻。 您可以在存储库中看到完整的代码,本文结尾处提供了指向该链接的链接。
这一切都始于连接到数据库,该数据库存储有关用户及其跟踪的电影的信息。 成功建立连接后,我们将注册项目中使用的所有场景,设置用于本地化的参数,并添加多个中间件-处理会话,本地化,设置场景以及我们自己的几个。 例如,其中之一根据其ID接收有关用户的所有信息,并将其添加到控制器中使用的上下文中。 最后,在完成所有基本准备工作之后,我们以开发(长期轮询)或生产(Webhooks)模式启动该机器人。
重要提示:如果您使用不同的方法来接收更新(长时间轮询和Webhooks),则在长时间轮询模式下启动bot时,请首先使用api.telegram.org/botYOUR_TOKEN/deleteWebhook上的GET请求删除监听的
Webhook 。 否则,机器人可能无法正常工作。
处理用户输入
万岁! 该机器人可以工作,已连接到数据库,并已准备好接收来自用户的消息。 但是怎么做对呢?
首先,使用内置的电报键盘将为用户带来方便。 实际上,当您单击此键盘上的按钮时,将发送包含这些按钮内容的消息。 接下来,我们仅为此文本添加处理程序并执行某些操作。
bot.ts文件
包含此类处理程序。 由于漫游器支持两种语言,因此按钮也可能包含不同的文本-俄语和英语。 Telegraf-i18n具有匹配功能,可以处理不同语言的相同按钮的单击。
bot.ts中的大多数处理程序执行单个功能-它们将用户启动到相应的场景中。 因此,我们有几个部分-搜索电影,我的收藏,设置和联系人。 每个部分都有自己的场景和按钮,单击时,用户将移至相应的场景。
重要提示:请确保添加一个处理程序,该处理程序会将用户从场景中释放出来,否则他们可能会永远呆在那里! 发出一个通用命令(机器人中使用/ saveme)也将很有用,该命令将被添加到每个场景和主文件中。 此命令将用作任何场景的退出,以及重置用户设置。
现在,用户想去寻找电影。 通过单击适当的按钮,我们将其移至搜索场景。 为了方便起见,每个场景都有自己的文件夹,其中包含文件,每个文件执行特定功能。
在场景内部,您可以使用Middlewares.ts文件中的中间件。 例如,在搜索场景中使用中间件,我们可以简单地将有关电影的所有信息转发到适当的方法中,而不是每次在它们内部执行相同的功能。
Telegram还具有嵌入式键盘。 也许您遇到了带有投票的消息,在该消息的下面有几个半透明的按钮,当您单击其中一个时,投票数会发生变化。 这些按钮是嵌入式键盘
每个按钮都包含信息,当您单击该按钮时,它将被传输到相应的处理程序。
传输信息的大小不应超过64个字节! 要教机器人监听按钮点击,我们需要使用bot.action(/触发器/,回调)进行注册。 第一个参数包含绑定到按钮的所有数据。 我决定使用Redux之类的Actions,将{a:actionName,p:payload}形式的对象附加到每个按钮。 注册侦听器时,我们可以使用简单的RegExp,例如:bot.action(/ actionName /,callBack)。 嵌入式键盘的所有处理程序都在actions.ts文件中。
另外,在某些场景中有helpers.ts文件,其中包含一些为了卸载其余文件而带出的小功能。 在大多数情况下,都有用于用户进行各种操作的键盘生成器。
本地化
既然这是一个重要的话题,我认为值得一提。 如我之前所说,Telegraf.js包含大量中间件,其中之一是
telegraf-i18n 。 该存储库包含详细说明,我对此没有任何特殊问题,但是尽管如此,我还是会在此项目中添加一些说明。
有一个用于本地化文件的locales文件夹,它是{{key“:” translation“}形式的JSON对象。 此外,无论何时需要使用不同的语言,我们都会使用该库中的方法,在此方法中,通过密钥传输所需的翻译,然后在输出中获得相应的翻译。 会话可用于存储有关用户选择的语言的信息。 同样值得一提的是按钮。 同一库中有一个match函数,因此,如果按钮上的文本根据语言而变化,此函数将帮助您挂起正确的侦听器。
重要提示:如果要使用本地化并用TypeScript编写漫游器,请不要忘记将翻译文件夹添加到tsconfig.json中,否则代码将无法编译。 例如:
"include": ["src/locales/*.json"]
结论
感谢您阅读到底! 在本文中,我试图尽可能详细地描述创建Telegram bot的过程,而没有对我的项目有强烈的依附。 我希望阅读本文并研究Eve的源代码后,您可以轻松创建一个可以为您提供帮助的机器人。
按照承诺,您可以在
GitHub上查看源代码,并在
此处尝试Eve的实际应用。 如有任何批评和建议,我将不胜感激。
我还要特别注意Telegraf.js文档中的这一
部分 ,其中包含有趣的开源项目,您可以查看这些项目并从中汲取架构和解决方案的启发。 反过来,我想提及其中之一
-The Guard Bot 。 一个真正的大型且制作精良的机器人,我从那里借用了一些开发解决方案。
此刻,我告诉了我所有想要的信息,我将很乐意回答您的问题,建议和意见!