Telegram Bot 可以說是 Telegram 的一大特色,它本身提供了很好的 API 供開發者製作自己的機器人,功能也不侷限於聊天、回答問題,能使用不同程式語言 (Python、Javascript...等) 來去跟遠端伺服器互動,抓取訊息給使用者,所以就有人做出了播報新聞的 Bot,而這次就要做一個非常非常簡單版的比特幣、加密貨幣查價機器人,將會用 Node.js 的 Request 套件去和 Coinmarketcap 所提供的 API 互動。
首先要先在 Telegram 這端建立自己的 Bot,到 @BotFather 這個機器人老爸按照指示生成一個機器人,並將 Token 代碼複製起來供等會對接使用。
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
那這邊以建立在本機為例 (其實都是一樣的啦),Windows 系統直接到官網下載並安裝 Node.js 8.9.4 LTS ,或在 Linux 就是使用上述指令即可完成安裝 Node.js。
cd 你想要安裝 Telegram Bot 的路徑
npm install telebot --save
npm install request
然後在你想要的路徑創建一個 Telegram Bot 的資料夾,CD 到該資料夾後使用上述指令安裝 Telebot 這個方便你開發 Telegram 機器人的架構以及 Request 套件。(基本上 6 版後的 Node.js 都內建 NPM,可以直接安裝)
然後在資料夾內新建一個 BOT.js 檔,整個資料夾看起來應該會像上圖一樣。
var TeleBot = require('telebot');
var bot = new TeleBot('你的 Bot Token');
var request = require('request');
/*BOT 腳本開始*/
/*BOT 腳本結束*/
bot.connect();
接著使用文字編輯器或你習慣的編輯器開啟 BOT.js,將上面的程式碼修改成你的 Bot Token 並貼上,而之後機器人要運行的腳本就可以撰寫在開始與結束之間,其實現在這樣 Bot 已經可以運作了,只是不會有任何反應。
var price,symbol; //定義兩個變數供使用
bot.on('/BTC', msg => { //收到 /BTC 指令時傳訊息
let fromId = msg.chat.id;
let Name = msg.from.username;
request.get("https://api.coinmarketcap.com/v1/ticker/bitcoin", //從 CMC 抓取資料
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ Name }, ${ symbol } : $${ price }`); //傳送訊息
});
});
接著就是重點了,照上方的腳本它先定義兩個變數 (price、symbol) 供之後使用,以及 msg.chat.id 代表發送訊息的 ID,它會自動抓取是要發在群組、私訊...等,這是 Telegram 的訊息規則不能更改,msg.from.username 則是會調用使用者 ID,讓機器人在回訊息時可以順便 Tag 對方。後續就是會從 CMC 抓取比特幣的價格再輸出 (bot.sendMessage) 到對話中。
直接看圖可能更好理解,就是你打 /BTC,它就會 Tag 你再回報價格。
到目前為止你的腳本應該會長的像這樣了,這已經是完全可以使用,在群組或個人訊息收到 /BTC 指令就會自動回報價格。
node BOT.js
在你的路徑下使用上述指令就可以啟動機器人了,能到 Telegram 測試看看它會不會回話。
但如果只能查 BTC 一個當然不夠啊,當然你可以一個一個慢慢新增,只要更改 Coinmarketcap 的 API 網址就可以了,可以參考 CMC 的文件,或直接複製我用好的版本,已經包含十大貨幣和一些我有在關注的 Altcoin。
var TeleBot = require('telebot');
var bot = new TeleBot('你的 Bot Token');
var request = require('request');
var price,symbol;
bot.on('/BTC', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/bitcoin",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.on('/ETH', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/ethereum",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.on('/LTC', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/litecoin",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.on('/XMR', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/monero",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.on('/XRP', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/ripple",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.on('/BCH', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/bitcoin-cash",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.on('/NEO', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/neo",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.on('/ADA', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/cardano",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.on('/IOTA', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/iota",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.on('/EOS', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/eos",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.on('/XLM', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/stellar",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.on('/DASH', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/dash",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.on('/ETN', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/electroneum",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.on('/BNB', msg => {
let fromId = msg.chat.id;
let firstName = msg.from.username;
let reply = msg.message_id;
request.get("https://api.coinmarketcap.com/v1/ticker/binance-coin",
function(error, response, body) {
price = JSON.parse(body)[0].price_usd;
symbol = JSON.parse(body)[0].symbol;
return bot.sendMessage(fromId, `@${ firstName }, ${ symbol } : $${ price }`);
});
});
bot.connect();
這或許不是最聰明正確的寫法,但反正你叫它它會回,也不會報錯價那就好啦,不要太計較。如果對 Telegram Bot 有興趣可以參考官方的 API 文件,以及去看看 Telebot 這個以 Node.js 為底方便你使用的版本。
留言
張貼留言