Skip to content

Instantly share code, notes, and snippets.

@ashd97
Forked from badikirwan/README.md
Created October 24, 2018 12:51
Show Gist options
  • Select an option

  • Save ashd97/42fadc565fd007ab28d7f6dac357a842 to your computer and use it in GitHub Desktop.

Select an option

Save ashd97/42fadc565fd007ab28d7f6dac357a842 to your computer and use it in GitHub Desktop.
How to host your Telegram bot on Google App Script

Telegram Bot on Google App Script

This is the source code of one of my blog post. To read the full blog post please click here.

var token = 'xxx';
function doPost(e) {
// Make sure to only reply to json requests
if(e.postData.type == "application/json") {
// Parse the update sent from Telegram
var update = JSON.parse(e.postData.contents);
// Instantiate our bot passing the update
var bot = new Bot(token, update);
// Building commands
var bus = new CommandBus();
bus.on(/\/start/, function () {
this.replyToSender("Congratulations! It works!");
});
bus.on(/\/joke\s*([A-Za-z0-9_]+)?\s*([A-Za-z0-9_]+)?/, randomJoke);
// Register the command bus
bot.register(bus);
// If the update is valid, process it
if (update) {
bot.process();
}
}
}
function setWebhook() {
var bot = new Bot(token, {});
var result = bot.request('setWebhook', {
url: ScriptApp.getService().getUrl()
});
Logger.log(result);
}
function randomJoke(name, surname) {
var firstName = name || null;
var lastName = surname || null;
var url = 'http://api.icndb.com/jokes/random?escape=javascript';
if (firstName) url += '&firstName=' + firstName;
if (lastName) url += '&lastName=' + lastName;
var data = JSON.parse(UrlFetchApp.fetch(url).getContentText());
this.replyToSender(data.value.joke);
}
function Bot (token, update) {
this.token = token;
this.update = update;
this.handlers = [];
}
Bot.prototype.register = function ( handler) {
this.handlers.push(handler);
}
Bot.prototype.process = function () {
for (var i in this.handlers) {
var event = this.handlers[i];
var result = event.condition(this);
if (result) {
return event.handle(this);
}
}
}
Bot.prototype.request = function (method, data) {
var options = {
'method' : 'post',
'contentType': 'application/json',
'payload' : JSON.stringify(data)
};
var response = UrlFetchApp.fetch('https://api.telegram.org/bot' + this.token + '/' + method, options);
if (response.getResponseCode() == 200) {
return JSON.parse(response.getContentText());
}
return false;
}
Bot.prototype.replyToSender = function (text) {
return this.request('sendMessage', {
'chat_id': this.update.message.from.id,
'text': text
});
}
function CommandBus() {
this.commands = [];
}
CommandBus.prototype.on = function (regexp, callback) {
this.commands.push({'regexp': regexp, 'callback': callback});
}
CommandBus.prototype.condition = function (bot) {
return bot.update.message.text.charAt(0) === '/';
}
CommandBus.prototype.handle = function (bot) {
for (var i in this.commands) {
var cmd = this.commands[i];
var tokens = cmd.regexp.exec(bot.update.message.text);
if (tokens != null) {
return cmd.callback.apply(bot, tokens.splice(1));
}
}
return bot.replyToSender("Invalid command");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment