制作一个电报萝卜头(机器人)【实战篇】

基于Google Apps Script、telegram-Bot api开发telegram bot脚本

来自:Pixiv 画师(Aencore)

 

 

  • 功能bot的代码详解
  • 接入第三方API的聊天bot

功能bot的代码详解

最简单的栗子

当用户发出”/start”,萝卜头就会回一个”开始吧(^▽^)”,基本都是固定格式不解释。

function doPost(e){
            //来源消息&指令
            var body = JSON.parse(e.postData.contents);
            //执行回复响应主函数
            var payload = preparePayload(body);
            //TG数据封装与转换
            var data = {
                "method": "post",
                "payload": payload,
            }
     UrlFetchApp.fetch("https://api.telegram.org/bot1204445809:AAGOBkA0Fr6V9scrmKFm8rWN0oa90LH1BaM/", data);
}
function preparePayload(body){
	var payload;
	if (body.message) {
		body.message.chat.id = body.message.chat.id + '';
		//开始
		if(body.message.text=="/start"){
			payload = {
				"method": "sendMessage",
				"chat_id": body.message.chat.id,
				"text": "开始吧(*^▽^*)",
			}
		}
         }
	return payload;
}

当我们向bot发送一个指令或消息后,bot根据代码对收到的数据做出回应。而bot收到的数据格式分为一下两类

bot收到的一般消息的json格式

bot收到的callback数据的json格式

这里可以清晰的看到每个数据从里面取,由于数据有很多层级特别是callback_query,所以bot回应的消息改成json格式。结构如下:

//回复数据结构
            var data = {
                "method": "post",
                "payload": JSON.stringify(payload),
                "contentType": 'application/json',
            }
//主函数
function preparePayload(body){
	if (body.message) {
        ......
        }
	if (body.callback_query) {
        ......
        }
	return payload;
}

内联键盘

前面提到了callback这种数据回应,它不能通过一般的文字、声音、图片等消息调用,主要是通过telegram的键盘类型去回调。这里主要讲一下内联键盘(InlineKeyboard),其他键盘“参考地址”。

怎么写一个键盘?下面是一个键盘的栗子

	var inlineKB_menu= [
			  [{text: '网站服务',
				  callback_data: '/website'}],
			  [{text: '访问谷歌搜索',
				  url: 'https://google.com'}],				  
	];	

键盘由列表的格式编写,键盘中的每个元素对应一个按钮,按钮的表现效果分为url和callback_data。点击url的按钮则会跳转浏览器进入网站,点击callback_data则会调用另一个消息(可以是任意类型的,文字、语音、图片、键盘等),可以kan作是函数,一般地编写成”/xxx”的形式方便区别。

//bot向用户发一个键盘
		 if(body.message.text=="/list"){
			payload={
				"method": "sendMessage",
				"chat_id": body.message.chat.id,
				"text": "菜单",
				"reply_markup": {
				  "inline_keyboard": inlineKB_menu,
				}
			  }
		}

逻辑很简单,当用户向bot发送/list指令,bot就会向用户发送这个键盘,method、chat_id、reply_markup.inline_keyboard都是必须参数。

//通过点击第一个键盘的callback类型按钮,回调另一个键盘
		if(body.callback_query.data == "/website") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "网站服务",
			  "reply_markup": {
				"inline_keyboard": inlineKB_website,
			  }					  
			}
		}

callback的所有数据都是通过body.callback_query.data来获取,不清楚可以看一下上面”callback数据的json格式”那张图。

只要有需求,可以一直回调下去,当然你会说如果有很多层键盘全部发送会很乱。这里也可以稍作调整,这里发送第二个键盘用了sendMessage这个方法,可以改为”editMessageText”,它的作用是更新键盘,即用第二个键盘覆盖第一个键盘。

功能萝卜头

下面附上我自己群组使用的一个日常萝卜头,关键的隐私信息已经屏蔽。仅供参考

function doPost(e){
            //来源消息&指令
            var body = JSON.parse(e.postData.contents);
            //执行回复响应主函数
            var payload = preparePayload(body);
            //TG数据封装与转换
            var data = {
                "method": "post",
                "payload": JSON.stringify(payload),
                "contentType": 'application/json',
            }
            UrlFetchApp.fetch("https://api.telegram.org/bot1204445809:AAGOBkA0Fr6V9scrmKFm8rWugok90LH1BaM/", data);
}
//主函数
function preparePayload(body){
	var payload;
	var unknown_msg=['小萝卜头我有很多的问号???','我怎么听不懂地球人说','需要我复读吗','聊天请找我的妹妹 @w_002_bot','emmmmmm','你是不是想套路我','没有这个指令','你继续','说人话','你要是无聊可以给我发表情,我是专业的复读姬','拜拜了您咧'
	];
	//嵌入式键盘
	//隐藏功能
	var inlineKB_hide= [
			  [{text: '23',callback_data: '/23'},{text: '64',callback_data: '/64'},{text: '50',callback_data: '/50'}],
			  [{text: '32',callback_data: '/32'},{text: '71',callback_data: '/71'},{text: '86',callback_data: '/86'}],
			  [{text: '47',callback_data: '/47'},{text: '74',callback_data: '/74'},{text: '11',callback_data: '/11h'}],
			];
	var inlineKB_hide2= [
			  [{text: '23',callback_data: '/23'},{text: '64',callback_data: '/64'},{text: '50',callback_data: '/50hh'}],
			  [{text: '32',callback_data: '/32'},{text: '71',callback_data: '/71'},{text: '86',callback_data: '/86'}],
			  [{text: '47',callback_data: '/47'},{text: '74',callback_data: '/74'},{text: '11',callback_data: '/11'}],
			];
		//菜单
	var inlineKB_Smenu= [
			  [{text: '群组助手',
				  callback_data: '/helper'}],
			  [{text: '搜索:打开方式',
				  callback_data: '/searcher'}],
			  [{text: 'TG群组与Bot推荐',
				  callback_data: '/Referrer'}],
			  [{text: '其他',
			  callback_data: '/other'}],
			];
		//菜单>群组助手
	var inlineKB_helper= [
			  [{text: '网站服务',
				  callback_data: '/website'}],
			  [{text: '群组服务',
				  callback_data: '/group'}],
			  [{text: '扩展功能',
				  callback_data: '/expand'}],					  
	];	
		//菜单>其他
	var inlineKB_other= [
			  [{text: '以TG联系管理员',
				  url: 'https://t.me/JIEMO9527'}],
			  [{text: '以QQ联系管理员',
				  url: 'http://wpa.qq.com/msgrd?v=3&uin=2569995914&site=qq&menu=yes'}],
			  [{text: 'Powered by Gscript',
				  url: 'https://script.google.com'}],
			  [{text: 'Powered by telegram-Bot Api',
				  url: 'https://core.telegram.org/bots/api'}],	

	];	
		//菜单>群组助手>网站服务
	var inlineKB_helper_Website= [
			  [{text: 'kod网盘(A组)',url: 'jiemo-sup2020.top'},
			  {text: 'kod网盘(B组)',url: 'jiemo-vi.top'}],
			  [{text: 'Aria下载(A组)',url: 'jiemo-sup2020.top:6080'},
			  {text: 'Aria下载(B组)',url: 'jiemo-vi.top:6080'}],
			  [{text: 'Navi网址导航',url: 'https://www.jie-navi.xyz'},
			  {text: '影视全搜索',url: 'v.eyunzhu.com'}],
			  [{text: '捐赠与付款①',url: 'https://www.jie-navi.xyz/donate/'},
			  {text: '捐赠与付款②',url: 'http://blog.jie02.top:66:999'}],				  
			];
		//菜单>群组助手>群组服务					
	var inlineKB_helper_Group= [
			  [{text: '公共订阅[正常]',callback_data: '/TST_public'}],
			  [{text: '私人订阅[暂停服务]',callback_data: '/TST_private'}],
			  [{text: '战时订阅[即将启用]',callback_data: '/TST_wartime'}],
			  [{text: 'MTProxy代理[正常]',callback_data: '/mtproxy'}],
			  [{text: 'TG公告索引',callback_data: '/AN_index'}],
		  
	];
		//菜单>群组助手>群组服务>TG公告索引					
	var inlineKB_helper_ANindex= [
			  [{text: '更改TG语言包为中文',url: 'https://t.me/tele_zh_cn'}],
			  [{text: '【v2ray内核更新】4.23.1 ',url: 'https://t.me/c/1424846503/25'}],
			  [{text: '【v2ray外核更新】3.18 ',url: 'https://t.me/c/1424846503/32'}],
			  [{text: '客户端资源下载',url: 'https://pmjs-my.sharepoint.com/:f:/g/personal/jiemo_my365_tw/Eqx_PU0jCbFFveqFvdSZau0BzaCi6KQSwWEltIYppPHzzA?e=XU3lSD'}],
			  [{text: 'DIYP(安卓看电视频道的App)',url: 'https://t.me/c/1424846503/11'}],
			  [{text: '使用级别',url: 'https://t.me/c/1424846503/35'}],
			  [{text: '下一步计划',url: 'https://t.me/c/1424846503/38'}],
			  [{text: '查看所有公告',url: 'https://t.me/joinchat/AAAAAFTtbqdeRO7PMyUHqA'}],
		  
	];
		//菜单>群组助手>扩展功能
	var inlineKB_helper_Expand= [
			  [{text: '谷歌硬盘+1PB',url: 'http://td.fastio.me'},],
			  [{text: '视频代下(爬取)',callback_data: '/download_video'},],
			  [{text: '还有什么功能呢,我再想想',callback_data: '/qiao'},],

	];
	//菜单>搜索:打开方式
	var inlineKB_openwith= [
			  [{text: '搜索Github',callback_data: '/ow_git'},],
			  [{text: '搜索Vsearch',callback_data: '/ow_vsearch'},],
			  [{text: '搜索Pixiv',callback_data: '/ow_pixiv'},],



	];
	//菜单>TG群组与Bot推荐
	var inlineKB_recommended= [
			  [{text: '群组频道推荐',callback_data: '/rcm_chat'},],
			  [{text: '萝卜头推荐',callback_data: '/rcm_bot'},],


	];
		//菜单>TG群组与Bot推荐>群组频道推荐
	var inlineKB_recommended_recchat= [
			  [{text: 'GIF群聚地',url: 'https://t.me/GIFgroupTW'},],
			  [{text: '表情包收集器 😆😏😈',url: 'https://t.me/stickercoll'},],
			  [{text: 'Project V(使用与反馈)',url: 'https://t.me/projectv2ray'},],
			  [{text: '频道🥇福利资源 | 薅羊毛·省钱中心🅥',url: 'https://t.me/Pojieapp'},],
			  [{text: '52破解信息',url: 'https://t.me/wuaipojie'},],
			  [{text: '临时短信接收',url: 'https://t.me/sms24_me'},],
			  [{text: '[更多]',callback_data: '/morechat'},],
	];
		//菜单>TG群组与Bot推荐>Bot推荐
	var inlineKB_recommended_recbot= [
			  [{text: '宛雪-聊天萝卜头',url: 'https://t.me/wx_002_bot'},],
			  [{text: '临时邮箱',url: 'https://t.me/DropmailBot'},],
			  [{text: '点歌',url: 'https://t.me/ChinoNyanBot'},],
			  [{text: '天气',url: 'https://t.me/weatherbot'},],
			  [{text: '图片转ascii构成',url: 'https://t.me/asciiart_bot'},],
			  [{text: 'telegram proxy server',url: 'https://t.me/MTProxybot'},],
			  [{text: 'Youtube视频分享/搜索/订阅通知',url: 'https://t.me/youtube'},],
			  [{text: 'Youtube视频搜索',url: 'https://t.me/vid'},],
			  [{text: '生成网页留言本',url: 'https://t.me/CommentsBot'},],
			  [{text: '生成投票',url: 'https://t.me/vote'},],
			  [{text: '王境泽生成器',url: 'https://t.me/wangjingze_bot'},],
			  [{text: '所有萝卜头的爸爸',url: 'https://t.me/BotFather'},],
			  [{text: 'TG文件转存',url: 'https://t.me/GetPublicLinkBot'},],
			  [{text: '文本转语音(已死)',url: 'https://t.me/txt2speechbot'},],
			  [{text: '中文基维百科',url: 'https://t.me/WikipediaLinkBot'},],
			  [{text: '安卓应用下载',url: 'https://t.me/apkdl_bot'},],
			  [{text: '检测设备温度内存ip',url: 'https://t.me/UserBot'},],
			  [{text: '看图识动漫(准确率不高)',url: 'https://t.me/WhatAnimeBot'},],
			  [{text: '短网址服务',url: 'https://t.me/gohubioBot'},],
			  [{text: '文字转图形',url: 'https://t.me/big_text_bot'},],
			  [{text: '文件/网址病毒检查(Dr.Web公司)',url: 'https://t.me/drwebbot'},],
			  [{text: '中文頻道群組搜索',url: 'https://t.me/hao1234bot'},],

	];
	//message		
	if (body.message) {
		body.message.chat.id = body.message.chat.id + '';
		//开始
		if(body.message.text=="/start"){
			payload = {
				"method": "sendMessage",
				"chat_id": body.message.chat.id,
				"text": "开始吧(*^▽^*)",
			}
		}
		//菜单
		else if(body.message.text=="/list"){
			payload={
				"method": "sendMessage",
				"chat_id": body.message.chat.id,
				"text": "————————功能菜单列表————————",
				"reply_markup": {
				  "inline_keyboard": inlineKB_Smenu,
				}
			  }
		}
		//隐藏功能
		else if(body.message.text=="/no_9527"){
			payload={
				"method": "sendMessage",
				"chat_id": body.message.chat.id,
				"text": "——————隐藏功能什么的 是存在的,提示:2步——————",
				"reply_markup": {
				  "inline_keyboard": inlineKB_hide,
				}
			  }
		}
		//打开方式-g
		else if(body.message.text.indexOf("g")===0){
			payload={
				"method": "sendMessage",
				"chat_id": body.message.chat.id,
				"text": "https://github.com/search?q="+body.message.text.split("g ")[1].replace(/\s/ig,''),
				
			  }
		}
		//打开方式-v
		else if(body.message.text.indexOf("v")===0){
			payload={
				"method": "sendMessage",
				"chat_id": body.message.chat.id,
				"text": "http://v.eyunzhu.com/search?kw="+body.message.text.split("v ")[1].replace(/\s/ig,''),
				
			  }
		}
		//打开方式-p
		else if(body.message.text.indexOf("p")===0){
			payload={
				"method": "sendMessage",
				"chat_id": body.message.chat.id,
				"text": "https://www.pixiv.net/tags/"+body.message.text.split("p ")[1].replace(/\s/ig,'')+"/artworks?s_mode=s_tag",
				
			  }
		}
		//查询私人订阅-密码为空
		else if(body.message.text=="/tst_private"){
			payload={
				"method": "sendMessage",
				"chat_id": body.message.chat.id,
				"text": body.message.chat.username+"你还没输入密码,大傻子!",
			  }
		}
		//查询私人订阅——涉及服务安全相关代码删除……
		
		//贴图
		else if (body.message.sticker){
			payload = {
				"method": "sendSticker",
				"chat_id": body.message.chat.id,
				"sticker": body.message.sticker.file_id
			}
		}
		//图片
		else if (body.message.photo){
			array = body.message.photo;
			text = array[1];
			payload = {
				"method": "sendPhoto",
				"chat_id": body.message.chat.id,
				"photo": text.file_id
			}
		}
		//未知指令
		else {
			payload = {
				"method": "sendMessage",
				"chat_id": body.message.chat.id,
				"text": unknown_msg[Math.floor(Math.random() * unknown_msg.length)],
			}
		}
	}

	//callback
	if (body.callback_query) {
		
		//目录:菜单-群组助手
		if(body.callback_query.data == "/helper") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "————————Menu>群组助手————————",
			  "reply_markup": {
				"inline_keyboard": inlineKB_helper,
			  }
			}
		}
		//目录:菜单-其他
		if(body.callback_query.data == "/other") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "————————Menu>其他————————",
			  "reply_markup": {
				"inline_keyboard": inlineKB_other,
			  }
			}
		}
		//目录:菜单-群组助手-网站服务
		if(body.callback_query.data == "/website") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "————————Menu>群组助手>网站服务————————",
			  "reply_markup": {
				"inline_keyboard": inlineKB_helper_Website,
			  }
			}
		}
		//目录:菜单-群组助手-群组服务
		if(body.callback_query.data == "/group") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "————————Menu>群组助手>群组服务————————",
			  "reply_markup": {
				"inline_keyboard": inlineKB_helper_Group,
			  }
			}
		}
		//目录:菜单-群组助手-群组服务-公共订阅
		if(body.callback_query.data == "/TST_public") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "公共订阅状态可用\n"+"涉及服务安全相关代码删除……",
			}
		}
		//目录:菜单-群组助手-群组服务-私人订阅
		if(body.callback_query.data == "/TST_private") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "请使用指令查询’/tst_private+[查询密码]‘",
			}
		}
		//目录:菜单-群组助手-群组服务-战时订阅
		if(body.callback_query.data == "/TST_wartime") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "战时订阅状态不可用\n"+"涉及服务安全相关代码删除……",
			}
		}
		//目录:菜单-群组助手-群组服务-MTProxy
		if(body.callback_query.data == "/mtproxy") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "MTProxy状态可用\n"+"涉及服务安全相关代码删除……",
			}
		}
		//目录:菜单-群组助手-群组服务-TG公告索引
		if(body.callback_query.data == "/AN_index") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "——————Menu>群组助手>群组服务>TG公告索引——————",
			  "reply_markup": {
				"inline_keyboard": inlineKB_helper_ANindex,
			  }					  
			}
		}				
		//目录:菜单-群组助手-扩展功能
		if(body.callback_query.data == "/expand") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "————————Menu>群组助手>扩展功能————————",
			  "reply_markup": {
				"inline_keyboard": inlineKB_helper_Expand,
			  }
			}
		}
		//目录:菜单-群组助手-扩展功能-视频代下(爬取)
		if(body.callback_query.data == "/download_video") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "代下的视频保存于kod网盘共享目录gdrive下,点击下链接完成需求的填写\n"+"涉及服务安全相关代码删除……",

			}
		}
		//目录:菜单-群组助手-扩展功能-我再想想
		if(body.callback_query.data == "/qiao") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "让我再想想!",
			}
		}
		//菜单-搜索:打开方式
		if(body.callback_query.data == "/searcher") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "————————Menu>搜索:打开方式————————",
			  "reply_markup": {
				"inline_keyboard": inlineKB_openwith,
			  }
			}
		}
		//菜单-搜索:打开方式-g
		if(body.callback_query.data == "/ow_git") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "以命令 'g 关键词'进行Github检索:",  
			}
		}
		//菜单-搜索:打开方式-v
		if(body.callback_query.data == "/ow_vsearch") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "以命令 'v 关键词'进行Vsearch检索:",

			}
			
		}
		//菜单-搜索:打开方式-p
		if(body.callback_query.data == "/ow_pixiv") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "以命令 'p 关键词'进行Pixiv检索:",

			  
			}
		}
		//菜单-TG群组与Bot推荐
		if(body.callback_query.data == "/Referrer") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "——————Menu>TG群组频道与Bot推荐——————",
			  "reply_markup": {
				"inline_keyboard": inlineKB_recommended,
			  }					  
			}
		}	
		//菜单-TG群组与Bot推荐-群组频道推荐
		if(body.callback_query.data == "/rcm_chat") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "————Menu>TG群组频道与Bot推荐>群组频道推荐————",
			  "reply_markup": {
				"inline_keyboard": inlineKB_recommended_recchat,
			  }					  
			}
		}
		if(body.callback_query.data == "/morechat") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "请使用 @hao1234bot 搜索更多你感兴趣的群组/频道",
	  
			}
		}		
		//菜单-TG群组与Bot推荐-bot推荐
		if(body.callback_query.data == "/rcm_bot") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "——————Menu>TG群组频道与Bot推荐>bot推荐——————",
			  "reply_markup": {
				"inline_keyboard": inlineKB_recommended_recbot,
			  }					  
			}
		}
		//目录:隐藏功能第一层的正确选择
		if(body.callback_query.data == "/11h") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "——————隐藏功能什么的 是存在的,提示:2步——————",
		  "reply_markup": {
				"inline_keyboard": inlineKB_hide2,
			  }
			}
		}
		//目录:隐藏功能第一层的错误选择
		if(body.callback_query.data =="/23"||body.callback_query.data =="/64"||body.callback_query.data === "/32"||body.callback_query.data === "/50"||body.callback_query.data === "/71"||body.callback_query.data === "/86"||body.callback_query.data === "/47"||body.callback_query.data === "/74"||body.callback_query.data === "/11"){
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "——————隐藏功能什么的 是存在的,提示:2步——————",
		  "reply_markup": {
				"inline_keyboard": inlineKB_hide,
			  }
			}
		}
		//目录:隐藏功能第二层
		if(body.callback_query.data == "/50hh") {
			payload={
			  "method": "sendMessage",
			  "chat_id": body.callback_query.message.chat.id,
			  "message_id": body.callback_query.message.message_id,
			  "text": "获得游戏许可 请转至游戏萝卜头 @w_666_bot",
			}
		}

		
	}
	return payload
}

