跳到主要內容

使用 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 可以有這麼多版本、不同語系的官網,畢竟在最原始的官網內也有「漢語」(簡體中文) 的選項,所以其他的國家自己的官網算代理商嗎? 如果真的要說我會比較建議到 英文版的官網 下載,畢竟這種軟體轉了一手又一手,加了什麼都不知道。

Linux (Ubuntu) 查詢硬碟容量、剩餘大小指令

在 Ubuntu Desktop 版本或有安裝 GUI 像 Xfce 的 Server 版本當然可以直接從圖形介面查看硬碟容量和已經使用的大小, 但如果是在純 CLI 版本或使用 SSH 連線時呢?那就需要用到指令了。 顯示硬碟容量、已使用、可用大小。 df -h 查詢資料夾所占硬碟的大小。 du -h 查詢檔案大小 ls -l

如何領取 Monero 分叉幣 MoneroV?附 Remote Node 免下載區塊鏈、快速同步

MoneroV 在先前已經完成分叉,目前也有在一兩間小型的交易所上市可以買賣,只要在  Monero 區塊高度 1,564,965 時持有 XMR 就可以得到十倍的 XMV, 但必須得是在自行保管私鑰的錢包、MyMonero 或有支援的交易所才能領的到 ,前兩項可以自行領取,交易所則得等所方派發,但如果你使用的交易所沒有支援這項 Fork 那當然就領不到啦。 MoneroV Wallet GitHub :  https://github.com/monerov/monerov GUI Wallet :  https://github.com/monerov/monerov-gui 上方的連結是 GitHub 原始碼,不知道為什麼在 GitHub 上 MoneroV 並沒有 Release 成可以直接使用的執行檔,但在官方網站上還是有提供的,可以到 官網 找到自己對應系統的錢包下載,如果不熟指令介面可以選擇 GUI Wallet。 開啟 GUI Wallet 後選擇 「Restore wallet from keys or mnemonic seed」 來匯入原本的 Monero 錢包,如果不放心將私鑰匯入可以先將 Monero 錢包內的餘額移出,已經產生過快照就不需要擔心沒辦法 Claim 自己的 XMV 了。 如果是使用私鑰來匯入的話則依序填入公開地址、View key、Spend key,以及選擇錢包名稱和儲存在哪個路徑, 即使是錢包檔也應該要好好保管,否則之後就得靠私鑰再匯入一次。 接著設定密碼,這就是開啟這個錢包檔的鑰匙,但如果錢包檔遺失了這個密碼也沒辦法將 XMV 取回,只能靠私鑰再重新匯入。 5.199.161.136 : 9538 接著選擇使用 Remote node,這樣就不必自己下載數十 GB 的區塊鏈檔案和花一大堆時間驗證、同步。 使用別人的 Daemon 來交易和領取 XMV 並不會有安全疑慮 ,只是在連接時對方可以知道的 IP。但其實就算是自己 Host Full Node 也是相同的,仍然會需要 P2P 的和它人連接也將 IP 暴露在公網上。 接著就會開始和遠端的 Node 同步了,左下角可以看到同步進度,完成後 XMV 就會顯示在你...