【LINEbot】天気予報くんをつくる(その1 天気予報を取得)
目的
Pythonを用いたLINEbot開発を通して、スクレイピング・データベースまわりを理解する
開発するもの
天気予報くん
各地域の天気予報を教えてくれるLINEbot
開発環境
- Ubuntu 18.04
- Python 3.6.9
- Pipenv
- Flask 1.1.1
- Line-bot-sdk 1.16.0
- Heroku
- PostgreSQL
APIを叩く
お天気Webサービス
お天気Webサービス(Livedoor Weather Web Service / LWWS)は、現在全国142カ所の今日・明日・あさっての天気予報・予想気温と都道府県の天気概況情報を提供しています。
※すでにサービス終了しています(2021年3月追記)
ファイル構成
. ├── main.py ├── Pipfile ├── Pipfile.lock ├── Procfile └── weather.py
main.py
from flask import Flask, request, abort from linebot import ( LineBotApi, WebhookHandler ) from linebot.exceptions import ( InvalidSignatureError ) from linebot.models import ( MessageEvent, TextMessage, TextSendMessage ) import os import weather as wt app = Flask(__name__) LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"] LINE_CHANNEL_SECRET = os.environ["LINE_CHANNEL_SECRET"] line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN) handler = WebhookHandler(LINE_CHANNEL_SECRET) @app.route("/callback", methods=['POST']) def callback(): signature = request.headers['X-Line-Signature'] body = request.get_data(as_text=True) app.logger.info("Request body: " + body) try: handler.handle(body, signature) except InvalidSignatureError: abort(400) return 'OK' @handler.add(MessageEvent, message=TextMessage) def handle_message(event): # message = event.message.text city_num = '400040' message = wt.get_weather_info(city_num) line_bot_api.reply_message( event.reply_token, TextSendMessage(text=message)) if __name__ == "__main__": port = int(os.getenv("PORT", 5000)) app.run(host="0.0.0.0", port=port)
weather.py
import requests as rq import json def get_weather_info(city_num): url = 'http://weather.livedoor.com/forecast/webservice/json/v1?' city_params = {'city': city_num} data = rq.get(url, params=city_params) content = json.loads(data.text) content_title = format(content['title']) content_text = format(content['description']['text']) content_time = format(content['description']['publicTime'])\ .replace('T', ' ').replace('-', '/')[:-5] return content_title + '\n\n' + content_text + '\n\n最終更新日時:' + content_time
動作
ユーザーからのメッセージに反応し、福岡県久留米市の天気概況を返す。
つづく