【Python】LINE으로 지명 입력하면 현재의 기온을 가르쳐 주는 bot를 만들어 보았다

완성은 이런 느낌이 되었습니다.
들은 적이 없는 지명등에도 대응하고 있습니다.
지명 → Geocoder → DarkSky로 쏟아지지 않으면 표시됩니다.
개인적으로 보스토크 기지는 항상 확인하고 싶습니다.



참조한 Qiita의 페이지, 계정 등의 취득 순서,
Heroku에의 배포 등 서서히 보필해 갑니다.

환경 등에 대해
・Windows10
· 파이썬 3.7.5
・Heroku
· Git
· 라인 개발자 계정
· Darksky API

작성한 파일은 4개
Procfile
requirements.txt
runtime.txt
python:main.py
web: python main.py

requirements.txt
Flask==1.1.1
line-bot-sdk==1.16.0
geocoder==1.38.1

runtime.txt
python-3.7.5

main.py

from flask import Flask, request, abort
import os
#以下おためし
#import time
import requests
import geocoder
#import tweepy
#以上おためし

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

app = Flask(__name__)

#環境変数取得
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

@app.route("/")
def hello_world():
    return "hello world!"

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
#0327追加
    place = event.message.text
    ret = geocoder.osm(place, timeout=5.0)
#darkskyにpostするため取得ジオデータから不要なカッコを削除
    locate = str(ret.latlng)
    locate2 = locate.replace('[','')
    locate3 = locate2.replace(']','')
#取得希望地をpost url0はSI単位指定で摂氏にする
    url0='?units=si'
    url1='https://api.darksky.net/forecast/*API_KEY*/'
    url2=url1 + locate3 + url0
#JSON形式で取得
    data=requests.get(url2).json()
    data2=data['currently']['temperature']
    word=str(data2)
    word += " ℃ デス"
#以下2行で緯度経度の表示追加 2020_04_11
    word += "\n\n緯度経度は\n"
    word = word + locate
#0327

    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=word))
#0327        TextSendMessage(text=event.message.text))

if __name__ == "__main__":
#    app.run()
    port = int(os.getenv("PORT"))
    app.run(host="0.0.0.0", port=port)

에러 등에 대해서는 미처리입니다.
그 가자.

2020년 4월 시점의 정보
DarkSky는 Apple에 인수되어 API의 신규 접수는 종료.
서비스도 2021년 말까지라는 것(울음)
OpenWetherMap의 API를 대체로 사용할 수 있는지 앞으로 중요한 검증.

좋은 웹페이지 즐겨찾기