一个功能齐全的框架,让你能使用Rust中的async/.await语法轻松构建电报群机器人。将困难的工作交给框架,你只需关注业务逻辑。

亮点

  • 函数式响应编程 teloxide遵循函数式响应设计模式,可以让您使用filters, maps, folds, zips和许多其他适配器声明式地操作来自电报的更新流。

  • 对话管理子系统 我们的对话管理子系统易于使用,且对话的存储方式/位置是不可知的。例如,你可以只替换一行来实现永久保留。开箱即用的存储方式包括Redis和Sqlite。

  • 强类型的机器人命令 你可以将机器人命令以枚举形式描述,然后它们将由字符串自动生成——像serve-json中的JSON结构和structopt中的命令行参数一样。

环境配置

  1. 下载Rust。

  2. 用@Botfather 创建一个新的机器人,得到一个格式为 123456789:blablabla的认证凭证。

  3. 将环境变量:TELOXIDE_TOKEN 数值初始化为你得到的认证凭证的哈希。

# Unix-like
$ export TELOXIDE_TOKEN=<Your token here># Windows
$ set TELOXIDE_TOKEN=<Your token here>
  1. 确保你的 Rust 编译器是最新版:

# 如果你在用稳定分支
$ rustup update stable
$ rustup override set stable# 如果你在用每日构建分支
$ rustup update nightly
$ rustup override set nightly
  1. 运行cargo new my_bot, 进入文件目录将以下内容放进 Cargo.toml:

[dependencies]
teloxide = "0.3"
teloxide-macros = "0.3"log = "0.4.8"
pretty_env_logger = "0.4.0"tokio = { version =  "0.2.11", features = ["rt-threaded", "macros"] }

API 总览

骰子机器人

这个机器人会在每次收到消息时掷出随机骰子:

(完整)

use teloxide::prelude::*;#[tokio::main]
async fn main() {teloxide::enable_logging!();log::info!("机器人启动中...");let bot = Bot::from_env();teloxide::repl(bot, |message| async move {message.answer_dice().send().await?;ResponseResult::<()>::Ok(())}).await;
}

命令

命令是强类型的声明式, 和我们在serde-json中使用 structopt 和JSON结构定义CLI类似,下列机器人接受以下命令

  • /username <你的用户名>

  • /usernameandage <你的用户名> <你的年龄>

  • /help

(完整)

use teloxide::{utils::command::BotCommand, prelude::*};#[derive(BotCommand)]
#[command(rename = "lowercase", description = "These commands are supported:")]
enum Command {#[command(description = "帮助文本内容")]Help,#[command(description = "处理用户名")]Username(String),#[command(description = "处理用户名和年龄", parse_with = "split")]UsernameAndAge { username: String, age: u8 },
}async fn answer(cx: UpdateWithCx<Message>, command: Command) -> ResponseResult<()> {match command {Command::Help => cx.answer(Command::descriptions()).send().await?,Command::Username(username) => {cx.answer_str(format!("你的用户名是 @{}.", username)).await?}Command::UsernameAndAge { username, age } => {cx.answer_str(format!("你的用户名是 @{} 年龄是 {}.", username, age)).await?}};Ok(())
}#[tokio::main]
async fn main() {teloxide::enable_logging!();log::info!("命令机器人启动中...");let bot = Bot::from_env();let bot_name: String = panic!("机器人名称");teloxide::commands_repl(bot, bot_name, answer).await;
}

对话管理

对话是由一个枚举来描述的,其中每个变体都是可能的对话状态之一。还有子过渡函数,将对话从一个状态转到另一个状态,从而形成一个有限状态机。

下面是一个机器人,它会问你三个问题,然后把答案反馈给你。首先,让我们从一个枚举(我们对话的状态集合)开始。

(dialogue_bot/src/dialogue/mod.rs)

// 略去Imports...#[derive(Transition, From)]
pub enum Dialogue {Start(StartState),ReceiveFullName(ReceiveFullNameState),ReceiveAge(ReceiveAgeState),ReceiveLocation(ReceiveLocationState),
}impl Default for Dialogue {fn default() -> Self {Self::Start(StartState)}
}

当用户向我们的机器人发送消息,而这样的对话还不存在时,Dialogue::default()将会被调用,本例中为Dialogue::Start。每收到一条消息,就会提取一个相关的对话,然后传递给一个相应的子过渡函数:

Dialogue::Start

Dialogue::ReceiveFullName

Dialogue::ReceiveAge

Dialogue::ReceiveLocation

所有这些子过渡函数都接受一个相应的状态("对话 "的许多变体之一)、上下文或文本消息。它们返回TransitionOut<Dialogue>,例如从<你的状态类型>Dialogue的映射。

最后,main函数是这样的:

(dialogue_bot/src/main.rs)

// 略去Imports...#[tokio::main]
async fn main() {teloxide::enable_logging!();log::info!("对话机器人启动中");let bot = Bot::from_env();teloxide::dialogues_repl(bot, |message, dialogue| async move {handle_message(message, dialogue).await.expect("机器人出错!")}).await;
}async fn handle_message(cx: UpdateWithCx<Message>, dialogue: Dialogue) -> TransitionOut<Dialogue> {match cx.update.text_owned() {None => {cx.answer_str("Send me a text message.").await?;next(dialogue)}Some(ans) => dialogue.react(cx, ans).await,}
}

