Ich habe ein 2-jähriges Kind, also schaue ich jeden Morgen E-Tele, aber das Wetter kommt nicht über E-Tele heraus. Ich wechsle die Kanäle hin und her zu Nachrichtensendungen, um das Wetter zu überprüfen. Daher werde ich eine einfache App erstellen, die das Wetter von der Wetter-API abruft und an LINE weiterleitet. Es ist eine Zeit zum Jahresende Natürlich im freien Bereich
Ich habe noch nie GitHub-Aktionen verwendet, also probiere ich es aus Da ich jedoch nur die Cron-Funktion verwende, denke ich, dass die GAS-Triggerfunktion einfacher und besser ist, wenn dies alles ist.
Von hier aus erstellt https://developers.line.biz/ja/services/messaging-api
Da auf dem Verwaltungsbildschirm von LINE Developer ein QR-Code der Anwendung registriert ist, registrieren Sie ihn als Freund.
Lassen Sie mich die OpenWeatherMap-API verwenden
Erstellen Sie hier ein Konto https://home.openweathermap.org/users/sign_up
import os
import json
import pandas as pd
from dotenv import load_dotenv
from urllib.request import urlopen
from datetime import datetime
from pytz import timezone
from linebot import LineBotApi
from linebot.models import TextSendMessage
def get_weather_icon(icon_str):
if icon_str == "01d" or icon_str == "01n":
return "☀️"
elif (
icon_str == "02d"
or icon_str == "02n"
or icon_str == "03d"
or icon_str == "03n"
or icon_str == "04d"
or icon_str == "04n"
):
return "☁️"
elif (
icon_str == "09d" or icon_str == "09n" or icon_str == "10d" or icon_str == "10n"
):
return "☂️"
elif icon_str == "11d" or icon_str == "11n":
return "⚡️"
elif icon_str == "13d" or icon_str == "13n":
return "☃️"
else:
return ""
def send_to_line(df):
texts = []
for k, v in df:
texts.append(f"【{k}】")
for _, d in v.iterrows():
texts.append(
f"{d['time']}Zeit{get_weather_icon(d['icon'])} {d['temp']}(℃) {d['rain']}(mm/3h)"
)
texts.append("")
line_bot = LineBotApi(os.getenv("LINE_ACCESS_TOKEN"))
line_bot.push_message(
os.getenv("LINE_USER_ID"), TextSendMessage(text="\n".join(texts))
)
def main():
url = "http://api.openweathermap.org/data/2.5/forecast"
id = os.getenv("OWM_PLACE_ID")
api_key = os.getenv("OWM_API_KEY")
res = urlopen(f"{url}?id={id}&appid={api_key}&lang=ja&units=metric").read()
res_json = json.loads(res)
arr_rj = []
for rj in res_json["list"]:
conv_rj = {}
timestamp = timezone("Asia/Tokyo").localize(datetime.fromtimestamp(rj["dt"]))
conv_rj["date"] = timestamp.strftime("%m/%d %a")
conv_rj["time"] = timestamp.strftime("%H")
conv_rj["description"] = rj["weather"][0]["description"]
conv_rj["icon"] = rj["weather"][0]["icon"]
conv_rj["temp"] = round(rj["main"]["temp"])
conv_rj["rain"] = round(rj["rain"]["3h"], 1) if "rain" in rj else 0
arr_rj.append(conv_rj)
send_to_line(pd.DataFrame(arr_rj).groupby("date"))
load_dotenv()
main()
Wenn Sie den obigen Code ausführen, wird die zuvor registrierte App wie folgt benachrichtigt
Da es viele Prozesse gibt, die Nachrichten verarbeiten, ist es ziemlich lang, wenn Sie nur den Code betrachten, aber wenn Sie nur die Erfassung von Wetterinformationen verarbeiten und auf LINE drücken, wird dies wie folgt sein Ich verwende python-dotenv, um sichere Informationen wie Token in Umgebungsvariablen festzulegen.
Rufen Sie Wetterinformationen (JSON-Format) von der OpenWeatherMap-API ab
def main():
url = "http://api.openweathermap.org/data/2.5/forecast"
id = os.getenv("OWM_PLACE_ID")
api_key = os.getenv("OWM_API_KEY")
res = urlopen(f"{url}?id={id}&appid={api_key}&lang=ja&units=metric").read()
...
Dieses Mal wollte ich nur das Wetter nur dort wissen, wo ich wohne, also habe ich die ID des Gebiets, in dem ich wohne, direkt an den Parameter "id" übergeben.
Sie können die Regions-ID überprüfen, indem Sie city.list.json.gz
von hier herunterladen.
Zusätzlich zu "id" können auch "lat" (Breitengrad), "lon" (longitudinal) und "zip" (Postleitzahl) als Parameter angegeben werden, um das Ergebnis zu erhalten (die App, die ich dieses Mal erstellt habe, unterstützt dies. Ist nicht)
Sie können den API_KEY von [hier] aus überprüfen (https://home.openweathermap.org/api_keys).
Senden Sie eine Nachricht an LINE
def send_to_line(df):
...
line_bot = LineBotApi(os.getenv("LINE_ACCESS_TOKEN"))
line_bot.push_message(
os.getenv("LINE_USER_ID"), TextSendMessage(text="Hello")
LINE_ACCESS_TOKEN kann über den Verwaltungsbildschirm von LINE Developer ausgegeben werden Sie können LINE_USER_ID auch auf demselben Verwaltungsbildschirm überprüfen.
Zum Zeitpunkt des Schreibens dieses Artikels dachte ich, dass jeder, der die erstellte Wetter-App als Freund registriert hat, über die Nachricht benachrichtigt wird, aber mit der oben beschriebenen Methode wird nur ich über die Nachricht benachrichtigt. (Es tut mir leid, ich habe es geschafft, ohne diesen Bereich überhaupt zu überprüfen.)
Schreiben Sie eine Prozedur, die Sie an andere Personen als Sie selbst senden möchten Um an eine andere Person als Sie selbst zu senden, müssen Sie nur die Benutzer-ID des Absenders kennen, dies ist jedoch etwas mühsam.
Wenn eine Person, die die Benutzer-ID wissen möchte, eine App als Freund registriert, sendet Line eine Post-Anfrage an die hier vorbereitete Rückruffunktion und bestätigt sie in dieser Funktion. Ich denke, es gibt verschiedene Möglichkeiten, aber ich werde so schreiben, wie ich es unten getan habe
Hergestellt mit GAS
var SLACK_ACCESS_TOKEN = ''
function doPost(e) {
SlackApp.create(SLACK_ACCESS_TOKEN).postMessage(
'#event-line',
JSON.stringify(e),
{ username: 'kurosame-gas' }
)
}
Sie können es auch mit "console.log (e)" überprüfen. Da es jedoch schwierig ist, GAS zu öffnen und jedes Mal zu überprüfen, benachrichtige ich Slack.
Informationen wie UserID sind in e
enthalten
Sie können als Web-API über "Veröffentlichen-> Als Webanwendung bereitstellen" im GAS-Bildschirm veröffentlichen. Zu diesem Zeitpunkt sollte der Offenlegungsbereich "jeder (einschließlich anonym)" sein Notieren Sie sich die App-URL, die beim Veröffentlichen auf dem Bildschirm angezeigt wird.
Sie kann auf dem Verwaltungsbildschirm von LINE Developer wie folgt eingestellt werden
Es ist in Ordnung, wenn Sie Verify ausführen und SUCCESS erhaltenÜbrigens setzen Sie auf demselben Bildschirm auch Folgendes auf Deaktiviert
Wenn Sie ein Zeichen auf dem Gesprächsbildschirm der von Ihnen erstellten Linien-App senden und das Zeichen und die Informationen wie Ihre Benutzer-ID Slack erreichen, sind Sie erfolgreich. Wenn jemand anderes Ihre App als Freund registriert, wird Slack benachrichtigt, damit Sie die Benutzer-ID dieser Person erhalten.
#Vorher ändern
line_bot.push_message(
os.getenv("LINE_USER_ID"), TextSendMessage(text="\n".join(texts))
)
#Nach der veränderung
line_bot.multicast(
os.getenv("LINE_USER_ID").split(","), TextSendMessage(text="\n".join(texts))
)
Legen Sie die Benutzer-ID für LINE_USER_ID durch Kommas getrennt fest.
Verwenden Sie die Cron-Funktion von GitHub-Aktionen, um das Wetter so einzustellen, dass es jeden Morgen um 7 Uhr morgens benachrichtigt wird
Unten finden Sie die Yaml-Datei, die Actions lädt
Sie können GitHub-Aktionen verwenden, indem Sie die folgenden Dateien im Verzeichnis .github / workflows
im Stammverzeichnis ablegen.
name: Weather
on:
schedule:
- cron: '00 22 * * *' # UTC
jobs:
weather:
name: Run weather
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Setup Python
uses: actions/setup-python@v1
with:
python-version: 3.7
- name: Install Pipenv
uses: dschep/install-pipenv-action@v1
- name: Install dependencies
run: pipenv sync
- name: Run weather
env:
OWM_PLACE_ID: ${{ secrets.OWM_PLACE_ID }}
OWM_API_KEY: ${{ secrets.OWM_API_KEY }}
LINE_ACCESS_TOKEN: ${{ secrets.LINE_ACCESS_TOKEN }}
LINE_USER_ID: ${{ secrets.LINE_USER_ID }}
run: pipenv run python3 ./bots/weather.py
Da wir Umgebungsvariablen in unserem Python-Code verwenden, müssen wir sie auf dem Actions-Server verfügbar machen. Sie können Umgebungsvariablen, die in Aktionen verwendet werden können, über die Registerkarte "Einstellungen"> "Geheimnisse" im GitHub-Repository festlegen. Und wie oben erwähnt, verwenden wir den geheimen Kontext, damit Läufer Umgebungsvariablen verwenden können.
Nachdem ich es verwendet hatte, war ich ein wenig besorgt, dass der Zeitpunkt der Workflow-Ausführung etwa 5 bis 6 Minuten später liegt als die von cron angegebene Zeit.
Meine Frau verwendet normalerweise LINE, daher scheint es, dass diese App verwendet wird. (Als ich die Memo-App verwendet habe, die zuvor mit Slack betrieben werden kann, war es schwierig, Slack zu starten, und ich habe die Verwendung eingestellt.)
Der diesmal implementierte Code ist unten angegeben https://github.com/kurosame/bots-python
Recommended Posts