通過 Github Action 實現定時推送天氣預報

偶然間,看到 GitHub Actions 教程:定時發送天氣郵件 - 阮一峰的網絡日志 這篇文章,沒錯,這個正好能打發自己的折騰之心,也能通過代碼給生活引入一些變化 。
還是在這里簡單記錄一下實現過程吧 。
第一步 獲取天氣預報出現問題按照阮一峰的教程走,一開始使用了 wttr 的結果作為數據來源,也在 文檔 上研究了很久,最終的結果總是不盡如人意 。
最終展現到郵件上的結果如下:

通過 Github Action 實現定時推送天氣預報

文章插圖
從上面就可以看出一些問題:
  • 展示到郵件中的是一個 HTML 頁面 , 白色的背景使得結果展示不理想
  • 默認返回的結果比較多,根據配置做調整之后返回的結果又比較少,結果不盡如人意
  • 從頁面上看返回的都是不太好理解的單位,不能讓人一眼就能理解
  • ......
其實還有很多問題,最主要的原因還是其 API 的結果更符合國外的理解 , 而不適合我用 。
第二步 尋找新的數據來源通過在網上尋找,最終找到了一個 墨跡天氣 的 API 作為數據來源,雖然沒有找到出處,但是暫時還可用 。
其返回的結果是一個 JSON 對象,可根據自己的需求去組裝 。下面是返回的示例:
{"code": 0,"msg": "操作成功","data": {"total": 7,"sourceName": "墨跡天氣","list": [{"city": "廣州","lastUpdateTime": "2022-10-13 08:55:08","date": "2022-10-13","weather": "晴","temp": 20.0,"humidity": "35%","wind": "東北風3級","pm25": 29.0,"pm10": 43.0,"low": 20.0,"high": 30.0,"airData": "43","airQuality": "優","dateLong": 1665590400000,"weatherType": 0,"windLevel": 3,"province": "廣東"},{"city": "廣州","lastUpdateTime": "2022-10-13 08:00:00","date": "2022-10-14","weather": "晴","humidity": "未知","wind": "微風","pm25": 0.0,"low": 21.0,"high": 30.0,"airData": "80","airQuality": "良","dateLong": 1665676800000,"weatherType": 0,"windLevel": 1,"province": "廣東"},{"city": "廣州","lastUpdateTime": "2022-10-13 08:00:00","date": "2022-10-15","weather": "晴","humidity": "未知","wind": "北風","pm25": 0.0,"low": 21.0,"high": 31.0,"airData": "80","airQuality": "良","dateLong": 1665763200000,"weatherType": 0,"windLevel": 3,"province": "廣東"},{"city": "廣州","lastUpdateTime": "2022-10-13 08:00:00","date": "2022-10-16","weather": "多云","humidity": "未知","wind": "北風","pm25": 0.0,"low": 22.0,"high": 32.0,"airData": "70","airQuality": "良","dateLong": 1665849600000,"weatherType": 1,"windLevel": 4,"province": "廣東"}],"logoUrl": "http://iflycar.hfdn.openstorage.cn/xfypicture/dev/logo/moji.png"}}根據上述的返回結果,簡單組裝了一個自己想要的結果:
【通過 Github Action 實現定時推送天氣預報】位置:廣東-廣州今天:2022-10-11當前:15.0°C最低:15.0°C最高:26.0°C空氣質量:優濕度:29%風向:東北風4級PM2.5:17.0位置:廣西-桂林今天:2022-10-11當前:11.0°C最低:11.0°C最高:25.0°C空氣質量:優濕度:30%風向:北風5級PM2.5:23.0實際上是非常簡陋的,但卻也暫時夠用了,后續有相關的需求再加內容上去 。
第三步 通過腳本簡化解決了數據來源和展示文本之后,其實已經是解決了需求端的問題,然后來到程序員的實現端 。
現在,我們先將需求做拆解,落實到程序上應該有以下工作要做:
  • 通過 API 獲取到數據來源 , 組裝成推送的文本格式
  • 定時觸發,可以通過 Github Action 白嫖
  • 發送郵件 , 可以通過 QQ 郵箱白嫖
上述工作中的第一步,我最終是選擇使用 Python 對其腳本化 , 代碼如下:
import sysimport requestsdef generate_weather_text(weather: dict) -> str:ret = [f'位置:{weather.get("province")}-{weather.get("city")}今天:{weather.get("date")}',f'當前:{weather.get("temp")}°C最低:{weather.get("low")}°C最高:{weather.get("high")}°C',f'空氣質量:{weather.get("airQuality")}濕度:{weather.get("humidity")}',f'風向:{weather.get("wind")}PM2.5:{weather.get("pm25")}',]return '\n'.join(ret)def get_weather(city: str) -> dict:url = 'http://autodev.openspeech.cn/csp/api/v2.1/weather'params = {'openId': 'aiuicus','clientType': 'android','sign': 'android','city': city,}res = requests.get(url, params=params).json()return res['data']['list'][0]def get_weather_text(city: str) -> str:weather = get_weather(city)return generate_weather_text(weather)if __name__ == '__main__':if len(sys.argv) >= 2:ret = [get_weather_text(_) for _ in sys.argv[1:]]print('\n\n'.join(ret))else:print('請求參數錯誤')第四步 配置 Github ActionGithub Action 的配置文件趨同于阮一峰的教程,下面是這個配置文件的一些解釋 。

推薦閱讀