javascript - 如何只向与我的电报机器人互动的每个用户发送一次消息
问题描述
所以我使用这个源代码在 GAS 中构建了我的电报机器人,还使用消息处理程序message.message.chat.id
在 Google 电子表格中抓取
所以现在我想要的是:
- 删除重复
chat_id
的 s,因为它在每次用户发送消息时都会重复 - 给那些
chat_id
s发消息
我试过的:
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_id
的 s,我只想要其中一个,所以当我向他们发送消息时,它不会发送多次 - 我想要第 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!)
之后我找到了这个表格,它谈到了检索行,所以我用它来选择电子表格中的所有 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");
});
}
解决方案
问题:
- 如果工作表中存在聊天 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)
}
}
参考:
推荐阅读
- java - 将 Compilesdkversion 从 27 更新到 29 后出现空白屏幕
- dynamic - 如何必须为 Box 指定关联类型的值
场地? - vba - 在 Powerpoint VBA 中更改形状属性时动画重置
- microsoft-graph-api - 仅应用 C# 代码,不像图形资源管理器那样工作
- spring - 错误开始了如何修复?错误(Spring Boot + Thymeleaf)
- c# - 为实现 ICollection 的属性引发“跳过导航不是集合”类型的异常
- ubuntu-18.04 - Logwatch 太吵了
- javascript - 在 hostgator 上托管我的 react 应用程序后,我无法访问多个项目
- python - keras 输入层限制
- c# - C# PDF表格在错误的位置添加行