Python 一個 line notify,通知今天氣溫。

使用 Python 寫一個 line 通知(本篇練習使用天氣 API)

Molly Chi
9 min readDec 9, 2021

最近天氣變化好大,每天起床都要問 siri 今天幾度選擇衣服,懶懶如我決定化主動為被動,寫一個 line notify 主動發訊息通知。這篇會詳細紀錄從0到完成,避免未來的自己失憶想不起來怎麼做,如果剛好對你有幫助就更好了٩(ˊᗜˋ )و。

大綱

寫一個新專案大致有幾個步驟

  • 找到需要的資料(api, line 說明文件)
  • 在 github 創一個 repo
  • 寫 code
  • build 到伺服器讓程式可以一直 run

將會學到 python

  • 如何抓取 api 資料
  • 如何取得 dict 內層資料
  • 如何華氏溫度轉攝氏溫度
  • 如何使用 line notify

前製作業

  1. 在 github 創 repo
  2. clone 到自己的電腦
  3. 新增一個 main.py (我的環境為 Ubuntu 20.04.3 , python3.8)
  4. 找 api 的時候覺得中央氣象局的不太好用,後來找到 openweathermap 這個網站,創一個帳號然後點 my api 新增一個 api key
openweathermap 官方網站

coding ~~~~~~~~~~

取得資料

  1. 安裝套件 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 json
APIKEY="你的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}")
print

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

  1. login line notify 登入 > profile 個人頁面
    https://notify-bot.line.me/zh_TW/
  2. 點 發行權杖(創一個只有自己跟 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

200 OK!
line

讓程式定期執行

安裝套件 pip3 install schedule

測試一下怎麼使用

import scheduledef testJob():
print('test')
schedule.every(5).seconds.do(testJob)while True:
schedule.run_pending()
time.sleep(1)
成功runnig

但在寫的時候只要函式帶上參數就會噴一個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 這個服務

  1. 建立 Heroku 帳號 (密碼要有大小寫/數字/符號)
  2. 點 New App
  3. 在電腦安裝 heroku (Ubuntu : sudo snap install --classic heroku
  4. 下指令
# 登入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
竟然一次成功 ya

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,就完成定時爬蟲的設定啦~

完成 (ง •̀_•́)ง ❤

--

--

Molly Chi
Molly Chi

Written by Molly Chi

Molly — Software Developer / 職稱是軟體研發工程師。 什麼都寫,專精於前端及APP (ง•̀_•́)ง ! ❤ 合作發案討論疑難雜症請洽: momolly1024@gmail.com

No responses yet