2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JR西日本・近畿の指定路線の1分以上遅延のある電車を通知する

Last updated at Posted at 2019-08-26

前回
https://qiita.com/k_kado__j_ichi/items/7081bc62618bef32eb0e
の続きです

beautiful soupに路線名とデータの一覧を作ってもらいます

> pip install bs4

https://www.train-guide.westjr.co.jp/area_kinki.html
の左側にあるメニューから路線名とリンク先を取得してjson用に書き換えます

.py
#jsonここにある
jsonbase = 'https://www.train-guide.westjr.co.jp/api/v3/'

#近畿各路線のjson特定
try:
    pages = requests.get('https://www.train-guide.westjr.co.jp/area_kinki.html')
    pages.raise_for_status()
    soup = bs4.BeautifulSoup(pages.content, "html.parser")
    for i in soup.select(".routeList_item-link"):
        linename = i['title']
        lineurl = i['href'].replace('.html','.json')
        line[linename] = lineurl
except:
    #何もせず終了する
    pass
url = jsonbase + line[args[1]] 
url_st = url.replace('.json','_st.json')

取れた近畿各路線名は以下の通りです

北陸線・琵琶湖線
JR京都線
JR神戸線・山陽線
赤穂線
湖西線
奈良線
嵯峨野線
山陰線
山陰線
おおさか東線
JR宝塚線
JR宝塚線・福知山線
JR東西線
学研都市線
播但線
舞鶴線
大阪環状線
JRゆめ咲線
大和路線
阪和線・羽衣線
関西空港線

のでオプションに路線名を指定すると遅延情報が返ってくるようにしました

delaycheck.py

import json
import urllib.request
import requests, bs4
import sys

args = sys.argv

dictst = {}
dictline = {}
payloadstr = ''
line = {}

#jsonここにある
jsonbase = 'https://www.train-guide.westjr.co.jp/api/v3/'

#近畿各路線のjson特定
try:
    pages = requests.get('https://www.train-guide.westjr.co.jp/area_kinki.html')
    pages.raise_for_status()
    soup = bs4.BeautifulSoup(pages.content, "html.parser")
    for i in soup.select(".routeList_item-link"):
        linename = i['title']
        lineurl = i['href'].replace('.html','.json')
        line[linename] = lineurl
except:
    #何もせず終了する
    pass
url = jsonbase + line[args[1]]
url_st = url.replace('.json','_st.json')

#遅延取得
try:
    res = urllib.request.urlopen(url)
    res_st = urllib.request.urlopen(url_st)
    data = json.loads(res.read().decode('utf-8'))
    data_st = json.loads(res_st.read().decode('utf-8'))

    for station in data_st['stations']:
        dictst[station['info']['code']] = station['info']['name']
    for item in data['trains']:
        if item['delayMinutes'] > 0:
            stn = item['pos'].split('_')
            try:
                position = dictst[stn[0]] + '辺り'
            except KeyError:
                position = "どこかよくわかんない"
            payload = [item['displayType'], item['dest']['text'],'行き:',item['delayMinutes'],'分遅れ',position]
            payloadstr += ' '.join(map(str,payload)) + '\n'
    if not payloadstr:
        print(args[1] + 'に電車遅延はありません')
    else:
        print('' + args[1] + 'の遅延情報】\n' + payloadstr)

except urllib.error.HTTPError as err:
    print('HTTPError: ', err)
except json.JSONDecodeError as err:
    print('JSONDecodeError: ', err)
>delaycheck.py JR神戸線・山陽線

出力結果

【JR神戸線・山陽線の遅延情報】
普通 新三田 行き: 1 分遅れ 新大阪辺り
普通 京都 行き: 1 分遅れ 元町辺り
普通 西明石 行き: 1 分遅れ 鷹取辺り
普通 新見 行き: 1 分遅れ 上郡辺り

あとは

> pip install slackweb
.py
import slackweb
slack = slackweb.Slack(url="https://hooks.slack.com/services/~~~~~~~~~~")
.
.
.

    if not payloadstr:
        slack.notify(text = args[1] + 'に電車遅延はありません')
    else:
        slack.notify(text = '' + args[1] + 'の遅延情報】\n' + payloadstr)

とかで毎朝通勤前にSlackに投げるとかLINEに投げるとか・・・
このままではアレなのでスマホから使えるようにするとかもうちょっと使い勝手を良くしたい

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?