繼上一篇先將Trello卡片開好且設上每週的due day,
但Trello的通知只有在due day前寄一封信通知,
這是不夠的啊啊啊啊啊~~
因此我要將它進化到定時通知趕快寫文章呀!!!!
我比較習慣使用python,所以本文還是使用python3~
本文所採用的環境
- Max OSX 10.15
- Python 3.7.3
本文使用vs code的終端 或 mac終端執行py,也可以自行選擇jupyter
python套件
- requests
- json
- configparser
- datetime
- time
- sys
首先先來註冊Line Notify,
點下Generate token,
輸入上這notify的名字,
接著如果只要推播給自己請選擇 1-on-1 的選項,
如果你也和我一樣是一群人,就選擇你們的群組吧!
恭喜你已經拿到token摟!
接著打開Line搜尋官方帳號 Line notify並加入好友,
如果是單人就到這裡,如果是群組,請把它加到群組裡!!!
接著打開上一篇所使用的ini檔,
把這次的line token加進去~
1 2 3 4 5 6 7
| [Line] ;register token https://notify-bot.line.me/my/ line_token = your token
[Url] ;Line url = "https://notify-api.line.me/api/notify"
|
接著開一支py吧!跟上一篇一樣的方式初始化、讀取ini…吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import requests import json import datetime as dt
import send_notify as line import configparser import sys import time
start_time = time.time()
conf = configparser.ConfigParser() conf.read("config.ini", encoding="utf-8")
key = conf.get('Trello' , 'key') token = conf.get('Trello' , 'token') board = conf.get('Trello' , 'board')
line_token = conf.get('Line' , 'line_token')
url_notify = conf.get('Url' , 'notify')
|
以上初始化完後,就準備進入我們這次的主題
預計的步驟是
- 抓出當週誰還沒寫文章
- 推播吵死他!!!
我們先來設計取當週週日的日期,
不過datetime只能告訴我這是禮拜幾,沒辦法直接告訴我禮拜日的日期,
所以~~~ 自己來判斷吧…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| today = dt.datetime.now() checkday = dt.datetime.now()
oneday = dt.timedelta(days = 1)
while checkday.isoweekday() != 7: checkday += oneday
lessday = checkday - today
checkday = checkday.strftime("%Y-%m-%d")
|
計算完日期之後,取出卡片上的due day來做判斷,
先來看一下Trello Api,
我們要取list的name、open的card、card的due day、card的dueComplete狀態,
所以我們的query string長這樣
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| url_get_list = "https://api.trello.com/1/boards/"+board+"/lists"
querystring = { "cards":"open", "card_fields":["due","dueComplete"], "filter":"open", "fields":"name", "key":key, "token":token }
req = requests.request('GET', url_get_list, querystring) card_lists = json.loads(req.text) print(card_lists)
|
在終端機看到密密馬馬的這串,就表示我們成功取到list的清單摟~~
接著解析它,並設計迴圈來檢查文章寫完了沒,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| finish_users = [] not_finish_users = []
for lists in card_lists: finish = False for card in lists['cards']: if card['due'] == None: continue if (checkday == card['due'].split('T')[0]) and (card['dueComplete']): finish = True break if not finish: not_finish_users.append(lists['name']) else: finish_users.append(lists['name'])
|
我們團隊說好寫完文章的,要去把他的due day打勾,
所以我要檢查due day的狀態是否為true,
抓出誰沒完成後,最後一的動作就是發Notify啦~
在這之前先來製作要跟大家說的話,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
message = {'message': "\n" "Hi 各位安安 ~ \n"+ "--- \n"+ "本週已完成的人: \n"+ (",".join(finish_users))+"\n"+ "請下週再接再厲~~\n"+ "--- \n"+ "本週未完成的人: \n"+ (",".join(not_finish_users))+"\n"+ "距離本周截止你只剩下"+str(lessday.days)+"天了~~ \n"+ "趕快去寫文章!! \n"+ "--- \n"+ "投稿連結: \n"+ "https://forms.gle/MvufZiucPir4yhHb6" }
|
然後就是把這串message傳到line notify拉~
1 2 3 4 5 6 7
| headers = { "Authorization": "Bearer " + line_token, "Content-Type" : "application/x-www-form-urlencoded" }
req = requests.request("POST", url_notify, headers=headers, params=message) print(req.status_code)
|
看到http200了,趕快來看看line上出現了什麼~
すばらし~~
看到誰沒完成,就趕快tag他,給他溫暖的關愛 ❤️❤️❤️
最後把code丟到server上,並設定上crontab,
之後每週就會在固定的時間通知大家拉!!
至於排程的部分~ 可以選用linux 或者 windows內建的排程,
這邊有機會再補上linux的,
因為手上暫時沒有可用的小server QQ…
後記
因為專案的關係,了解到可以用Line Notify來做一些系統通知,
而且這服務似乎是沒有計算費用的~~
比起開一個line@來推播,可以省下一些費用,
這篇教學是透過開發者串連Notify到群組發訊息,
如果是要做在系統讓user來綁定Line Notify,
其實對於一些使用者來說是有一點操作門檻的,
各別綁定這部分沒有在這篇文章列出來,
因為那又是另外一回事了~~
有機會再來做一篇
開個小服務讓user到平台上綁定,並各別推播訊息到user手中
本文code的連結:TrelloXLine
希望大家用的開心~ 準時寫文章~ 一起拿金質獎~