接入第三方API的聊天bot

上一期提到telegram bot可以接入第三方的API,这里做一个简单的示例(将图灵机器人接入telegram bot),其实就是没写bot的消息处理,转给图灵机器人处理。

Gscript代码如下:

function doPost(e) {
  var body = JSON.parse(e.postData.contents);
  if (!checkIsMyMessage(body)){
    return;
  }
 
  if (body.message && body.message.chat){
    body.message.chat.id = body.message.chat.id + '';
  }
 
  var payload = tulinBotPayload(body);
  var payloads;
 
  if (Array.isArray(payload)){
    payloads = payload;
  } else {
    payloads = [payload]
  }
 
  for (var i = 0; i < payloads.length; i++){
    payload = payloads[i];
    if (payload){
      var res = PostTelegram(payload);
    }
  }
 
}
function tulinBotPayload(body) {
  var payload;
  var chatId = body.message.chat.id;
  payload = {
    "method": "sendMessage",
    "chat_id": chatId,
    "text": "",
    "disable_web_page_preview": true,
    "reply_to_message_id": body.message.message_id,
  };
 
  var tulinReq = {
    "reqType": 0,
      "perception": {
          "inputText": {
              // tulinjiqirenbot 改成你自己机器人的名字
              "text": body.message.text.replace("@wx_002_bot", "")
          }
          
      },
      "userInfo": {
        // 改成你自己的图灵机器人的apikey 和 userId
          "apiKey": "2aa94208166e4d4eb36e97a03c3f877d",
          "userId": "621138"
      }
  };
 
 
  var data = {
    'contentType': 'application/json',
    "method": "post",
    "payload": JSON.stringify(tulinReq)
  };
 
  var response = UrlFetchApp.fetch("http://openapi.tuling123.com/openapi/api/v2", data);
  var res = JSON.parse(response);
 
  if (res.results && res.results[0].values && res.results[0].values.text) {
    payload.text = res.results[0].values.text;
  }
  return payload;
}
function isPrivate(body) {
  var share =  getShareObject(body);
  var chat = share.chat;
  if (chat.type === "private") {
    return true;
  }
  return false;
}
function PostTelegram(payload) {
  var data = {
    'contentType': 'application/json',
    "method": "post",
    "payload": JSON.stringify(payload)
  };
 
  // 改成你自己机器人的 API token
  var response = UrlFetchApp.fetch("https://api.telegram.org/bot1172292378:AAGVEBOIYU3fXeDz9rI9iYXsjDp4YElDLho/", data);
  var res = JSON.parse(response);
  return res;
}
function checkIsMyMessage(body){
  var text = body.message.text;
 
  if (isPrivate(body)){
    return true;
  }
 
  if (body.message.reply_to_message) {
//这里的ID要改成你自己机器人的ID, 之前视频里忘讲了
    if (body.message.reply_to_message.from.id == 1172292378) {
      return true;
    }
  }
 
// 如果找不到机器人的ID, 可以用以下这段代码代替, 换成你自己机器人的名字
// if (body.message.reply_to_message) {
//  if (body.message.reply_to_message.from.username == "wx_002_bot") {
//    return true;
//  }
// }
 
  if (text) {
    var paras = text.split(" ");
    if (paras[0] && paras[0].indexOf("@") >= 0){
      // tulinjiqirenbot 改成你自己机器人的名字, 全部小写
      if  (paras[0].toLowerCase().indexOf("wx_002_bot") >= 0){
        return true;
      }
      return false;
    }
  }
  return false;
}
 
