TelegramBot使用文档




Telegram Bot 使用文档
注意:知乎支持markdown但是不支持表格,文章中大量表格全为源码显示,为获取更好的阅读体验,请移步我的博客
创建机器人
在telegram中我们可以通过和一个名为BotFather的机器人交互来申请我们自己的机器人,具体步骤如下
添加BotFather为好友点击这里添加botfather
打开和botfather的对话框发送 /newbot这一步过后botfather会提示你输入你要创建的机器人的名字,这个名字可以随意,是我们称呼它的名字
设置自定义机器人的名字(这个名字不同于上一步的名字,这个名字是唯一的)结尾必须是_bot或者Bot,不能包含中文, 标点符号
如果上一步执行成功那么botfather会返回该机器人的token,大概长这样
123456789:ABCDEfghiJK4314daDSadSa7
记住这个token,到这里机器人就创建好了
获取群组chat_id
通常来说我们都需要让机器人在一个群组里工作,所以首先我们需要将机器人添加到我们指定的群组,在群组里发送随意消息并@这个机器人,比如
然后浏览器打开这个链接,注意替换为你的token
你看到的是一个json,格式如下
从中找到chat.id这就是当前群组的id,以后发消息都是发到这个id.
机器人发送消息给群组
请求接口
telegram发送消息的方式类似与钉钉机器人,都是向一个api发送http请求,而且对于同一个APItelegram支持GET和POST两种请求方式.请求的api格式如下
其中token为你的机器人token,method为telegram给定的方法,在获取群组chat_id那一步就使用了telegram的其中一个方法(getUpdates),其他方法后面会介绍
携带参数
请求api时有些方法需要携带参数,telegram支持的传参方式/类型如下
URL查询参数application/x-www-form-urlencodedapplication/jsonmultipart/form-data(上传文件使用这个content-type)获取响应
对于每次请求telegram都会有一个响应,响应的内容是一个json,格式如下
其中返回的result可以是telegram定义的对象或者是对象的列表
telegram对象
telegram定义了许多场景下的对象,详见,这里举例一些常见的
Update
该对象表示传入的更新,比如接收到用户发来的新消息,就会获得新的更新
| Field | Type | Description | | :------------------- | :----------------------------------------------------------- | :----------------------------------------------------------- | | update_id | Integer | 更新的唯一标识符。 更新标识符从某个正数开始,并依次增加。 如果您使用的是Webhooks,则此ID变得尤为方便,因为它使您可以忽略重复的更新或在错误的情况下恢复正确的更新顺序。 如果至少有一个星期没有新更新,则将随机选择下一个更新的标识符,而不是顺序选择。 | | message | Message | 可选的。任何形式的新传入消息-文本,照片,贴纸等。 | | edited_message | Message | 可选的。机器人已知并已编辑的消息的新版本 | | channel_post | Message | 可选的。任何形式的新传入频道帖子-文字,照片,贴纸等。 | | edited_channel_post | Message | 可选的。机器人已知并已编辑的频道发布的新版本 | | inline_query | InlineQuery | 可选的。新的传入内联查询 | | chosen_inline_result | ChosenInlineResult | 可选的。用户选择并发送给其聊天伙伴的内联查询的结果。请参阅收集反馈的文档,以获取有关如何为您的机器人启用这些更新的详细信息。 | | callback_query | CallbackQuery | 可选的。新传入的回调查询 | | shipping_query | ShippingQuery | 可选的。新的收货查询。仅适用于价格灵活的发票 | | pre_checkout_query | PreCheckoutQuery | 可选的。新的传入预结帐查询。包含有关结帐的完整信息 | | poll | Poll | 可选的。新的投票状态。机器人仅接收有关僵尸程序发送的有关已停止的投票和投票的更新 | | poll_answer | PollAnswer | 可选的。用户在非匿名调查中更改了答案。僵尸程序仅在由僵尸程序本身发送的民意调查中才能获得新的选票。 |
任何给定的更新中最多只能存在一个可选参数。
User
该对象表示telegram的一个用户或者机器人
| Field | Type | Description | | :------------------------- | :------ | :----------------------------------------------------------- | | id | Integer | 该用户或机器人的唯一标识 | | is_bot | Boolean | 标识该用户是否是机器人,True如果是机器人 | | first_name | String | 用户或者机器人的first_name | | last_name | String | 可选。用户或者机器人的last_name | | username | String | 可选。用户或者机器人的username | | language_code | String | 可选。用户语言的IETF语言标签 | | can_join_groups | Boolean | 可选。返回True如果该机器人可以被邀请加入群组,只在getMe方法返回 | | can_read_all_group_message | Boolean | 可选。返回True如果该机器人禁用了隐私模式,只在getMe方法返回 | | supports_inline_queries | Boolean | 可选。返回True,如果这个自持内联查询,只在getMe方法返回 |
Chat
该对象表示一个聊天信息
| Field | Type | Description | | :------------------ | :----------------------------------------------------------- | :----------------------------------------------------------- | | id | Integer | 该聊天的唯一标识符。 这个数字可能会大于32位但是一定小于52位所以编程时因指定int64类型 | | type | String | 聊天的类型,可以是 “private”, “group”, “supergroup” 或者 “channel” | | title | String | 可选。 标题, 针对 supergroups, channels 和 group 类型的聊天 | | username | String | 可选。 Username, 针对 私有的聊天,如果可以的话也针对 supergroups 和 channels | | first_name | String | 可选。 私人聊天中对方的first_name | | last_name | String | 可选。私人聊天中对方的last_name | | photo | ChatPhoto | 可选。 聊天照片,只在getChat方法返回 | | description | String | 可选。 描述, 针对 groups, supergroups 和 channel 的聊天。只在getChat方法返回 | | invite_link | String | 可选。聊天的邀请链接, 针对 groups, supergroups 和 channel 的聊天。聊天中的每个管理员都会生成自己的邀请链接,因此机器人必须首先使用exportChatInviteLink生成链接。仅在getChat中返回。 | | pinned_message | Message | 可选。固定信息,针对 groups, supergroups 和 channels。只在getChat方法中返回 | | permissions | ChatPermissions | 可选。默认的聊天成员权限, 针对 groups 和 supergroups。只在getChat方法中返回 | | slow_mode_delay | Integer | 可选。针对 supergroups, 每个非特权用户发送的连续消息之间允许的最小延迟。仅在getChat中返回。 | | sticker_set_name | String | 可选。针对 supergroups, 组贴纸集的名称。仅在getChat中返回。 | | can_set_sticker_set | Boolean | 可选。 返回True如果机器人可以改变group的贴纸集,只在getChat方法中返回。 |
Message
该对象代表一个消息
| Field | Type | Description | | :---------------------- | :----------------------------------------------------------- | :----------------------------------------------------------- | | message_id | Integer | 此聊天中的唯一消息标识符 | | from | User | 可选的。发件人,对于发送到channels的消息为空 | | date | Integer | 发送时间(Unix时间) | | chat | Chat | 消息所属的会话 | | forward_from | User | 可选的。对于转发的消息,原始消息的发件人 | | forward_from_chat | Chat | 可选的。对于从频道转发的消息,有关原始频道的信息 | | forward_from_message_id | Integer | 可选的。对于从频道转发的消息,是频道中原始消息的标识符 | | forward_signature | String | 可选的。对于从频道转发的消息,作者的签名(如果有) | | forward_sender_name | String | 可选的。从用户转发的信息的发件人名称,这些用户不允许在转发的信息中添加指向其帐户的链接 | | forward_date | Integer | 可选的。对于转发的消息,原始消息的发送日期(Unix时间) | | reply_to_message | Message | 可选的。对于答复,原始消息。请注意,即使此字段本身是答复,该字段中的Message对象也不会包含其他的reply_to_message字段。 | | via_bot | User | 可选的。发送消息的机器人 | | edit_date | Integer | 可选的。消息最后一次编辑的日期(Unix时间) | | media_group_id | String | 可选的。该消息所属的媒体消息组的唯一标识符 | | author_signature | String | 可选的。在频道中信息的作者签名 | | text | String | 可选的。对于文本消息,消息的实际UTF-8文本,0-4096个字符 | | entities | Array of MessageEntity | 可选的。对于文本消息,出现在文本中的特殊实体,例如用户名,URL,机器人命令等。 | | animation | Animation | 可选的。消息是动画,有关动画的信息。为了向后兼容,设置此字段时,还将设置文档字段 | | audio | Audio | 可选的。消息是音频文件,有关该文件的信息 | | document | Document | 可选的。消息是常规文件,有关文件的信息 | | photo | Array of PhotoSize | 可选的。消息是照片,照片的可用尺寸 | | sticker | Sticker | 可选的。消息是贴纸,有关贴纸的信息 | | video | Video | 可选的。消息是视频,有关视频的信息 | | video_note | VideoNote | 可选的。消息是视频注释,有关视频消息的信息 | | voice | Voice | 可选的。消息是语音消息,有关文件的信息 | | caption | String | 可选的。动画,音频,文档,照片,视频或语音的标题,0-1024个字符 | | caption_entities | Array of MessageEntity | 可选的。对于带有标题的消息,出现在标题中的特殊实体,例如用户名,URL,漫机器人命令等 | | contact | Contact | 可选的。消息是共享的联系人,有关该联系人的信息 | | dice | Dice | 可选的。消息是一个骰子,具有从1到6的随机值 | | game | Game | 可选的。消息是一个游戏,有关游戏的信息。 | | poll | Poll | 可选的。消息是原生投票,有关投票的信息 | | venue | Venue | 可选的。消息是一个场地,有关该场地的信息。为了向后兼容,设置此字段时,还将设置位置字段 | | location | Location | 可选的。消息是共享位置,有关位置的信息 | | new_chat_members | Array of User | 可选的。添加到组或超组中的新成员以及有关它们的信息(机器人本身可能是这些成员之一) | | left_chat_member | User | 可选的。成员已从群组中删除,有关他们的信息(该成员可能是机器人本身) | | new_chat_title | String | 可选的。聊天标题已更改为此值 | | new_chat_photo | Array of PhotoSize | 可选的。聊天照片已更改为此值 | | delete_chat_photo | True | 可选的。服务消息:聊天照片已删除 | | group_chat_created | True | 可选的。服务信息:组已创建 | | supergroup_chat_created | True | 可选的。 服务消息:超组已创建。 在通过更新发送的消息中无法接收到该字段,因为bot在创建时不能成为超组的成员。 仅当有人回复直接创建的超组中的第一条消息时,才可以在reply_to_message中找到该消息。 | | channel_chat_created | True | 可选的。 服务信息:频道已创建。 在通过更新发送的消息中无法接收到该字段,因为bot在创建时不能成为频道的成员。 如果有人回复频道中的第一条消息,则只能在reply_to_message中找到它。 | | migrate_to_chat_id | Integer | 可选的。 该组已迁移到具有指定标识符的超组。 此数字可能大于32位,并且某些编程语言在解释它时可能会有困难/无声的缺陷。 但是它小于52位,因此带符号的64位整数或双精度浮点类型对于存储此标识符是安全的。 | | migrate_from_chat_id | Integer | 可选的。 超级组已从具有指定标识的组中迁移。 此数字可能大于32位,并且某些编程语言在解释它时可能会有困难/无声的缺陷。 但是它小于52位,因此带符号的64位整数或双精度浮点类型对于存储此标识符是安全的。 | | pinned_message | Message | 可选的。 指定的消息已固定。 请注意,即使该字段本身是答复,该字段中的Message对象也不会包含其他的reply_to_message字段。 | | invoice | Invoice | 可选的。 消息是付款的发票,有关发票的信息。 | | successful_payment | SuccessfulPayment | 可选的。 消息是有关成功付款的服务消息,有关付款的信息。 | | connected_website | String | 可选的。 用户登录的网站的域名。 | | passport_data | PassportData | 可选的。 电报护照数据 | | reply_markup | InlineKeyboardMarkup | 可选的。 消息附带的嵌入式键盘。 login_url按钮表示为普通url按钮。 |
MessageEntity
该对象表示文本消息中的一个特殊实体。例如,标签,用户名,URL等。
| Field | Type | Description | | :------- | :---------------------------------------------- | :----------------------------------------------------------- | | type | String | 实体的类型。 可以是“mention”(@username),“hashtag”(#hashtag),“cashtag”($ USD),“ bot_command”(/ start @ jobs_bot),“ URL”(https://telegram.org),“ email”(do-not-reply@telegram.org),“phone_number”(+ 1-212-555-0123),“bold”(粗体),“italic”(斜体),“underline”(带下划线的文本) ),“strikethrough”(删除线文本),“code”(等宽字符串),“ pre”(等宽块),“ text_link”(对于可点击的文本URL),“ text_mention”(对于没有用户名的用户) | | offset | Integer | 以UTF-16代码单位向实体开始的偏移量 | | length | Integer | 实体的长度(以UTF-16代码单元为单位) | | url | String | 可选的。仅对于“ text_link”,用户点击文本后将打开的URL | | user | User | 可选的。仅针对“ text_mention”,提到的用户 | | language | String | 可选的。仅对于“ pre”,实体文本的编程语言 |
BotCommand
这个对象代表值一条机器人指令
| Field | Type | Description | | :---------- | :----- | :--------------------------------------------------------- | | command | String | 命令文本,1-32个字符。只能包含小写英文字母,数字和下划线。 | | description | String | 命令说明,3-256个字符。 |
WebhookInfo
这个对象表示当前webhook的状态
| Field | Type | Description | | :--------------------- | :-------------- | :----------------------------------------------------------- | | url | String | Webhook URL,如果未设置webhook,则可能为空 | | has_custom_certificate | Boolean | 如果为webhook证书检查提供了自定义证书则为真 | | pending_update_count | Integer | 等待交付的更新数量 | | last_error_date | Integer | 可选的。尝试通过Webhook传递更新时发生的最新错误的Unix时间 | | last_error_message | String | 可选的。尝试通过Webhook传递更新时发生的最新错误的人类可读格式的错误消息 | | max_connections | Integer | 可选的。与Webhook进行更新交付的同时HTTPS连接的最大允许数量 | | allowed_updates | Array of String | 可选的。机器人已订阅的更新类型的列表。默认为所有更新类型 |
telegram方法
telegram方法就是拼接在api后面的那串字符串,不区分大小写。详见,这里只列举一些常用的,下面我所指的返回是指返回json中的result部分,其他章节提到的所有方法均可以在这一章节查阅
getUpdates
描述获取更新,还有另外一种获取更新的方法(webhook),两种方式不能共存
参数无参数
返回update对象列表
setWebhook
描述使用此方法可以指定URL并通过传出的Webhook接收传入的更新。只要机器人有更新,telegram就会向指定的URL发送HTTPS POST请求,请求数据为json序列化后的update对象
参数| Parameter | Type | Required | Description | | :-------------- | :-------------------------------------------------------- | :------- | :----------------------------------------------------------- | | url | String | Yes | 发送更新的https url。使用空字符串删除webhook集成 | | certificate | InputFile | Optional | 上传您的公共密钥证书,以便可以检查正在使用的根证书。有关详细信息,请参见我们的自签名指南
。 | | max_connections | Integer | Optional | 与Webhook进行更新交付的同时HTTPS连接的最大允许数量为1-100。默认值为40。使用较低的值可以限制bot服务器的负载,使用较高的值可以增加bot的吞吐量。 | | allowed_updates | Array of String | Optional | 您希望机器人接收的更新类型的JSON序列化列表。 例如,指定[“ message”,“ edited_channel_post”,“ callback_query”]仅接收这些类型的更新。 请参阅更新以获取可用更新类型的完整列表。 指定一个空列表以接收所有更新,无论类型如何(默认)。 如果未指定,将使用以前的设置。
请注意,此参数不会影响调用setWebhook之前创建的更新,因此可能会在短时间内收到不需要的更新。 |返回成功返回True
deleteWebhook
描述删除设置的webhook
参数无参数
返回成功返回True
getWebhookInfo
描述获取当前webhook的状态
参数无参数
返回WebhookInfo对象
(如果没有设置webhook,则返回的对象中url为空)
getMe
描述获取机器人自身信息
参数无参数
返回user对象
getChat
描述使用此方法可获取有关聊天的最新信息(一对一对话的用户的当前名称,用户的当前用户名,组或频道等)
参数| Parameter | Type | Required | Description | | :-------- | :---------------- | :------- | :----------------------------------------------------------- | | chat_id | Integer or String | Yes | 目标聊天或目标超级组或频道的用户名的唯一标识符(格式为@channelusername) |
返回chat对象
sendMessage
描述发送消息
参数| Parameter | Type | Required | Description | | :----------------------- | :----------------------------------------------------------- | :------- | :----------------------------------------------------------- | | chat_id | Integer or String | Yes | 目标聊天(chat_id)或目标频道的用户名的唯一标识符(格式为@channelusername) | | text | String | Yes | 待发送消息的文本,实体解析后为1-4096个字符 | | parse_mode | String | Optional | 消息文本中的实体解析模式。有关更多详细信息,请参见格式化选项。 | | disable_web_page_preview | Boolean | Optional | 禁用此消息中链接的链接预览 | | disable_notification | Boolean | Optional | 静默发送消息。用户将收到没有声音的通知。 | | reply_to_message_id | Integer | Optional | 如果消息是答复,则为原始消息的ID | | reply_markup | InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardRemove or ForceReply | Optional | 其他界面选项。内联键盘,自定义回复键盘,删除回复键盘或强制用户回复的说明的JSON序列化对象。 |
返回刚刚发送的message对象
setMyCommands
描述使用此方法可以更改机器人的命令列表
参数| Parameter | Type | Required | Description | | :-------- | :----------------------------------------------------------- | :------- | :----------------------------------------------------------- | | commands | Array of BotCommand | Yes | 将bot命令的JSON序列化列表设置为bot命令列表。最多可以指定100个命令。 |
返回成功返回True
getMyCommands
描述使用此方法获取机器人命令的当前列表
参数无参数
返回BotCommand对象列表
格式化选项
格式化选项就是让我们的机器人以某种格式发送消息(比如markdown,或者html)
Bot API支持消息的基本格式。您可以在机器人的消息中使用粗体,斜体,下划线和删除线文本,以及内联链接和预格式化的代码。电报客户端将相应地呈现它们。您可以使用markdown样式或HTML样式格式。
请注意,Telegram客户端将在打开内联链接(“打开此链接?”以及完整的URL)之前向用户显示警报。
如果满足以下限制,则可以嵌套消息实体:
如果两个实体具有公共字符,则其中一个完全包含在另一个内部。粗体,斜体,下划线和删除线实体可以包含并且要包含在任何其他实体中,但pre和code除外。所有其他实体不能互相包含。链接tg://user?id=<user_id>可以用于通过用户ID提及用户,而无需使用用户名。请注意:
这些链接仅在内联链接中使用时才有效。例如,当用于嵌入式键盘按钮或消息文本中时,它们将不起作用。仅当用户过去联系过该机器人,通过内联按钮向该机器人发送了回调查询或成为提及该用户的组的成员时,才能保证这些提及有效。MarkdownV2 style
要使用此模式,请在parse_mode字段中传递MarkdownV2。在您的消息中使用以下语法:
请注意:
任何代码在1到126之间(含1和126)的字符都可以在任何带有\字符的位置转义,在这种情况下,它将被视为普通字符,而不是标记的一部分。在pre和code实体内部,所有`和\字符必须以前面的\字符转义。内联链接定义的内部(...)部分,所有)和\必须以前面的\字符转义在其他所有地方这些字符 _, *, [, ], (, ), ~, `, >, #, +, -, =, |, {, }, ., ! 必须用前置\转义如果斜体和下划线之间存在歧义,__始终从左到右被视为下划线实体的开始或结尾,所以使用___italic underline_\r__代替___italic underline___HTML style
要使用此模式,请在parse_mode字段中传递HTML。当前支持以下标签:
请注意:
当前仅支持上述标签。所有不属于标记或HTML实体的<,>和&符号必须替换为相应的HTML实体(< 用 <, > 用 >, & 用 &)。支持所有数字HTML实体。该API当前仅支持以下命名的HTML实体: <, >, & and "。使用嵌套的pre和code标签,为pre实体定义编程语言。不能为独立code标签指定编程语言。Markdown style
这是旧版模式,保留下来是为了向后兼容。要使用此模式,请在parse_mode字段中传递Markdown。在您的消息中使用以下语法:
请注意:
实体不得嵌套,而应使用解析模式MarkdownV2。无法指定下划线和删除线实体,请改用解析模式MarkdownV2。要在实体外部转义字符_,*,`,[,请在字符之前加上\。不允许在实体内部转义,因此必须先关闭实体再重新打开:对于斜体使用_snake_\__case_,对于粗体2*2=4使用 snake_case 和 *2*\**2=4*。telegram更新
telegram中更新指的是机器人是否有收到新的消息,具体有哪些消息可以查看telegram对象部分中的Update,获取更新的方式有两种1. 轮询,2.webhook
轮询
这是一种主动询问的方式,这种方式比较简单但是效率欠佳,具体操作是,开发者每个一段时间请求一次getUpdates方法,从获取结果中判断update有无更新,有关update对象的描述可看telegram对象章节
webhook
webhook可以理解为客户端给服务端的api,只要服务端一有更新就会主动将内容发送到客户端设置的一个api中,然后客户端收到消息后可做相应处理。
给我们的机器人设置webhook
通过setWebhook方法设置(前面有介绍),需要注意的是,telegram只支持https协议,所以我们的api服务器必须要有TLS证书,必须注意一但我们设置了webhook那么通过getUpdates方法将不起作用!
telegram中的命令
通过命令来和机器人交互是电报机器人的一大特色,在telegram中命令由实体BotCommand表示(telegram对象那节已经介绍过)。
其实任何以/开头的连续英文消息都被视作命令(可以理解为这是一种具有格式的普通消息),私聊或者在群里@机器人时发送/开头的信息可以查看实体类型为bot_command。要想让机器人收到某条命令后执行响应动作只需要判断发送的消息是否匹配我们约定的内容即刻,(从某种意义上讲无论发送的消息是否是命令格式我们都可以将其视为命令只要我们愿意),开发具有命令响应的过程总结如下:
起一个死循环监听update的message消息,可以是轮询或者webhook方式拿到update.id检查其是否更新,如有更新则取message.Text匹配已经定义好的路由(这是我定义的叫法,也就是我们约定的命令,事实上他的确和路由很像)如果匹配成功,执行我们定义的方法,如果匹配失败则当做普通信息无视,或者返回对应信息从上面过程可以看出命令是否是/开头其实已经不那么重要了,那么为什么官方要定义BotCommand类呢,理由(优点)如下
用以和普通消息区分在聊天消息中命令会高亮显示已经注册的命令在对话框中只需要输入/就会有提示列表给机器人注册指令
手动注册
和botFather对话,输入/mybot
选择要注册指令的机器人
选择Edit Bot选项
选择Edit Commands
输入你想定义的命令,格式为
command1 - 描述 command2 - Description
注意:注册时命令开头没有斜杠,使用命令时需要带上斜杠,中间用 - 分割;每一次的命令编辑都会覆盖之前的命令而不是追加,所以必须一次发送全部命令(在对话框中按shift + enter换行)
通过setMyCommands方法注册
详见(telegram方法 setMyCommands)