Telegram Bot 高级应用 -集成其它服务 – 谷歌Youtube Data API 示例[第十集]

  • fennng 

本视频是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);
}

1 thought on “Telegram Bot 高级应用 -集成其它服务 – 谷歌Youtube Data API 示例[第十集]”

  1. Pingback: Telegram Bot 使用机器人管理群,限制用户,踢出用户 | Feng's Tech Sharing Website

发表评论

电子邮件地址不会被公开。 必填项已用*标注