function getShareObject(body) {
  var payload;
  var from;
  var chat;
  var messageId;
  var callback_query_id;
 
  // use editMessage method instead if it's a callback 
  if (body.callback_query) {
    chat = body.callback_query.message.chat;
    chat.id = chat.id + "";
    messageId = body.callback_query.message.message_id;
    from = body.callback_query.from;
    callback_query_id = body.callback_query.id;
    payload = {
      "method": "editMessageText",
      "chat_id": chat.id,
      "message_id": messageId,
      "text": "",
      "parse_mode": "markdown",
      "disable_web_page_preview": false,
    };
  } else {
    from = body.message.from;
    chat = body.message.chat;
    chat.id = chat.id + "";
    messageId = body.message.message_id;
    payload = {
      "method": "sendMessage",
      "chat_id": chat.id,
      "text": "",
      "parse_mode": "markdown",
      "disable_web_page_preview": true,
      "reply_to_message_id": messageId,
    };
 
  }
 
  var share = {};
  share.payload = payload;
  share.from = from;
  share.chat = chat;
  share.messageId = messageId;
  share.callback_query_id = callback_query_id;
 
  return share;
}

代码中有几处需要修改,图灵机器人的apikey和userId需要去图灵机器人官网注册,创建一个机器人。

而telegram bot的id再提一下是token的前半截,用户名是@xxx

发表回复