できあがりはこんな感じになりました。
聞いたことのない地名などにも対応しています。
地名→Geocoder→DarkSkyでこぼれなければ表示されます。
個人的にはボストーク基地はいつもチェックしたくなります。
参照したQiitaのページ、アカウント等の取得手順、
Herokuへのデプロイなど徐々に補筆していきます。
環境等について
・Windows10
・python 3.7.5
・Heroku
・Git
・Line 開発者アカウント
・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が代替として使えるか今後、要検証。