电报机器人从外部运行命令

时间:2019-11-23 21:17:56

标签: javascript node.js telegram-bot

好吧,我对使用电报机器人很陌生,但是到目前为止,我对一些基本的机器人都做得很好。现在,我想改善一些事情,让我的网站“喂”机器人。

这是场景

我有一个Google电子表格,可以进行一些计算,然后使用经典网址将消息发送给机器人。像这样...

var optionsUG = {
   'method' : 'post',
   'payload' : formDataUG,
   'muteHttpExceptions':true
 };
 var optionsLG = {
   'method' : 'post',
   'payload' : formDataLG
 };
  //SpreadsheetApp.getUi().alert('UrlFetchApp options ['+options+"]");
 //UrlFetchApp.fetch('https://api.telegram.org/bot'+token+'/sendMessage?chat_id='+channelNumber+'&text='+text);
  var result = UrlFetchApp.fetch('https://api.telegram.org/bot'+token+'/sendMessage',optionsUG);
  Utilities.sleep(5 * 1000);
  result = UrlFetchApp.fetch('https://api.telegram.org/bot'+token+'/sendMessage',optionsLG);

现在我想做类似的事情,但是我想代替我的sendMessage来调用我的机器人的方法 我使用javascript Telegraf框架ATM,但我可以更改不是问题。 我想实现

var result = UrlFetchApp.fetch('https://api.telegram.org/bot'+token+'/register',optionsUG);

这是当前配置的机器人

const serverPath = "/home/bots/PlatoonAdvisor/telegram";

const commands = require(serverPath+'/package/modules/commands.js');
const config = require(serverPath+'/config.json');

var helpText = require(serverPath+'/package/help.txt');

const token = config.TELEGRAM_BOT_SECRET;

const Telegraf = require('telegraf');
const bot = new Telegraf(token);
const REGISTER_COM = 'register';
const HELP_COM = 'help';
const REQUIREMENTS_COM = 'requirements';
const CAHT_ID_COM = 'chatid';


const getCommandParameters = function (text, command) {
  var reg = "/\/"+command+" (.*)/g";
  var arr = text.match(reg);
  return arr;
}

/*
bot.on('text', message=> {
  return message.reply('I am Grooth');
})
*/
bot.command(HELP_COM, ctx=> {
  return ctx.reply(helpText);
});
bot.command(REGISTER_COM, ctx=> {
  var replyMsg;
  var param = getCommandParameters(ctx.message.text, REGISTER_COM);
  var player_name, allycode;
  if (param != null) {
    try {
      var params = param.split(",");
      if (params.length < 2) {
        replyMsg = "Missing parameters, try /help if you need help :)";
        throw replyMsg;
      }
      player_name = params[1];
      allycode = params[0];
      var channel = ctx.chat.id;
      commands.registerTPlayer(player_name, allycode, channel);
      replyMsg = "Successfully registered player ${player_name} with allycode ${allycode}!"
    } catch (ex) {
      console.log (ex);
    }
  }
  return ctx.reply(replyMsg);
});
bot.command(REQUIREMENTS_COM, ctx=> {
  var param = getCommandParameters(ctx.message.text, REQUIREMENTS_COM);
  var params = param.split(",");
  var json = ctx.chat.id;
  return ctx.reply(json);
});
bot.command(CAHT_ID_COM, ctx=> {
  var id = ctx.chat.id;
  var msg = "The chat id requested is ${id}";
  return ctx.reply(msg);
});
bot.startPolling();

那有可能吗?我正在互联网上浏览了一会儿,却找不到任何线索。

任何帮助表示赞赏 tnx

编辑:做了更多的挖掘工作,我发现当机器人中发生某些事情时,webhooks会将内容发送到Web服务器,但反之则不...我感到沮丧

我的目标是使用电子表格中包含的信息更新本地数据库,但该bot仍然没有,因此用户以后可以要求bot检索这些信息。

我的意思是,如果它是真正的Web服务器,那么我可以拨打Ajax电话,但它只是一个电子表格,不充当服务器...:(

1 个答案:

答案 0 :(得分:0)

好吧,我忘了用找到的解决方案回答这个问题。

确实没有办法从外部调用bot的特定功能,因为它不是真正的功能,它是用户输入并且bot解释为命令的解析字符串。

所以我必须要有创造力,并从bot本身公开一个RestServer(nodejs快递库可以解决问题),然后我才能从脚本中调用它。

Here an handy guide for Express.js

这是我的解决方案,目前效果很好。 Tnx:)