使用 bot 发送和修改带按钮的 tg 消息

前言

    最近想要在我的频道里发一个有按钮的消息,但是我发现 tg 用户是不能发送带按钮的消息的。tg 里允许发送按钮的只能是 bot,所以我研究了以下 tg 的 bot api ,方便我发送和修改带按钮的消息。

    不过在讲解怎么发送和修改消息前,先来讲讲一些必要的知识。

一、必要知识讲解

    首先,你要获取 bot 的 token。这很简单,只要到 @BotFather 就行了。然后,你需要知道 chat_id 和 message_id 的事情。

    无论是群组还是频道,无论公开还是私密,tg 都会有一个编号与这个群组/频道对应,这就是 chat_id。在这个群组/频道的消息会有有个 message_id 与之相对应,一般 message_id 是这条消息在群组/频道的序号。如何获取 chat_id 和 message_id 呢?message_id 比较好获取,这个消息的链接的最后一串数字就是 message_id。chat_id 就比较难获取一些,如果是私密群组/频道,任何一条消息的链接的 message_id 之前的一串数字就是 chat_id,也就是私密群组/频道任何一条消息的链接应该是 https://t.me/c/chat+id/message_id;对于公开群组/频道,chat_id 就比较难获取一些。你应该知道,公开群组/频道有一个所有者自己设的链接,比如 https://t.me/fylcrchannel(这是我本人的的频道),那么最后这个自定义的地方就被称为 username,也就是公开群组/频道的链接格式为 https://t.me/username。好了,现在你已经知道一个公开群组/频道的 username 了,然后你需要将后面那个链接的尖括号里替换掉相应的内容并粘贴到浏览器里即可,链接为 https://api.telegram.org/bot<BotToken>/getChat?chat_id=@<username>,之后会返回一串东西 {"ok":true,"result":{"id":...,这第一个 id 就是 chat_id。

    接下来我们来讲讲 inline_keyboard,方便之后更好的创建按钮。inline_keyboard 是二维数组,也就是由数组组成的数组。外面一层的大数组描述着按钮的层数,有几项就有几层,同一项的按钮在同一层。里面的数组描述着同一层的按钮,也就是按钮组成的数组。一个按钮用这样的语法描述 {"text": "按钮显示的文本", "第二个参数": "第二个参数"}。第二个参数有三种类型,分别是 urlcallback_dataswitch_inline_queryurl,顾名思义,点击按钮后会跳转到指定链接;callback_data 将会传回一个回调数据,这不是我们关心的;switch_inline_query 将会跳转到内联模式,也不是我们关心的。你可以看看下面的示例再学习一下:

  • 跳转链接按钮(url)
    1
    2
    3
    4
    5
    6
    "inline_keyboard": [
    [
    {"text": "访问百度", "url": "https://baidu.com"},
    {"text": "访问谷歌", "url": "https://google.com"}
    ]
    ]
  • 多行多按钮
    1
    2
    3
    4
    5
    6
    7
    8
    9
    "inline_keyboard": [
    [{"text": "第一行按钮1", "url": "https://a.com"}], // 第一行1个按钮
    [
    {"text": "第二行按钮1", "callback_data": "b1"},
    {"text": "第二行按钮2", "callback_data": "b2"},
    {"text": "第二行按钮3", "callback_data": "b3"}
    ], // 第二行3个按钮
    [{"text": "第三行按钮", "switch_inline_query": "推荐内容"}] // 第三行1个inline模式按钮
    ]
    注意:
    • 必须是二维数组(即使只有一行一个按钮,也要写成 `[[按钮]]`)。
    • 按钮对象必须包含 text,且只能选一个交互参数(url/callback_data 等不能同时存在)。
    • 每行按钮数量建议不超过 3-4 个(过多会自动换行或压缩显示)。
    • 按钮文字过长会被截断,建议控制在 20 字以内。
    • text 最多 128 个字符
    • url 必须以 http:// 或 https:// 开头

    tg 发送文字消息和媒体(图片、视频等)消息是不一样的,并且发送后不能修改消息类型,即一个文字消息不能修改为媒体消息,一个媒体消息不能修改为文字消息。所以请你在发送消息之前一定要考虑好消息的类型。

二、发送带按钮的消息

1. 发送文字消息

    调用下面的 api 就可以发送消息了

    下面是请求的 json 请求体:

1
2
3
4
5
6
7
8
9
10
{
"chat_id": "chat_id",
"text": "消息的内容",
"reply_markup": {
"inline_keyboard": [
[{"text": "按钮1", "url": "https://example.com"}],
[{"text": "按钮2", "url": "https://example.com"}]
]
}
}

    如果你不想直接调用 api 的话,你可以在下面非常方便地发送文字消息。

2. 发送图片消息

    调用下面的 api 就可以发送消息了

    下面是请求的 json 请求体:

1
2
3
4
5
6
7
8
9
10
{
"chat_id": "你的chat_id",
"photo": "https://图片URL.jpg", // 要发送的图片URL(必填)
"caption": "这是图片的说明文字", // 图片的说明文字(可选)
"reply_markup": {
"inline_keyboard": [
[ {"text": "按钮1", "url": "https://链接1.com"}]
]
}
}

    如果你不想直接调用 api 的话,你可以在下面非常方便地发送图片消息。

提示:可直接输入Chat ID,或输入用户名(如@mygroup),发送时将自动转换为ID(机器人机器人需是该群组/频道成员)

请输入可公开访问的图片URL(支持JPG、PNG等格式)

三、修改带按钮的消息

1. 修改文字消息

    调用下面的 api 就可以修改消息了

    下面是请求的 json 请求体:

1
2
3
4
5
6
7
8
9
10
11
12
{
"chat_id": "你的chat_id",
"message_id": "你的message_id",
"text": "这是修改后的新文本",
"reply_markup": {
"inline_keyboard": [
[
{"text": "新按钮", "url": "https://新链接.com"}
]
]
}
}

    如果你不想直接调用 api 的话,你可以在下面非常方便地修改文字消息。

2. 修改图片消息

    调用下面的 api 就可以修改消息了

    下面是请求的 json 请求体:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"chat_id": "你的chat_id",
"message_id": "你的图片消息ID",
"media": {
"type": "photo",
"media": "https://新图片URL",
"caption": "新图片说明"
},
"reply_markup": {
"inline_keyboard": [
[{
"text": "按钮",
"url": "https://链接.com"
}]
]
}
}

    如果你不想直接调用 api 的话,你可以在下面非常方便地修改图片消息。

    最后,如果你想获取上面那些界面的源代码,可以 点这里 下载