みなさんこんにちは。
その2で完成したプログラムを実行すると、前回取得したトピックスと比較して、新しいトピックスがある場合は画面に表示されました。しかしこのままではいちいち手動で実行する必要があり、全く便利ではありません。
定期的に自動でプログラムを実行してくれて、さらにスマホでプッシュ通知を受け取れるようにその2のプログラムを改良していきます。
プッシュ通知には最初Gmailを使おうと考えていましたがもっと簡単なものがありました。LINEのAPIを利用します。
アクセストークンを発行してプログラムに張り付けるだけ。衝撃の簡単さ。自分だけでなくグループに対しても発行できるので情報共有などにも使えます。LINEすごい。通知は「LINE Notify」というボットが行います。
さて、次は「定期的に自動でプログラムを実行する」という部分。
私のパソコンだけでプログラムを動かすのであればbatファイルを使えば良いのですが、どうせならPythonの実行環境がないところで動かしたい!ということでpyファイルをexeファイルに変換することにしました。ツールがいくつかあるようですが、私の使用しているPython3.6では「pyinstaller」をインストールしたら変換できました。
その2をちょこっと改良したものが↓です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
import requests from bs4 import BeautifulSoup import sys #sys.exit()を利用するために必要 #テキストファイルから前回のトピックスを集合として展開する f = open('hogehoge.txt','r') #ファイル読み込み f_old = f.read() list_old = f_old.splitlines() #文字列を改行ごとにリスト化 set_old = set(list_old) #リストを集合に変換 f.close() # ファイルを閉じる #その1の処理 url = 'http://news.yahoo.co.jp/' res = requests.get(url) soup = BeautifulSoup(res.text,"html.parser") for s in soup("span"): s.decompose() #spanタグを抜き出して削除 list_new = [] #空のリスト作成 h1s = soup.find_all("h1",class_="ttl") for h1 in h1s: list_new.append(h1.text +' '+ h1.a.get('href')) ps = soup.find_all("p",class_="ttl") for p in ps: list_new.append(p.text +' '+ p.a.get('href')) set_new = set(list_new) #リストを集合に変換 set_dif = set_new - set_old #差集合を求める #差集合がなければ処理終了 if len(set_dif) == 0: sys.exit() #以降の処理には進まず終了 #差集合があればリストとして取り出す else: newlist = list(set_dif) LINE_message = '\n'.join(newlist) # LINE Notify ここから def LineNotify(message): line_notify_token = "アクセストークン" #自分で取得したアクセストークンを記述 line_notify_api = "https://notify-api.line.me/api/notify" payload = {"message": message} headers = {"Authorization": "Bearer " + line_notify_token} requests.post(line_notify_api, data=payload, headers=headers) message = '新しいトピックスです\n' + LINE_message LineNotify(message) # LINE Notify ここまで string = "\n".join(list_new) #リスト内の文字列を改行して結合 f = open('hogehoge.txt', 'w') #書き込みモードで開く f.write(string) #引数の文字列をファイルに書き込む f.close() #ファイルを閉じる |
前回まではトピックスの文字列だけを取得していましたが、今回は文字列+URLをまとめて1つの要素として管理することにしました。24,28行のところです。(間に空白を入れないとLINE側がURLと判断してくれず、直接クリックでリンクに飛べません)
37行「差集合があればリストとして取り出す」部分、前回は直接画面に表示していましたが、文字列として取り出してLINE_messageに渡します。42~53行のLINE API部分はリンクからのほぼコピペ。アクセストークンはご自分で取得したものをそのまま貼り付けてください。
hogehoge.txtの中身を開くとこんな感じです。
1 2 3 4 5 6 7 8 |
台風 関東に9日明け方最接近 https://news.yahoo.co.jp/pickup/6292767 台風 関東の交通情報をみる https://news.yahoo.co.jp/pickup/6292764 翁長知事の辞職 副知事は否定 https://news.yahoo.co.jp/pickup/6292768 入社前でも昇給 社内格差の今 https://news.yahoo.co.jp/pickup/6292737 カミキリ駆除策 捕獲で500円 https://news.yahoo.co.jp/pickup/6292751 昨年V花咲徳栄 ヒヤヒヤ勝利 https://news.yahoo.co.jp/pickup/6292771 元ジャックス 水橋春夫氏死去 https://news.yahoo.co.jp/pickup/6292775 徳永アナ 13年ぶり報ステ復帰 https://news.yahoo.co.jp/pickup/6292763 |
pyファイルを実行したら、ご自分のスマホにLINE Notifyから新しいトピックスのメッセージが届くはずです。便利~!
うまく実行できたpyファイルを、上に記載したリンク先を参考にしてexeファイルに変換します。私は実行中かどうかを確認したいので、引数は–onefileだけにしました。変換したexeファイルとhogehoge.txtは同じフォルダに入れておきexeファイルをダブルクリックすると同じようにLINEに通知がいくはずです。
最後に、exeファイルを定期的に実行するにはWindowsのタスクスケジューラを利用します。
私が説明するまでもありませんね 笑。お好みの間隔で実行するよう設定すれば完了!お疲れ様でした。次は何をしようかな~。