本视频是Telegram Bot 机器人编程系列的第十集。 本集介绍如何将Telegram 机器人和其它的服务集成, 本集用Youtube Data API 作为示例
相关的代码请翻到下面
下期预告:
Telegram Bot 高级应用 -删除消息,置顶消息,禁用用户,踢出用户等[第十一集]
-~-~~-~~~-~~-~-
本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 点击进入我的频道: goo.gl/5tyxcf
🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz
🔷 Twitter: https://twitter.com/fennng
觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-
代码.gs
function debugCode(){ debug(); } function doGet(e){ return HtmlService.createHtmlOutput("Hello World!! No, this link should be hidden!!!"); // return HtmlService.createHtmlOutputFromFile('Index'); } function doPost(e){ var body = JSON.parse(e.postData.contents); // 没有数据库的小伙伴可以删除以下这行 mongo.insert(logColl, body); var payload = preparePayload(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 postTelegram(payload) { var data = { 'contentType': 'application/json', "method": "post", "payload": JSON.stringify(payload) } // 没有数据库的小伙伴可以删除以下这行 mongo.insert("to-telegram", payload); var response = UrlFetchApp.fetch("https://api.telegram.org/bot682267360:AAHmjSil8oylavD2pENLLpcMU1svaD7mVeA/", data); var res = JSON.parse(response); // 没有数据库的小伙伴可以删除以下这行 mongo.insert("telegram-response", res); return res; } function getName(user) { var name = user.first_name; if (user.last_name) { name += " " + user.last_name; } return name; } function escapeMarkDown(toEscapeMsg) { var escapedMsg = toEscapeMsg .replace(/_/g, "\\_") .replace(/\*/g, "\\*") .replace(/\[/g, "\\[") .replace(/`/g, "\\`"); return escapedMsg; } function getMentionName(user) { var username = user.username; var mentionName = ""; var name = getName(user); if (!name) { name = "神秘人"; } // if (!username) { mentionName = getMarkDownUserUrl(escapeMarkDown(name), user.id); // } else { // mentionName = "[" + escapeMarkDown(name) + "](@" + escapeMarkDown(username) + ")"; // } return mentionName; } function getMarkDownUserUrl(userName, userId) { return "[" + userName + "](tg://user?id=" + userId + ")"; } function getLastWelcomeMessage(){ var regex = "欢迎加入本群"; var regexSearch = { "$regex": regex, "$options": 'i' }; var searchString = {"result.text": regexSearch}; var q = JSON.stringify(searchString); var sortObject = { "result.date": -1 }; var s = JSON.stringify(sortObject); var httpQuery = "q=" + q + "&s=" + s + "&l=1"; var lastWelcomeMessage = mongo.get("telegram-response", httpQuery); return lastWelcomeMessage; } function preparePayload(body){ var payload; if (body.message) { body.message.chat.id = body.message.chat.id + ''; } if (body.callback_query) { payload = { "method": "sendMessage", "chat_id": body.callback_query.message.chat.id, "text": "这是一个 callback", "parse_mode": "Markdown", "disable_web_page_preview": true, }; if(body.callback_query.data.indexOf("/help") === 0){ payload.text += ": " + body.callback_query.data; } if(body.callback_query.data.indexOf("nihao") === 0){ payload.text = "你好"; } if(body.callback_query.data.indexOf("update") === 0){ payload = { "method": "editMessageText", "chat_id": body.callback_query.message.chat.id, "message_id": body.callback_query.message.message_id, "text": "", "parse_mode": "markdown", "disable_web_page_preview": false, }; payload.text = "原消息被更新了"; } return payload; } if (body.message.new_chat_member) { payload = { "method": "sendMessage", "chat_id": body.message.chat.id, "text": "你好, 欢迎加入本群", "parse_mode": "Markdown", "disable_web_page_preview": true, } payload.text = "你好!" + getMentionName(body.message.new_chat_member) + ", 欢迎加入本群"; var payloads = []; payloads.push(payload); var lastWelcomeMessage = getLastWelcomeMessage(); if (lastWelcomeMessage.length == 1){ var messageId = lastWelcomeMessage[0].result.message_id; var payload2 = { "method": "deleteMessage", "message_id": messageId, "chat_id": body.message.chat.id }; payloads.push(payload2); } return payloads; } if (body.message.left_chat_member) { payload = { "method": "sendMessage", "chat_id": body.message.chat.id, "text": "你好, 欢迎加入本群", "parse_mode": "Markdown", "disable_web_page_preview": true, } payload.text = getMentionName(body.message.left_chat_member) + "君, 一路走好!"; return payload; } if (body.message.pinned_message) { payload = { "method": "sendMessage", "chat_id": body.message.chat.id, "text": "你好, 欢迎加入本群", "parse_mode": "Markdown", "disable_web_page_preview": true, } var whoPinned = getName(body.message.from); var whoOwned = getName(body.message.pinned_message.from); payload.text = whoPinned + "置顶了消息:\n\n" + body.message.pinned_message.text + "\n\n" + "本BOT代表" + whoOwned + "感谢您" ; return payload; } if (body.message.text){ //谢谢 kba977 指出这个错误 var origParas = body.message.text.trim().split(" "); origParas = origParas.filter(function(origPara){ if (origPara){ return true; } }); body.message.text = body.message.text.toLowerCase(); body.message.text = body.message.text.replace(/@temptestbot2/g, ''); var paras = body.message.text.trim().split(" "); // remove empty strings paras = paras.filter(function(para){ if (para){ return true; } }); payload = { "method": "sendMessage", "chat_id": body.message.chat.id, "text": "你好, 欢迎使用本机器人, 本机器人现在只认识颜色。", "parse_mode": "Markdown", "disable_web_page_preview": true, } if(body.message.text.indexOf("/removekeyboard") === 0){ var replyKeyboardRemove = { remove_keyboard: true, selective: false }; payload.reply_markup = replyKeyboardRemove; return payload; } if(body.message.text.indexOf("/help") === 0){ var mentionName = getMentionName(body.message.from); payload.text = "您好!" + mentionName + "! "; payload.text += "欢迎使用本机器人, 本机器人现在只认识颜色。"; var command9 = [ "/colors", "/list", ]; var replyKeyboardMarkup = {}; replyKeyboardMarkup.keyboard = []; replyKeyboardMarkup.resize_keyboard = false; replyKeyboardMarkup.one_time_keyboard = true; replyKeyboardMarkup.selective = true; var count = 0; for (var i = 0; i < command9.length / 3; i++) { var keyboardRow = []; for (var j = 0; j < 3; j++) { var keyboardButton = { text: command9[i * 3 + j], }; count++; keyboardRow.push(keyboardButton); if (count >= command9.length) { break; } } replyKeyboardMarkup.keyboard.push(keyboardRow); } payload.reply_markup = replyKeyboardMarkup; return payload; } if(body.message.text.indexOf("/colors") === 0){ payload.text = "红\n黄\n蓝"; return payload; } if(body.message.text.indexOf("/searchvideo") === 0){ if (paras[1]){ var videoId = origParas[1]; var videos = videosListById('snippet,contentDetails,statistics', {'id': videoId}); var video = videos.items[0]; payload.text = "标题: " + video.snippet.title + "\n"; return payload; } payload.text = "请提供视频ID"; return payload; } if(body.message.text.indexOf("/list") === 0){ if (paras[1]){ switch (paras[1].toLowerCase()){ case "people": if (paras[2]){ if ("JS神技能".toLowerCase().indexOf(paras[2]) >= 0){ payload.text = "JS神技能 - https://www.youtube.com/channel/UC6tPP3jOTKgjqfDgqMsaG4g"; } if ("悟空的日常".toLowerCase().indexOf(paras[2]) >= 0){ payload.text = "悟空的日常 - https://www.youtube.com/channel/UCii04BCvYIdQvshrdNDAcww"; } if ("YuFeng Deng".toLowerCase().indexOf(paras[2]) >= 0){ payload.text = "YuFeng Deng - https://www.youtube.com/channel/UCG6xoef2xU86hnrCsS5m5Cw"; } } else { payload.text = "JS神技能\n" + "悟空的日常\n" + "YuFeng Deng\n"; return payload; } break; default: payload.text = "红\n黄\n蓝"; break; } return payload; } else { payload.text = "*JS神技能*\n" + "[悟空的日常](https://www.youtube.com/channel/UCii04BCvYIdQvshrdNDAcww)\n" + "[*YuFeng Deng*](https://www.youtube.com/channel/UCG6xoef2xU86hnrCsS5m5Cw)\n" + "_YuFeng Deng_\n" + "`01|" + "UCii04BCvYIdQvshrdNDAcww" + " | `\n" + "`02|" + "UCG6xoef2xU86hnrCsS5m5Cw" + " | `\n" + "```javascript\n" + 'payload = {\n' + ' "method": "sendMessage",\n' + ' "chat_id": body.message.chat.id,\n' + ' "text": body.message.text,\n' + '}' + "```" ; var inlineKeyboardMarkup = {}; inlineKeyboardMarkup.inline_keyboard = []; var keyboardRow = []; var keyboardButton1 = { text: "Help", callback_data: "/help" }; var keyboardButton2 = { text: "按钮2", callback_data: "nihao" }; var keyboardRow2 = []; var keyboardButton3 = { text: "升级原消息", callback_data: "update" }; var keyboardButton4 = { text: "按钮4", url: "https://www.google.com" }; keyboardRow.push(keyboardButton1); keyboardRow.push(keyboardButton2); keyboardRow2.push(keyboardButton3); keyboardRow2.push(keyboardButton4); inlineKeyboardMarkup.inline_keyboard.push(keyboardRow); inlineKeyboardMarkup.inline_keyboard.push(keyboardRow2); payload.reply_markup = inlineKeyboardMarkup; var payloads = []; var payload2 = {}; var payloadStr = JSON.stringify(payload); payload2 = JSON.parse(payloadStr); payloads.push(payload); // payloads.push(payload2); return payloads; } } payload = { "method": "sendMessage", "chat_id": body.message.chat.id, "text": body.message.text, } } 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": "Try other stuff" } } return payload }
Mlab.gs
var baseUrl = "https://api.mlab.com/api/1/"; var dbUrl = baseUrl + "databases/mongo/"; var collectionUrl = dbUrl + "collections/"; var logColl = "logs"; var mongo = {}; function debugMLab(){ debug(); } function testMLab(){ var testObject = {"name": "峰哥"}; mongo.insert(logColl, testObject); } function testMLab2() { var query = {"message.from.id": 539065210}; var q = JSON.stringify(query); var a = mongo.get(logColl, "q=" + q); var b = a[0]; Logger.log(a); } function testMLab3() { mongo.put(logColl, null, []); } mongo.insert = function(collection, data) { var db = apendAPI(collectionUrl + collection); var option = getInsertOption(data); Logger.log(data); var response = UrlFetchApp.fetch(db, option); // Logger.log(response); Logger.log(data); } mongo.update = function(collection, query, set) { var db = apendAPI(collectionUrl + collection); db += "&" + query + "&m=true&u=true"; var option = getPutOption(set); UrlFetchApp.fetch(db, option); } // Warning, put will override the whole collectoin, put empty array data will clear the whole collection mongo.put = function(collection, query, data) { var db = apendAPI(collectionUrl + collection); if (query){ db += "&" + query; } var option = getPutOption(data); var url = encodeURI(db); UrlFetchApp.fetch(url, option); } mongo.get = function(collection, query) { var db = apendAPI(collectionUrl + collection); if (query){ db += "&" + query; } var option = getGetOption(); var response = UrlFetchApp.fetch(encodeURI(db), option); return JSON.parse(response); } function apendAPI(url){ return url + "?apiKey=WULdZqaqxqikzrGePcLC5uWBeyvGZqBp"; } function getInsertOption(data){ var option = { "method": "post", 'contentType': 'application/json', // "muteHttpExceptions": true, "payload": JSON.stringify(data) } return option; } function getPutOption(data){ var option = { "method": "put", 'contentType': 'application/json', "payload": JSON.stringify(data) } return option; } function getGetOption(){ var option = { "method": "get", } return option; }
Youtube.gs
/****** START BOILERPLATE CODE ******/ // <b>Note:</b> Apps Script automatically requests authorization // based on the API's used in the code. // Build an object from an object containing properties as key-value pairs function createResource(properties) { var res = {}; var normalizedProps = {}; for (var p in properties) { var value = properties[p]; if (p.substr(-2, 2) == '[]' && value) { var adjustedName = p.replace('[]', ''); normalizedProps[adjustedName] = value.split(','); } else { normalizedProps[p] = value; } } for (var p in normalizedProps) { if (normalizedProps.hasOwnProperty(p) && normalizedProps[p]) { var propArray = p.split('.'); var ref = res; for (var pa = 0; pa < propArray.length; pa++) { var key = propArray[pa]; if (pa == propArray.length - 1) { ref[key] = normalizedProps[p]; } else { ref = ref[key] = ref[key] || {}; } } }; } return res; } // Remove parameters that don't have values before sending API request function removeEmptyParams(params) { for (var p in params) { if (!params[p] || params[p] == 'undefined') { delete params[p]; } } return params; } // Sample Apps Script code for printing API response data function printResults(response) { Logger.log(response); } /***** END BOILERPLATE CODE *****/ // Sample appsscript code for videos.list function videosListById(part, params) { params = removeEmptyParams(params); // See full sample for function var response = YouTube.Videos.list(part, params); printResults(response); return response; } function TestYoutube() { videosListById('snippet,contentDetails,statistics', {'id': 'Ks-_Mh1QhMc'}); }
Test.gs
var testList = '{"update_id":427274836,"message":{"message_id":173,"from":{"id":539065210,"is_bot":false,"first_name":"Yufeng Deng","last_name":"峰哥","username":"fennng","language_code":"en-US"},"chat":{"id":539065210,"first_name":"Yufeng Deng","last_name":"峰哥","username":"fennng","type":"private"},"date":1538193751,"text":"/list","entities":[{"offset":0,"length":5,"type":"bot_command"}]}}'; var testList2 = '{"update_id":427275035,"message":{"message_id":211,"from":{"id":539065210,"is_bot":false,"first_name":"Yufeng Deng","last_name":"峰哥","username":"fennng","language_code":"en-US"},"chat":{"id":"539065210","first_name":"Yufeng Deng","last_name":"峰哥","username":"fennng","type":"private"},"date":1540807486,"text":"/help","entities":[{"offset":0,"length":5,"type":"bot_command"}]}}'; var testSearchVideo = '{"update_id":427275035,"message":{"message_id":211,"from":{"id":539065210,"is_bot":false,"first_name":"Yufeng Deng","last_name":"峰哥","username":"fennng","language_code":"en-US"},"chat":{"id":"539065210","first_name":"Yufeng Deng","last_name":"峰哥","username":"fennng","type":"private"},"date":1540807486,"text":"/searchVideo Ri938AvTOGc","entities":[{"offset":0,"length":5,"type":"bot_command"}]}}'; var isDebug = false; function debug() { e = {}; e.postData = {}; e.postData.contents = testSearchVideo; doPost(e); }
Pingback: Telegram Bot 使用机器人管理群,限制用户,踢出用户 | Feng's Tech Sharing Website