跳到主要內容

使用 Node.js、Telebot 從無到有開發比特幣 (Bitcoin)、加密貨幣查價報價機器人 (Telegram Bot)



Telegram Bot 可以說是 Telegram 的一大特色,它本身提供了很好的 API 供開發者製作自己的機器人,功能也不侷限於聊天、回答問題,能使用不同程式語言 (Python、Javascript...等) 來去跟遠端伺服器互動,抓取訊息給使用者,所以就有人做出了播報新聞的 Bot,而這次就要做一個非常非常簡單版的比特幣、加密貨幣查價機器人,將會用 Node.js 的 Request 套件去和 Coinmarketcap 所提供的 API 互動。


首先要先在 Telegram 這端建立自己的 Bot,到 @BotFather 這個機器人老爸按照指示生成一個機器人,並將 Token 代碼複製起來供等會對接使用。


再來就要建置開發的環境了,你可以選擇在本機上 Host 這個機器人,或是使用 GCPAWS 等雲端主機來架設就不必一直開機了。


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 為底方便你使用的版本。 



留言



這個網誌中的熱門文章

WinRAR - 繁體中文版、免費版,別再破解了,老牌壓縮軟體直接免費給你用

WinRAR 應該對於所有 Windows 使用者一點都不陌生,可能也是很多人壓縮、解壓縮檔案的首選,舉凡 RAR、ZIP、7-Zip、TAR ...等檔案格式都可以處理,製作自解壓縮 (.EXE) 檔也沒問題,也算是最老牌的解壓縮軟體之一。 WinRAR 官方網站 :  https://www.win-rar.com 繁體中文版 :  https://rar.tw/download.html 永久免費簡體版 :  http://www.winrar.com.cn/download.htm 其實我也不太理解為什麼一個 WinRAR 可以有這麼多版本、不同語系的官網,畢竟在最原始的官網內也有「漢語」(簡體中文) 的選項,所以其他的國家自己的官網算代理商嗎? 如果真的要說我會比較建議到 英文版的官網 下載,畢竟這種軟體轉了一手又一手,加了什麼都不知道。

SSHPass - 讓 SSH 連線自動登入、不需要輸入密碼,以及 Windows 快速登入檔製作

登入遠端的 SSH 時每次都要打密碼真的是非常浪費時間,尤其是想把 SSH 連線做成一鍵捷徑時一定會遇到密碼的問題,即便成功連線了還是得手打密碼啊,身為一個懶鬼當然是連密碼都想省掉,那 SSHPass 就可以幫你做到直接將密碼加在指令列內,以後只要靠一個 .bat 就可以快速連線了。 sudo apt-get install sshpass 首先先在用戶端 (Client) 安裝 SSHPass, 如果是在 Windows 可以使用 Bash  來進行安裝。 sshpass -p 密碼 ssh 帳號 @ 地址 這行指令就能讓你直接登入了,當然這還需要打一行指令還不夠方便。 為了達到真的一鍵登入,我們先建立一個 .bash 指令檔。 bash login.bash 再寫一個 .bat 檔放在同路徑下。那直接執行 BAT 時就會先開啟 Bash > SSHPass > SSH 成功連線!是不是又更方便了不少呢。

製作 Windows 10 重灌、安裝隨身碟 (USB),不要再用光碟燒映像檔 (ISO) 了!

在安裝新的系統或重灌時都需要以光碟或隨身碟 (USB) 開機進入 Windows 的安裝程式進行操作,但現在誰還在燒光碟呢?所以多半都是以隨身碟當作開機工具,微軟 Microsoft 也知道 USB 重灌的需求日益龐大, 何況不少 Windows 10 的使用者都是從當初 Windows 7 授權升級而來的,所以就推出了官方的「Media Creation Tool」來幫助大家自動下載 系統 ISO 並燒錄到隨身碟中。 Media Creation Tool (微軟 Win10 安裝工具) 下載頁面 :  https://www.microsoft.com/zh-tw/software-download/windows10 下載完成後執行,選擇 「建立另一部電腦的安裝媒體」 來製作 USB 開機隨身碟。 選擇 「USB 快閃磁碟機」 。 將隨身碟和電腦連接並選取該個磁碟機,之後安裝程式就會自動下載 Windows 10 ISO 並將完整的安裝程序燒錄到隨身碟中,就能以該隨身碟開機了!