iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
Modern Web

telegram開發筆記系列 第 9

[09] 防止 telegram bot 錯誤

如果只是向上一篇一樣最後會有各種錯誤

因為 telegram bot 會將加入群組等都傳送過來所以需要再加一個判斷來防範

主要是 receiveTelegram 這個函式

main.js

const { sendBotMessage } = require("./telegramItem");

function receiveTelegram(data) {
  // 確保只有 message 訊息可以被處理
  if (data.message){
    if ("media_group_id" in data.message) {
      multitudeForwardHandler(data);
    } else {
      data = parseDataToTelegram(data);
      sendBotMessage(data);
    }
  }
}

/**
 * @description 用來分析與轉換對應的訊息類型
 *
 * @param {*} estringa
 * @return {*}
 */
function parseDataToTelegram(estringa) {
  var payload = {};
  if (estringa.message.text) {
    payload = {
      method: "sendMessage",
      text: estringa.message.text,
    };
  } else if (estringa.message.sticker) {
    payload = {
      method: "sendSticker",
      sticker: estringa.message.sticker.file_id,
    };
  } else if (estringa.message.photo) {
    array = estringa.message.photo;
    text = array[1];
    payload = {
      method: "sendPhoto",
      photo: text.file_id,
      caption: estringa.message.caption ? estringa.message.caption : "",
    };
  } else if (estringa.message.video) {
    vidoe = estringa.message.video;
    payload = {
      method: "sendVideo",
      video: vidoe.file_id,
      caption: estringa.message.caption ? estringa.message.caption : "",
    };
  } else if (estringa.message.animation) {
    animation = estringa.message.animation;
    payload = {
      method: "sendAnimation",
      animation: animation.file_id,
      caption: estringa.message.caption ? estringa.message.caption : "",
    };
  }
  payload.chat_id = estringa.message.chat.id;
  return payload;
}

// 用來存放多個 media 用的
let multitudeSendData = {};

/**
 * @description 多個 media 訊息會以這種形式傳送
 *
 * @param {*} estringa
 */
function multitudeForwardHandler(estringa) {
  let object = {
    type: checkTelegramMessageType(estringa.message),
    media:
      estringa.message.video?.file_id || estringa.message?.photo[1].file_id,
    caption: estringa.message.caption ? estringa.message.caption : "",
  };
  // 當不同 group id 傳來就 reset
  if (!multitudeSendData[estringa.message.media_group_id]) {
    multitudeSendData[estringa.message.media_group_id] = {
      timeout: null,
      data: [],
    };
  }
  multitudeSendData[estringa.message.media_group_id].data.push(object);

  clearTimeout(multitudeSendData[estringa.message.media_group_id].timeout);
  multitudeSendData[estringa.message.media_group_id].timeout = setTimeout(
    () => {
      sendBotMessage({
        chat_id: estringa.message.chat.id,
        method: "sendMediaGroup",
        media: JSON.stringify(
          multitudeSendData[estringa.message.media_group_id].data
        ),
      });
    },
    1000
  );
}

/**
 * @description 用來分影片和照片
 *
 * @param {*} message
 * @return {*}
 */
function checkTelegramMessageType(message) {
  let type;
  if (message.photo) {
    type = "photo";
  } else if (message.video) {
    type = "video";
  }
  return type;
}

module.exports = {
  receiveTelegram,
};

機器人的部分在這邊就結束了

他可以有各種延伸

即便不回聲也可以直接傳訊息給別人

因為接受 telegram 的請求只是一個觸發的方式

day09


上一篇
[08] 回聲多個 media 訊息
下一篇
[10] 撰寫自己的 console.log
系列文
telegram開發筆記18

尚未有邦友留言

立即登入留言