零成本构建TG Bot 
准备工作 
- 一个TG账号
 - 一个Google账号
 
创建方法 
1.启动TG,搜索@BotFather开始聊天
2.发送/newbot新建Bot。
3.发送Bot的名字
4.发送Bot的username
5.设置一些属性
6.获取token,直接发送/token即可
7.在google script里
8.新建脚本
9.写如下代码
javascript
var Bot_Token = "" //换成自己在token
function doPost(e) {
  //讲请求数据的内容不符 转JSON对象
  var body = JSON.parse(e.postData.contents);
  //转为字符型 
  body.message.chat.id = body.message.chat.id + '';
  MsgHandle(body)
}
function MsgHandle(body) {
  var chat_id = body.message.chat.id
  if (body.message.text) { //接收到文本 
    restText = body.message.text;
    if (restText.startsWith("/start")) {
      SendMsg(body.message.chat.id, "你好")
    }
  }
}
function SendMsg(id, text) {
  var payload = {
    "method": "sendMessage",
    "chat_id": id,  // 获取聊天ID
    "text": text, // 消息内容
    "parse_mode": "Markdown"  // 使用Markdown解析模式
  }
  var data = {
    "method": "post",
    "payload": payload
  }
  UrlFetchApp.fetch("https://api.telegram.org/bot" + Bot_Token + "/", data);
}Deploy发布New deployment,所有人可见
复制web app下的url,结尾带exec的链接
对接TG Bot,访问构造如下链接,并在浏览器访问,看到返回带有ok则成功
lua
https://api.telegram.org/bot<你的Bot的token>/setWebhook?url=<你的脚本链接>注意讲<你的脚本链接>,<你的Bot的token>都替换成你自己的,前后没有空格
在tg对bot发/start
如果回复了“你好”
就大功告成了
更新代码 
直接在gs里写完用Manage deployments,点击右上角笔图标,version选择new version,点deploy即可,tg bot那边将会立即更新
发送不同类型消息方法 
出了上面发送文字消息的函数外,这里还总结了一些其他消息类型发送方法。
javascript
// 回复消息(会引用目标消息)
function ReplyMsg(chat_id, text, reply_to_message_id) {
  var payload = {
    "method": "sendMessage",
    "chat_id": chat_id,
    "text": text,
    "reply_to_message_id": reply_to_message_id,
    "parse_mode": "Markdown"
  };
  var options = {
    "method": "post",
    "payload": payload
  };
  UrlFetchApp.fetch("https://api.telegram.org/bot" + Bot_Token + "/", options);
}
// 发送图片(photo为图片URL或文件ID,可附带说明文字)
function SendPhoto(chat_id, photo, caption) {
  var payload = {
    "method": "sendPhoto",
    "chat_id": chat_id,
    "photo": photo,
    "caption": caption || ""
  };
  var options = {
    "method": "post",
    "payload": payload
  };
  UrlFetchApp.fetch("https://api.telegram.org/bot" + Bot_Token + "/", options);
}
// 发送视频(video为视频URL或文件ID,可附带说明文字)
function SendVideo(chat_id, video, caption) {
  var payload = {
    "method": "sendVideo",
    "chat_id": chat_id,
    "video": video,
    "caption": caption || ""
  };
  var options = {
    "method": "post",
    "payload": payload
  };
  UrlFetchApp.fetch("https://api.telegram.org/bot" + Bot_Token + "/", options);
}
// 发送表情包/贴纸(sticker为贴纸文件ID)
function SendSticker(chat_id, sticker) {
  var payload = {
    "method": "sendSticker",
    "chat_id": chat_id,
    "sticker": sticker
  };
  var options = {
    "method": "post",
    "payload": payload
  };
  UrlFetchApp.fetch("https://api.telegram.org/bot" + Bot_Token + "/", options);
}
// 发送文件(document为文件URL或文件ID,可附带说明文字)
function SendDocument(chat_id, document, caption) {
  var payload = {
    "method": "sendDocument",
    "chat_id": chat_id,
    "document": document,
    "caption": caption || ""
  };
  var options = {
    "method": "post",
    "payload": payload
  };
  UrlFetchApp.fetch("https://api.telegram.org/bot" + Bot_Token + "/", options);
}
// 发送带按钮的消息(按钮以 inline_keyboard 形式展示)
// buttons 需为二维数组,如:[[{text:"按钮1", callback_data:"data1"}, {text:"按钮2", callback_data:"data2"}]]
function SendMessageWithButtons(chat_id, text, buttons) {
  var reply_markup = {
    "inline_keyboard": buttons
  };
  var payload = {
    "method": "sendMessage",
    "chat_id": chat_id,
    "text": text,
    "reply_markup": JSON.stringify(reply_markup),
    "parse_mode": "Markdown"
  };
  var options = {
    "method": "post",
    "payload": payload
  };
  UrlFetchApp.fetch("https://api.telegram.org/bot" + Bot_Token + "/", options);
}
// 发送投票消息(optionsArray 为选项字符串数组)
function SendPoll(chat_id, question, optionsArray) {
  var payload = {
    "method": "sendPoll",
    "chat_id": chat_id,
    "question": question,
    "options": JSON.stringify(optionsArray)  // API 要求传入 JSON 序列化的数组
  };
  var options = {
    "method": "post",
    "payload": payload
  };
  UrlFetchApp.fetch("https://api.telegram.org/bot" + Bot_Token + "/", options);
}
接收消息结构 
在doPost下我们可以看到var body = JSON.parse(e.postData.contents);
获取了telegram那边的返回的数据解析到body里了
让我们看看body的结构是什么
json
-----------------群组
{
  "updateid": 636682387,                     // 更新ID,用于唯一标识一次更新
  "message": {                               // 消息对象,包含具体的消息内容
    "messageid": 650,                        // 消息ID,唯一标识该条消息
    "from": {                                // 发送者信息
      "id": 1234567890,                      // 发送者的用户ID
      "isbot": false,                        // 是否为机器人,这里为 false,表示人为发送
      "firstname": "苦小怕",                  // 发送者的名字
      "username": "KuLiPai",                 // 发送者的用户名
      "languagecode": "zh-hans"              // 发送者使用的语言代码(简体中文)
    },
    "chat": {                                // 聊天对象信息
      "id": "-1234567890",                   // 群组的聊天ID,群组ID通常为负数
      "title": "myGroupsss",                 // 群组的名称
      "type": "group",                       // 聊天类型,这里是群组
      "allmembersareadministrators": true    // 是否所有成员都是管理员,这里可能指所有成员都有修改群组的权限
    },
    "date": 1740665459,                      // 消息发送的时间戳
    "text": "/test",                         // 消息文本内容
    "entities": {                            // 消息实体,用于描述文本中特殊部分(如命令)
      "offset": 0,                           // 特殊实体在文本中的起始位置
      "length": 5,                           // 特殊实体的长度
      "type": "bot_command"                  // 实体类型,这里表示是一个机器人命令
    }
  }
}json
--------------私聊
{
  "updateid": 636682252,                     // 更新ID,用于唯一标识一次更新
  "message": {                               // 消息对象,包含具体的消息内容
    "messageid": 500,                        // 消息ID,唯一标识该条消息
    "from": {                                // 发送者信息
      "id": 1234567890,                      // 发送者的用户ID
      "isbot": false,                        // 是否为机器人,这里为 false,表示人为发送
      "firstname": "苦小怕",                  // 发送者的名字
      "username": "KuLiPai",                 // 发送者的用户名
      "languagecode": "zh-hans"              // 发送者使用的语言代码(简体中文)
    },
    "chat": {                                // 聊天对象信息
      "id": "1234567890",                    // 私聊的聊天ID,通常就是用户的ID
      "firstname": "苦小怕",                  // 聊天对象的名字(私聊时为用户的名字)
      "username": "KuLiPai",                 // 聊天对象的用户名
      "type": "private"                      // 聊天类型,这里是私聊
    },
    "date": 1740130543,                      // 消息发送的时间戳
    "text": "/start",                        // 消息文本内容
    "entities": {                            // 消息实体,用于描述文本中特殊部分(如命令)
      "offset": 0,                           // 特殊实体在文本中的起始位置
      "length": 6,                           // 特殊实体的长度
      "type": "bot_command"                  // 实体类型,这里表示是一个机器人命令
    }
  }
}
总结 
- 不用服务器就可以部署
 - 官方Bot永远不会封号(不像某q
 - 稳定运行,永远不会掉线(不像某q
 - 有官方文档,实现超多功能