Python 一個 line notify,通知今天氣溫。
最近天氣變化好大,每天起床都要問 siri 今天幾度選擇衣服,懶懶如我決定化主動為被動,寫一個 line notify 主動發訊息通知。這篇會詳細紀錄從0到完成,避免未來的自己失憶想不起來怎麼做,如果剛好對你有幫助就更好了٩(ˊᗜˋ )و。
大綱
寫一個新專案大致有幾個步驟
- 找到需要的資料(api, line 說明文件)
- 在 github 創一個 repo
- 寫 code
- build 到伺服器讓程式可以一直 run
將會學到 python
- 如何抓取 api 資料
- 如何取得 dict 內層資料
- 如何華氏溫度轉攝氏溫度
- 如何使用 line notify
前製作業
- 在 github 創 repo
- clone 到自己的電腦
- 新增一個 main.py (我的環境為 Ubuntu 20.04.3 , python3.8)
- 找 api 的時候覺得中央氣象局的不太好用,後來找到 openweathermap 這個網站,創一個帳號然後點 my api 新增一個 api key
coding ~~~~~~~~~~
取得資料
- 安裝套件
pip3 install request
通常我使用套件會先進行簡單的測試,再把需要的資料塞進去。
import requests
url = "https://google.com"
r = requests.get(url)
print(r)
回傳 200 成功,也表示使用方式正確
2. 試試看 open weather 的 API 能不能用(城市id在官方提供的網站找,這裡以台北 1668338 為例)
import requests
import jsonAPIKEY="你的API KEY"
url = 'https://api.openweathermap.org/data/2.5/weather?id=1668338&appid='+APIKEY
r = requests.get(url)
data = json.loads(r.text)
print(data)
print 出來的結果:
{'coord': {'lon': 121.6503, 'lat': 25.0486}, 'weather': [{'id': 803, 'main': 'Clouds', 'description': 'broken clouds', 'icon': '04d'}], 'base': 'stations', 'main': {'temp': 293.26, 'feels_like': 293.26, 'temp_min': 291.95, 'temp_max': 294.32, 'pressure': 1022, 'humidity': 74}, 'visibility': 10000, 'wind': {'speed': 5.14, 'deg': 110}, 'clouds': {'all': 75}, 'dt': 1638775042, 'sys': {'type': 2, 'id': 2032887, 'country': 'TW', 'sunrise': 1638743103, 'sunset': 1638781437}, 'timezone': 28800, 'id': 1668338, 'name': 'Taipei City', 'cod': 200}
很正確的得到資料了~
3. 因為我只需要最高溫/最低溫/當前氣溫/體感溫度,所以整理一下得到的json並且把溫度轉為攝氏溫度
// 華氏溫度轉攝氏這樣寫 ; round(x,y)保留x小數後y位
def tempToC(fTemp):
return round((fTemp - 32) *5 / 9 ,1)temp = tempToC(data['main']['temp'])
feels_like = tempToC(data['main']['feels_like'])
temp_max=tempToC(data['main']['temp_max'])
temp_min=tempToC(data['main']['temp_min'])print(f"當前氣溫 {temp}")
print(f"體感溫度 {feels_like}")
print(f"最高溫 {temp_max}")
print(f"最低溫 {temp_min}")
4. 組成我要的字串
print(f"{data['name']} \n當前氣溫 {temp} \n體感溫度 {feels_like}\n最高溫 {temp_max}\n最低溫 {temp_min}")msg = f"{data['name']} \n當前氣溫 {temp} \n體感溫度 {feels_like}\n最高溫 {temp_max}\n最低溫 {temp_min}"
使用 line notify
- login line notify 登入 > profile 個人頁面
https://notify-bot.line.me/zh_TW/ - 點 發行權杖(創一個只有自己跟 line notify 的群組,然後會取得lineToken,複製起來)
3. 加上以下這段程式
url = "https://notify-api.line.me/api/notify"payload={'message':{msg}}headers = {'Authorization': 'Bearer ' + lineToken}response = requests.request("POST", url, headers=headers, data=payload)print(response.text)
執行 main.py
讓程式定期執行
安裝套件 pip3 install schedule
測試一下怎麼使用
import scheduledef testJob():
print('test')schedule.every(5).seconds.do(testJob)while True:
schedule.run_pending()
time.sleep(1)
但在寫的時候只要函式帶上參數就會噴一個error (schedule的Error)the first argument must be callable
歷經波折終於找到解決方法,要把參數放在逗號後並用小括號包起來
schedule.every().day.at("07:30").do(sendToLine(lineToken,temp))
# 每天7.30執行
結合上面的所有 完整的code
到這個階段只要啟動著終端機 python main.py
就會在早上7.30執行程式,但我們不想一直開著電腦只為了這隻程式,下面一段就來介紹把程式放上雲端。
(不過其實到這邊就可以算是完成了,我自己也沒有把下面的佈署完成 ٩(ˊᗜˋ )و)
把程式放在雲端 run 著
使用的是 heroku 這個服務
- 建立 Heroku 帳號 (密碼要有大小寫/數字/符號)
- 點 New App
- 在電腦安裝 heroku (Ubuntu :
sudo snap install --classic heroku
) - 下指令
# 登入heroku
heroku login# 建立git初始化資料夾
git init# 指定遠端操作的APP
heroku git:remote -a app名稱# 將資料夾檔案部屬至heroku
git add .
git commit -m 'notify'
git push heroku main
5. 確認一下Heroku跟檔案有沒有同步
heroku run bash# 確認檔案是不是都有上傳
ls# 測試在heroku上執行python程式
python main.py
6. 到 Heroku 點上面的 Resources,在 Add-ons 搜尋 Heroku Scheduler,點Submit Order Form (由於 Add-ons 功能會需要新增信用卡資訊,要進到個人帳戶 account setting 中的 billing,點 Add credit card 填資料)
7. 接下來點 Heroku Scheduler 進行管理設定,點 Create job 新增一個定時任務排程。
8. 首先設定執行的時間間隔(三種預設的時間,每十分鐘,每小時,每天),再設定執行的指令 python main.py
按下 Save Job,就完成定時爬蟲的設定啦~
完成 (ง •̀_•́)ง ❤