Line Notify 建立資料庫並提供不休息的服務
本文是實作如何 Heroku 持續不間段服務 與 連結 Google Sheet 當作我們的資料庫。
前情提要:
繼之前 讓我們用 Python 開發一個 LineBot 跟 Line Bot 之利用 Line Notify 突破限制吧!,我們已經有了 Line Bot 跟 Line Notify 並串接好了,那我們之後就是要去紀錄這些 Access Token 是誰的,當需要傳送資料的時候就知道要傳給誰了!!
不睡覺的服務:
身為一個慣老闆下的社畜我也想當一下慣老闆的滋味,於是我們的服務是一直運作也是理所當然的吧!!
這部分比較簡單原理大概就是因為 Heroku 每 25 分鐘如果沒人使用的話那個 APP 就會進入暫時性的休息,於是我們只要在 24 分的時候去戳一下自己的 Web 讓他以為有人叫他就可以讓他一直工作了。
我們先安裝一個套件 APScheduler => pip install apscheduler
之後我們就可以製作我們的 clock.py,當然你要定時的去傳送訊息或是做一些事也能打在裡面。
# clock.py
from apscheduler.schedulers.blocking import BlockingScheduler
import urllib.request
sched = BlockingScheduler()
#定時去搓url讓服務不中斷
@sched.scheduled_job('cron', day_of_week='mon-sun', minute='*/25')
def scheduled_job():
url = "https://你的Heroku APP名字.herokuapp.com/"
conn = urllib.request.urlopen(url)
for key, value in conn.getheaders():
print(key, value)
print("戳一下")
sched.start()
我們有了 clock.py 之後我們也要修改一下 requirements.txt and Procfile
requirements.txt => 多加 APScheduler == 3.8.1
Procfile => 多加 clock: python clock.py
加好之後上傳 Heroku 之後記得去開啟 Clock 才會啟用喔!!
之後就能去看 Log 或是 app 狀態 觀察它是否一直有在運作。
建立我們的資料庫
我遠本是想用 Heroku 內的資料庫可是我學了一下覺的很難用於是我就把目光轉到 Google Sheet 上了,對於我們只要儲存一些 Access Token 跟使用者名字是夠用的!!(如果想要用Heroku內的資料庫可以去看麥田捕手的文章連結在下面)
我們這邊就講要整麼利用 GoogleSheet 當我們的資料庫
先到 Google Cloud Platform 建立一份 Google Sheet 和一個 Google Sheet 的 API 身份
然後再去申請一下金鑰讓我們可以跟 Google Sheet 去做互動
申請憑證在:側邊欄裡的 API 和服務 => 憑證 => 服務帳戶旁邊的管理帳戶 => 建立服務帳戶
憑證申請完之後會給你下載一個 jason 檔就是之後要引用的金鑰(請保存好沒了就要重申請!)
之後你會在服務帳戶那邊看到電子郵件之後我們去建立一個 GoogleSheet 並且分享編輯權限給這個 Email
安裝環境測試需要的套件 pygsheets 套件 => pip3 install pygsheets
記得!第一篇有說的 Heroku 的設定檔(requirements.txt)也要加才入套件才能在 Heroku 上使用喔
之後我們就可以開始使用 Google Sheet 當我們的資料庫去做使用了 \
# 自己練習跟 Google Sheet 互動的程式碼
import pygsheets
#給憑證
gc = pygsheets.authorize(service_file='你的憑證位置')
# 開啟googlesheet
# google sheet連結範例 = https://docs.google.com/spreadsheets/d/<docID>/edit#gid=<sheetID>
sheet = gc.open_by_url(
'https://docs.google.com/spreadsheets/d/<docID>/'
)
#找到下方"工作表1"分頁並在裡面操作
wks = sheet.worksheet_by_title("工作表1")
#暴力破解直列搜尋 (用來尋找這個人的userid並拿取相對應的accesstoken我們就能傳送訊息給指定的人)
Count = int( wks.cell( 'C1' ).value ) #人數 #在C1設定目前綁定人數並拿來當計數器
Userid = "" #先clear
for i in range(1,Count ) :
Userid = str(wks.cell( 'A'+str(i) ).value)
print(Userid)
if Userid.value == "101112" : #找到1011112就做下面
print("第"+str(i)+"個") #顯示第幾個
print( wks.cell( 'B'+str(i) ).value ) #顯示裡面得值
print("ok")
break #拿到並跳出
#新增資料方式 (新增綁定人資料並統計人數,並讓下次可以跑進迴圈)
wks.update_value('A6', 'asderrgte231231564gh') #新增資料
wks.update_value('C1', Count+1) #人數+1
A = wks.cell( 'A6' )
print(A.value) #檢查新資料
Google sheet 該如何與 Python 運作跟上面的註冊詳細我一樣會把參考資料都放在下面(還不懂的可以看裡面教的比較詳細)
我知道我講的有點簡略如果都不行或是還有疑問就留言吧!如果我會,我就盡量回答!! \
Reference
Line:
賴田捕手 iT幫幫忙
卡米狗 iT幫幫忙
Google Sheet:
[資料庫筆記] Python 串接 GoogleSheet 新增、讀取、更新和刪除
Python 讀寫 Google Sheets 教學
[Python爬蟲教學]解析如何串接Google Sheet試算表寫入爬取的資料