【问题标题】:How to send message only once to every individual user who has engaged with my telegram bot如何只向与我的电报机器人互动的每个用户发送一次消息
【发布时间】:2021-02-14 09:44:47
【问题描述】:

所以我使用this 源代码在 GAS 中构建了我的电报机器人,还使用消息处理程序在 Google 电子表格中获取了message.message.chat.id

所以现在我想要的是:

  1. 删除重复的chat_ids,因为它在每次用户发送消息时都会重复
  2. chat_ids 发消息

我尝试过的:

我使用了这个功能,它运行良好,但问题是手动更改 chat_id 值将是一场噩梦!

function SendTest() {
  var token = "xxx";
  var telegramUrl = "https://api.telegram.org/bot" + token;
  var url = telegramUrl + "/sendMessage?chat_id=xxx&text=Hello+World";
  var response = UrlFetchApp.fetch(url);
  Logger.log(response.getContentText());
}

这是一张我的电子表格的照片

“如您所见,在第 3、4、5 行中有一个重复的 chat_ids,我只想要其中一个,所以当我向他们发送消息时,它不会发送多次 - 我想要第 1 个"

这是我使用的消息处理程序

function saveMessage(message) {
  let file = SpreadsheetApp.openById(sheetLogId);
  // first tab of the file
  let sheet = file.getSheets()[0];
  // get last row
  let lastRow = sheet.getLastRow() + 1;
  
  sheet.setActiveSelection('A' + lastRow).setValue(Date(message.message.date)); // date
  sheet.setActiveSelection('B' + lastRow).setValue(message.message.chat.id); // chat id
  sheet.setActiveSelection('C' + lastRow).setValue(message.message.from.username); // username
  sheet.setActiveSelection('E' + lastRow).setValue(message.message.text); // message
  sheet.setActiveSelection('D' + lastRow).setValue(message.message.chat.first_name+ " " + message.message.chat.last_name); // message
  
}

-- 编辑--

所以我使用 Nikko J.editd 函数 saveMessage(message) 来解决我的第一个问题(不再重复 chat_id!)

在那之后我发现this 表单谈到了检索行,所以我用它来选择电子表格中的所有chat_id 并将其循环到我的发送文本函数中

它在这里代表:

function sendtext(){
 var rows = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
 var botSecret = "the bot token";
 rows.forEach(function(row, index) {
   Logger.log(row[1] + ":" + index)
 var id = row[1];
 UrlFetchApp.fetch("https://api.telegram.org/bot" + botSecret + "/sendMessage?text=" + "the text that you want "  + "&chat_id=" + id + "&parse_mode=HTML");
 });
} 

【问题讨论】:

    标签: javascript google-apps-script google-sheets telegram-bot


    【解决方案1】:

    问题:

    • 如果工作表中存在聊天 ID,您希望忽略传入消息以避免重复
    • 使用UrlFetchApp.fetch()向用户发送消息

    我在这里复制了您的代码并进行了一些修改以复制场景:

    function sendMessage(body ,chatId){
      var botSecret = "xxx";
      var response = UrlFetchApp.fetch("https://api.telegram.org/bot" + botSecret + "/sendMessage?text=" + encodeURIComponent(body) + "&chat_id=" + chatId + "&parse_mode=HTML");
    }
    
    function testFunction(){
      var message = {
        message : {
          date: "01/01/20",
          text: "This is jus a random text",
          chat: {
            first_name: "FNAME",
            last_name: "LNAME",
            id: 1234
          },
          from: {
          username: "abcd"
          }
        }
      }
      saveMessage(message);
    }
    
    function saveMessage(message) {
      let file = SpreadsheetApp.getActiveSpreadsheet();
      // first tab of the file
      let sheet = file.getSheets()[0];
      // get last row
      let lastRow = sheet.getLastRow() + 1;
      var newArr = [];
      //insert data into array. By using this, we can use setValues() and lessen the API calls
      newArr.push(Date(message.message.date));
      newArr.push(message.message.chat.id);
      newArr.push(message.message.from.username);
      newArr.push(message.message.text);
      newArr.push(message.message.chat.first_name+ " " + message.message.chat.last_name);
      //get all chat ids in sheets
      var ids = sheet.getRange('B1:B').getValues().filter(val => val != "");
      //convert chat ids array into 1 dimensional array so we can easily use Array.includes()
      var newArr2 = [].concat(...ids);
      //check if message.message.chat.id exists in the list
      if(!newArr2.includes(message.message.chat.id)){
        //update sheet and message user if chat id does not exists in sheet
        sheet.getRange(lastRow,1, 1, newArr.length).setValues([newArr]);
        var message = "Hello world";
        sendMessage(message, message.message.chat.id)
      }
    }
    

    参考资料:

    【讨论】:

    • 所以现在我面临同样的问题(重复的消息),但方式不同。我现在使用 google sheet API,并且还使用了这个已回答问题stackoverflow.com/questions/68883437/… 中的代码,我自己处理过但不能,如果你想提交一个新问题,你可以回答它
    【解决方案2】:
    1. 不要对 chat_id 进行编码,而是将 chat_id 作为函数参数传递,并使用字符串连接或字符串模板构建 URL
    2. 创建一个执行以下操作的函数:
      1. 从您的电子表格中读取chat_ids
      2. 获取唯一chat_ids 列表
      3. 遍历唯一的chat_ids 列表以将消息发送到chat_ids 的唯一列表(从 1 调用您的函数的改进版本。

    相关

    【讨论】:

    • 感谢您的帮助,但 Ida 是我如何实现此功能的!
    • @MohammadAbbas 你说的艾达是什么意思?
    • 对不起,我的意思是想法*
    • @MohammadAbbas 我建议你阅读本教程Tutorial: Simple Mail Merge
    • 感谢您的帮助
    猜你喜欢
    • 2017-05-11
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2020-09-23
    • 2017-03-19
    • 1970-01-01
    • 2021-10-08
    • 2019-10-30
    相关资源
    最近更新 更多