奧運即時比分 LINE 通知 (Python + LINE Notify)

當家裡沒電視、沒辦法看奧運轉播,卻很想知道中華隊現在比數如何的時候,發現 Google 有即時更新的比分,於是打開 F12 看了一下 XHR,有一個開頭是 torspo 的網址一直在送資料,如下圖。

URL = ‘https://www.google.com/async/torspo?ei=wuEEYZkqiLWYBeK8pYAG&yv=3&p3=1&async=emids:%2Fg%2F11fr0b7qvf,id:lu,ctx:%5Bnull%2Cnull%2C%5B%5B%22ev2%22%2C%22clb%22%2C%22tlb%22%2C%22tv%22%2C%22gs2%22%2C%22msv%22%5D%5D%2Cnull%2C1%2Cnull%2C1%2C%5Bnull%2C%5Bnull%2Cnull%2Cnull%2C%22%2Fm%2F05gj2h%22%5D%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2C%5B%22%2Fm%2F0194d%22%5D%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2C%5Bnull%2Cnull%2C%22%2Fm%2F06vvk%22%5D%5D%2C28%2C1%5D,dme:%2Fg%2F11fr0b7qvf,ct:,hl:zh-TW,tz:Asia%2FTaipei,_fmt:jspb’

但這網址除了參數有夠長之外,回應也非常混亂,有很多層的資料,光是解析出來就花了我好多時間,總之比賽國家和比分資訊就是藏在 ["tsp-mr4","tsp-vm"] 這個的後面,就用 regex 加上一些簡單的資料清理把它們抓出來:

def get_data(URL):

    resp =  requests.get(URL)
    
    pat = r"(?<=\[\[\[\"tsp-mr4\",\"tsp-vm\"]).+(?=,\[null,\[\[\"tsp-mr4\")"
    x = re.findall(pat, resp.text)
    x = str(x)
    scores = re.sub(r'\[|\]|null|"|tsp-mr4|tsp-vm|,', ' ', x)
    
    clean = scores.replace('-       0  ', '\n').replace('             ', ' ')
    clean = clean.replace('\n', '比').replace('    ', '\n')
    
    return clean.strip()

最後再用 LINE Notify 的網址持續傳送訊息給我:

while True:

    value1 = get_data(URL)
    
    if len(value1) < 1:
        value1 = '比賽結束!'
        trigger_url = f'https://maker.ifttt.com/trigger/{applet}/with/key/{key}?value1={value1}'
        requests.get(trigger_url)
        break
    
    else:
        trigger_url = f'https://maker.ifttt.com/trigger/{applet}/with/key/{key}?value1={value1}'
        requests.get(trigger_url)
        time.sleep(15)

至於串接 LINE Notify 和 IFTTT 的方法網路上應該有很多教學,我這邊就先跳過,之後有時間或是有讀者要求的話我再來寫。

簡單來說,LINE Notify 和 IFTTT 重點在於取得 applet 和自己的 key,我是把它們跟一開始提到的 torspo 那個網址一起放在 settings.py 另外填入:

applet = 'Your Applet Name'
key = 'Your IFTTT Key'  # Go To https://ifttt.com/maker_webhooks/settings

但這個 URL 僅限該場比賽使用,還沒有找到方法可以自動抓現在正在進行的比賽,若有任何解決方法的話很歡迎各路高手前輩的協助與交流,目前測試看起來網址參數有幾個是比較重要的:

  • async,其值為:
    • emids:/g/11fr0b7qvf (註:%2F=/)
    • id:lu
    • _fmt:jspb
  • 有些需要、但有些卻不需要的參數:
    • yv=3
    • p3=1

最後收到的 LINE 通知截圖大概是這樣:

以上就是個人純娛樂性質的奧運即時比分 LINE 通知,我有把程式碼放在 GitHub 上,有興趣的話歡迎來看看(前往專案),最後還是要恭喜中華隊這次獎牌數破紀錄啦!台灣加油!

歡迎追蹤我的 Facebook 粉專:https://www.facebook.com/jumpingcoder

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s