看了幾篇Line Bot前輩的文章
才能順利完成加密貨幣到價通知
credits for
完成的功能
即時或定時推送加密貨幣資訊,金額採新台幣TWD計算
1. 到價通知:可以設定多種幣種,個別幣種指定價格上界與下界,每分鐘刷新資訊,如果該幣種價格超過上界與下界之間的區間,就會push訊息。
只要符合到價條件就會一直push,如果怕通知太多,可以調整條件、或把通知給關了。
2. 特定幣種監控:設定多種幣種,定時(每小時)push最新的幣種價格。
3. 最大漲幅幣種:以設定的Rank(市值排行*)內,定時(每小時)push最大漲幅與最大跌幅的幣種資訊。
*市值排行採”幣值”乘以”流通數量”
API來源
資料來源採CoinMarketCap
這個是免費的,從各大交易所與貨幣管理官方取得資訊
但是一定會有lag、匯率變動或資訊不完整之時候
關於資料來源、幣種定義、數據計算等說明
請直接從CoinMarketCap官網查詢
我這邊只串接資料,並不能保證資料的可靠度
所以純粹僅供參考、練習程式碼使用
使用方法
這邊會先寫使用方法,最下面再補一些開發過程
如果只是想直接用,可以直接看這邊就好
STEP 1 先取得LINE @ 帳號、開發者功能
這邊的步驟,在本文最上方的兩個連結都有說明
應該稍微摸索一下
提醒一下是選擇開message api的帳號
然後方案選 develop trial,這樣才能免費push
這邊有說,developer trial 上限50個好友、且不能升級
單純是給開發者測試用,但對我們來說已經夠用了
開好帳號之後,就要先取得”channel access token”、”your user id”
(在line developer的後台找這兩個值 https://developers.line.me/en/)
STEP 2 Python開發環境與要求
python 3.6.2
requests 2.18.4
line-bot-sdk 1.5.0
DateTime 4.2
schedule 0.5.0
這是我這邊的開發環境,僅提供參考
套件功能都很簡單,所以你的版本不用完全跟我一樣
STEP 3 clone我的github repository
https://github.com/weilihmen/Cryptocurrency_Line_Noti
STEP 3–1 在data/line_bot_secrets.txt 設定參數
Secret 這邊寫入上面拿到的channel access token
ID這邊寫入上面拿到的your user id
STEP 3–1 在data/setting.txt 設定參數
MODE 1~3 依序分別是上面所提到的三種功能
在MODE裡面依照選擇填入數字
(目前只提供同時執行一個功能)
params_1~3 依序則為三種模式的參數設定
#請注意到,幣種的名稱一率採縮寫、大寫
params_1 填入的內容為”監控幣種”:[”到價通知的上界與下界”]
#舉例而言
"BTC":["320000","310000"]
#=> 代表監控比特幣,價格會在大於320K及小於310K時push line message
#請按照格式增添自己需要監控的幣種及價格區間
params_2 填入的內容為”監控幣種”
#舉例而言
"BTC","ETH"
#代表每小時會推送比特幣與乙太幣的價格資訊
params_3 填入的內容為“漲幅排名數量”,”監控的rank區間”
#舉例而言
5,50
#代表的是每小時會推送rank(市值)前"五十"名中,漲幅及跌幅最大各"五"名
STEP 4 執行程式
設定完成就可以從main.py 執行程式了
開發內容
line-bot-sdk
這個是line官方的python套件
只要設定好參數,就可以很快推送資料
line_bot_api = LineBotApi(channel_access_token)
line_bot_api.push_message(your_id, TextSendMessage(text="hello, world"))#設定好token 跟 id,就可以push line message
#TextSendMessage可以直接使用陣列傳送多則訊息
這個sdk還包含了push跟reply
但是reply功能必須使用https才能掛webhook
這個我不太會,所以捨棄reply,使用push
直接以定時的方式推送line message,缺點大概就是電腦要開著吧
雖然也可以掛上伺服器,但是免費的伺服器大多都有限制運行時間
這個也是一個困擾
python schedule
一般來說,python排程工作會使用sched、而不是schedule
不過,schedule package的首頁已經寫得很明白了
“Python job scheduling for humans.”
意思就是sched根本就不是寫給人類用的啊
#usage
import schedule
import time
def job():
print("I'm working...")
schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every(5).to(10).days.do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)
while True:
schedule.run_pending()
time.sleep(1)
只要把程序排入schedule
再用run_pending,開始執行排程的程序
所以如果想要修改推送通知的時間
只需要修改一下schedule的程式碼即可
到價通知功能
這個功能主要是寫每分鐘從CoinMarketCap更新資料
然後再比對價格資訊,若符合條件則推送資料
請注意,雖然程式是每分鐘更新,
但CoinMarketCap每種貨幣更新速率不一
假設A幣已經符合到價條件,但是來源已經超過一分鐘未更新
則每分鐘刷新的本地端則不會重複push
#new_data <-代表刷新之後符合到價條件的資料
#data <- 推送過的舊資料
#比對新舊資料,相同幣種、相同更新時間,則避免重複push的行為#新的到價資料 比 推送過的舊資料 更新 -> 保留在new_data,再push
#新的到價資料 沒有比 推送過的舊資料 更新 -> 從new_data中刪除def check_updates(data,new_data):
deletes_a=[]
deletes_b=[]
for l in data:
for r in new_data:
if l['symbol']==r['symbol']:
if int(l['last_updated'])==int(r['last_updated']):
deletes_b.append(r)
pass
else:
deletes_a.append(l)
pass
pass
for d in deletes_a:
data.remove(d)
for d in deletes_b:
new_data.remove(d)
for r in new_data:
data.append(r)
return data,new_data
之所以會新增兩個陣列delete_a與delete_b
就是為了來放比對之後要刪除的資料
遇到for迴圈內刪除陣列資料自己跳出的問題
來來回回測試了許多次,才變成這樣的寫法
才發現邏輯十分不人性化,重複做了一些事情(相同資料先刪除再新增)
這部分有時間再寫好一點
也歡迎fork
其他
其實功能一點都不困難、也不fancy
只是花很多時間處理json,畢竟api就是接json
字串跟陣列的判斷處理,寫得很痛苦、痛哭流涕
不過最後看起來還是把想做的功能寫完了
這部分也是希望有機會再寫得更好一些
最後,附上github連結
歡迎高手fork、也歡迎打賞,祝大家投資順利
BTC: 1EdY4v8mLupyjbJMZdxqN1rzLut2h44xxu
ETH: 0xec241cfc97232781d753e471f68e65b360f0bfcf
LTC: LWPGtcHbjNTGnzTkMjy5yKMqeqQpu4pPxu