[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


<<:  Day 24 - Rancher Fleet 玩转第一个 GitOps

>>:  [Tableau Public] day 24:台湾姓氏分布分析-2

DAY9: 验证码辨识(二)

大家好,昨天我们把图片抓下来之後也标记完了(我个人是用了10000张图片),接下来就是丢进模型训练啦...

Day01,旅途的起点

前言 这次预计用这30天,来执行一轮乱七八糟的HomeLab,内容将会涵盖许多不同领域的范畴但不会探...

[Golang]变数重声明与重名变数

一、整理变数重声明与重名变数的描述。 变数重声明,对已经声明过的变数,再次声明。 前提条件如下: 变...

30天轻松学会unity自制游戏-让Player动起来

按照之前的进度制作,现在按下▶Player应该会魔性地扭动起来,但就没有其他效果了,接下来就改造Pl...

【课程推荐】2021/5/8~5/9 Angular前端开发框架入门班

课程目标 课程前半段主要让学员建立Angular开发框架相关基本观念,并透过Angular CLI建...