python:LineNotifyで天気予報をスクレイピングして定期的に通知させる
LineNotifyを使うと、自作のプログラムの結果をlineに送付することができます。今回は、天気予報をスクレイピングするコードを記載し、定期的にLineに天気予報通知がいくようなコードを簡単に書いてみましょう。
おおまかな流れは簡単に下記の2点になります。
①LineAPIの登録。アクセストークンの発行
②プログラムを記載
LineNotifyでアクセストークンの発行
【参考】
メッセージを送ってみる
import requests
url = "https://notify-api.line.me/api/notify"
access_token = '上記で取得したアクセストークンを入力'
headers = {'Authorization': 'Bearer ' + access_token}
def send(message):
params = {'message': message}
r = requests.post(url, headers=headers, params=params,)
def main():
send("こんにちは田村です")
if __name__ == "__main__":
main()
画像を送信する
import requests
url = "https://notify-api.line.me/api/notify"
access_token = '上記で取得したアクセストークンを入力'
headers = {'Authorization': 'Bearer ' + access_token}
def send(message):
params = {'message': message}
path = "gu.png"
files = {'imageFile': open(path, 'rb')}
r = requests.post(url, headers=headers, params=params, files=files,)
def main():
send("画像を送信")
if __name__ == "__main__":
main()
スタンプを送信する
import requests
url = "https://notify-api.line.me/api/notify"
access_token = '上記で取得したアクセストークンを入力'
headers = {'Authorization': 'Bearer ' + access_token}
def send(message):
params = {'message': message, 'stickerId': 1, 'stickerPackageId': 1}
r = requests.post(url, headers=headers, params=params,)
def main():
send("スタンプを送信")
if __name__ == "__main__":
main()
スタンプは、stickerIdとstickerPackageIdで管理されているようです。
上記URLから選択
定期実行してみる
import requests
import os
import schedule
import time
def job():
url = "https://notify-api.line.me/api/notify"
access_token = '上記で取得したアクセストークンを入力'
headers = {'Authorization': 'Bearer ' + access_token}
message = "5分置きに実行してます"
params = {'message': message, 'stickerId': 1, 'stickerPackageId': 1}
r = requests.post(url, headers=headers, params=params,)
schedule.every(5).minutes.do(job)
while True:
schedule.run_pending()
time.sleep(1)
天気予報スクレイピングの自動実行
import requests
import schedule
import time
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
def job():
#天気データ取得
data = []
url = "https://www.jma.go.jp/jp/yoho/331.html"
html = urlopen(url)
bs = BeautifulSoup(html, "html.parser")
location = bs.select("title")[0].get_text()[13:]
weather = bs.find("td", {"class":"info"}).get_text()
data.append(location)
data.append(weather)
#LineNotify
url = "https://notify-api.line.me/api/notify"
access_token = '上記で取得したアクセストークンを入力'
headers = {'Authorization': 'Bearer ' + access_token}
message = data
params = {'message': message, 'stickerId': 1, 'stickerPackageId': 1}
r = requests.post(url, headers=headers, params=params,)
schedule.every(5).minutes.do(job)
while True:
schedule.run_pending()
time.sleep(1)
テストで5分置きに設定しています。また、プログラムを実行し続けないといけないので実用性はあまりないという点をご了承ください。