【每周一库】- teloxide (电报群机器人)相关推荐

  1. python 企业微信群机器人_企业微信群机器人应用:使用python从网站抓取行业资讯并定时推送...

    在企业经营过程中,及时了解行业相关信息(市场动态.竞品策略.行业数据等等)是非常必要的.通常情况下,商品部门.营销部门.市场部门可能都会安排专门的人员定期进行这些信息的搜集.整理,再进行内部的分享. ...

  2. div区域内容抓取_企业微信群机器人应用:使用python从网站抓取行业资讯并定时推送...

    在企业经营过程中,及时了解行业相关信息(市场动态.竞品策略.行业数据等等)是非常必要的.通常情况下,商品部门.营销部门.市场部门可能都会安排专门的人员定期进行这些信息的搜集.整理,再进行内部的分享. ...

  3. python qq聊天机器人_Python QQBot库的QQ聊天机器人

    本文实例为大家分享了Python QQBot库的QQ聊天机器人的具体代码,供大家参考,具体内容如下 1.安装 pip install qqbot 2.主动发出消息 from qqbot import ...

  4. delphi 企业微信消息机器人_GitHub - guoxianlong/insight: Insight是一个可以管理企业微信群机器人的小工具,可以非常方便的往群里发布即时消息和定时消息。...

    最科幻的企业微信群机器人管理工具 非常方便的发布群即时消息和定时消息,解放双手,提升沟通效率 部署教程 更新日志(2020.05.31) 修复设置为智能跳过工作日时,周日依然提醒问题. 前端修复定时成 ...

  5. 企业微信机器人脚本python_Python 操控企业微信群机器人

    目标 企业微信群机器人常用来作为通知工具,群发消息给群内成员,充当小助手的角色.但若按照官方 API 文档来构建请求,也确实不太方便.本文通过 Python 第三方库来控制企业微信群机器人发送消息. ...

  6. python企业微信群聊_给企业微信加个群机器人

    现在很多企业在使用企业微信或钉钉进行工作交流,我们可以在群里添加一个自定义群机器人,定时发送一些提醒或咨询信息,它可以作为一个小组手,也为工作增加一点乐趣. 群机器人 下面是企业微信和钉钉的群机器人文 ...

  7. python dajngo+vue 钉钉三方登录群机器人验证码

    django+vue实现钉钉群机器人验证码 ​ 又是忙碌的一天,今天给大家带来的教程是使用钉钉群机器人发送随机验证码, 在vue中输入然后在后端进行判断并返回相应的返回值,首先我们去看官方文档 然后开 ...

  8. python qqbot库_Python QQBot库的QQ聊天机器人

    本文实例为大家分享了Python QQBot库的QQ聊天机器人的具体代码,供大家参考,具体内容如下 项目地址:https://github.com/pandolia/qqbot 1.安装 pip in ...

  9. 手把手教你定制一个夸夸群机器人

    2019年3月,三八妇女节送女友什么礼物好?最近有女网友在网上吐槽,男友把她拉进百人群,群友整整夸了她三分钟."他说是某宝上卖的夸夸群,这种沙雕男朋友还留着么?" 夸人还能挣钱?你 ...

最新文章

  1. git reset --hard xxxxxxx
  2. 不懂技术的人不要对懂技术的人说这很容易实现
  3. Java Review - ArrayList 源码解读
  4. python 生成器笔记
  5. 循环判定闰年的程序_C语言入门教程(六)for循环
  6. 图像特征提取与描述_角点特征01:Harris算法+Shi-Tomas算法
  7. 【Servlet】Servlet生命周期
  8. SEO|搜索引擎优化(如何让你的网站排名靠前)
  9. apache php 500,apache出现500错误的原因是什么
  10. python3.7输出语句_python3.4用循环往mysql5.7中写数据并输出的实现方法
  11. 电子电路设计的基础知识
  12. 2021-05-20
  13. 二、逻辑回归LR面试题总结
  14. 数据结构算法与应用c++语言描述 原书第二版 答案(更新中
  15. BitMap生成艺术字体Bf文件
  16. 华创期货恒生网上交易
  17. u3d 100道面试题(包含答案)
  18. 【LaTeX应用】latex排版中插入参考文献
  19. PDF内容复制自动替换换行符
  20. h5页面怎么处理文件流_微信H5页面制作流程,大家有哪些经验分享?

热门文章

  1. 202203读书-《 测试有道:微软测试技术心得》
  2. VS2017 -error LNK1104: 无法打开文件“msvcprtd.lib”
  3. java面试分为_【中软国际Java面试】面试分为两轮。-看准网
  4. C++程序设计案例实训教程第3章
  5. 时间、日期的一些用法
  6. ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker
  7. 进gmail不失去连接的办法之一
  8. F2. Promising String (hard version)(cf)树状数组
  9. Android必学之AsyncTask,多线程AsyncTask,详细AsyncTask使用教程
  10. 有一间计算机实验室英语怎么说,实验室英语怎么说