本文是實作如何 Heroku 持續不間段服務 與 連結 Google Sheet 當作我們的資料庫。

前情提要:

繼之前 讓我們用 Python 開發一個 LineBotLine 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 才會啟用喔!! Configure_Dynos Active_clock 之後就能去看 Log 或是 app 狀態 觀察它是否一直有在運作。

建立我們的資料庫

我遠本是想用 Heroku 內的資料庫可是我學了一下覺的很難用於是我就把目光轉到 Google Sheet 上了,對於我們只要儲存一些 Access Token 跟使用者名字是夠用的!!(如果想要用Heroku內的資料庫可以去看麥田捕手的文章連結在下面)
我們這邊就講要整麼利用 GoogleSheet 當我們的資料庫
先到 Google Cloud Platform 建立一份 Google Sheet 和一個 Google Sheet 的 API 身份 Google_sheet_api 然後再去申請一下金鑰讓我們可以跟 Google Sheet 去做互動
申請憑證在:側邊欄裡的 API 和服務 => 憑證 => 服務帳戶旁邊的管理帳戶 => 建立服務帳戶
Apply_authority 憑證申請完之後會給你下載一個 jason 檔就是之後要引用的金鑰(請保存好沒了就要重申請!)
之後你會在服務帳戶那邊看到電子郵件之後我們去建立一個 GoogleSheet 並且分享編輯權限給這個 Email Share_authority 安裝環境測試需要的套件 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試算表寫入爬取的資料