BotFather
的机器人交互来申请我们自己的机器人,具体步骤如下/newbot
_bot
或者Bot
,不能包含中文, 标点符号123456789:ABCDEfghiJK4314daDSadSa7
hello @your_bot
<https://api.telegram.org/bot><token>/getUpdates
{ "ok": true, "result": [ { "update_id": 414941268, "message": { ... }, "chat": { "id": -465512321, ... }, ... } ] }
update
对象True
tg://user?id=<user_id>
可以用于通过用户ID提及用户,而无需使用用户名。请注意:*bold \\*text* _italic \\*text_ __underline__ ~strikethrough~ *bold _italic bold ~italic bold strikethrough~ __underline italic bold___ bold* [inline URL](<http://www.example.com/>) [inline mention of a user](tg://user?id=123456789) `inline fixed-width code`
```python pre-formatted fixed-width code block written in the Python programming language
请注意: * 任何代码在1到126之间(含1和126)的字符都可以在任何带有''字符的位置转义,在这种情况下,它将被视为普通字符,而不是标记的一部分。 * 在pre和code实体内部,所有'\\`'和''字符必须以前面的''字符转义。 * 内联链接定义的内部(...)部分,所有')'和''必须以前面的''字符转义 * 在其他所有地方这些字符 '\\_', '\\*', '\\[', '\\]', '(', ')', '~', '\\`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!' 必须用前置''转义 * 如果`斜体`和`下划线`之间存在歧义,`__`始终从左到右被视为`下划线`实体的开始或结尾,所以使用`___italic underline_\\r__`代替`___italic underline___` ### [](#html-style)HTML style 要使用此模式,请在parse\\_mode字段中传递HTML。当前支持以下标签: ```html <b>bold</b>, <strong>bold</strong> <i>italic</i>, <em>italic</em> <u>underline</u>, <ins>underline</ins> <s>strikethrough</s>, <strike>strikethrough</strike>, <del>strikethrough</del> <b>bold <i>italic bold <s>italic bold strikethrough</s> <u>underline italic bold</u></i> bold</b> <a href="<http://www.example.com/>">inline URL</a> <a href="tg://user?id=123456789">inline mention of a user</a> <code>inline fixed-width code</code> <pre>pre-formatted fixed-width code block</pre> <pre><code class="language-python">pre-formatted fixed-width code block written in the Python programming language</code></pre>
<
,>
和&
符号必须替换为相应的HTML实体(<
用 <
, >
用 >
, &
用 &
)。<
, >
, &
and "
。*bold text* _italic text_ [inline URL](<http://www.example.com/>) [inline mention of a user](tg://user?id=123456789) `inline fixed-width code`
```python pre-formatted fixed-width code block written in the Python programming language
请注意: * 实体不得嵌套,而应使用解析模式`MarkdownV2`。 * 无法指定下划线和删除线实体,请改用解析模式`MarkdownV2`。 * 要在实体外部转义字符`_`,`*`,`,`\\[`,请在字符之前加上`\\`。 * 不允许在实体内部转义,因此必须先关闭实体再重新打开:对于斜体使用`_snake_\\__case_`,对于粗体`2*2=4`使用 `snake_case` 和 `*2*\\**2=4*`。 [](#telegram更新)telegram更新 ------------------------- telegram中更新指的是机器人是否有收到新的消息,具体有哪些消息可以查看`telegram对象`部分中的`Update`,获取更新的方式有两种1. 轮询,2.webhook ### [](#轮询)轮询 这是一种主动询问的方式,这种方式比较简单但是效率欠佳,具体操作是,开发者每个一段时间请求一次`getUpdates`方法,从获取结果中判断update有无更新,有关`update`对象的描述可看`telegram对象`章节 ### [](#webhook)webhook webhook可以理解为客户端给服务端的api,只要服务端一有更新就会主动将内容发送到客户端设置的一个api中,然后客户端收到消息后可做相应处理。 **给我们的机器人设置webhook** 通过`setWebhook`方法设置(前面有介绍),需要注意的是,telegram只支持`https`协议,所以我们的api服务器必须要有TLS证书,必须注意一但我们设置了webhook那么通过`getUpdates`方法将不起作用! [](#telegram中的命令)telegram中的命令 ----------------------------- 通过命令来和机器人交互是电报机器人的一大特色,在telegram中命令由实体`BotCommand`表示(telegram对象那节已经介绍过)。 其实任何以`/`开头的连续英文消息都被视作命令(可以理解为这是一种具有格式的普通消息),私聊或者在群里@机器人时发送`/`开头的信息可以查看实体类型为`bot_command` 。要想让机器人收到某条命令后执行响应动作只需要判断发送的消息是否匹配我们约定的内容即刻,(从某种意义上讲无论发送的消息是否是命令格式我们都可以将其视为命令只要我们愿意),开发具有命令响应的过程总结如下: 1. 起一个死循环监听`update`的`message`消息,可以是轮询或者webhook方式 2. 拿到`update.id`检查其是否更新,如有更新则取`message.Text`匹配已经定义好的`路由`(这是我定义的叫法,也就是我们约定的命令,事实上他的确和路由很像) 3. 如果匹配成功,执行我们定义的方法,如果匹配失败则当做普通信息无视,或者返回对应信息 从上面过程可以看出命令是否是`/`开头其实已经不那么重要了,那么为什么官方要定义`BotCommand`类呢,理由(优点)如下 1. 用以和普通消息区分 2. 在聊天消息中命令会高亮显示 3. 已经注册的命令在对话框中只需要输入`/`就会有提示列表 ### [](#给机器人注册指令)给机器人注册指令 **手动注册** 1. 和`BotFather`对话,输入`/mybot` 2. 选择要注册指令的机器人 3. 选择`Edit Bot`选项 4. 选择`Edit Commands` 5. 输入你想定义的命令,格式为 ``` command1 - 描述 command2 - Description ``` 注意:注册时命令开头没有斜杠,使用命令时需要带上斜杠,中间用 `-` 分割;每一次的命令编辑都会覆盖之前的命令而不是追加,所以必须一次发送全部命令(在对话框中按`shift + enter`换行) **通过`setMyCommands`方法注册** * 详见(telegram方法 setMyCommands) ### [](#查看已注册的指令)查看已注册的指令 * 详见(telegram方法 getMyCommands) ### [](#基本指令)基本指令 telegram建议我们的机器人都带上三条基本指令分别是 * `/start` * `/help` * `/settings` 当设置了上面三个命令,用户首次打开与你的机器人的对话时,将看到`Start`按钮。机器人的个人资料页面上的菜单中将提供`Help`和`Settings`链接。 [](#键盘)键盘 --------- telegram中键盘也是机器人的一大特色,开发者可以自定义自己的键盘,一个键盘相当于机器人的菜单可以理解为一个答复界面,可以更加方便的和机器人交互。 telegram中的键盘有四种`ReplyKeyboardMarkup`,`InlineKeyboardMarkup`,`ReplyKeyboardRemove`和`ForceReply`,这四个对象可参考前面的介绍 ### [](#创建键盘)创建键盘 只需要在`sendMessage`时指定`reply_markup`即可,详见`sendMessage`方法