[PYTHON] Erstellen Sie eine App, die LINE jeden Morgen über das Wetter informiert

Einführung

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

Verfassung

 2019-12-26 14.41.32.png

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.

Erstellen eines LINE Developer-Kontos und Registrieren einer App

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.

Erstellen Sie ein Konto für die Wetter-API

Lassen Sie mich die OpenWeatherMap-API verwenden

Erstellen Sie hier ein Konto https://home.openweathermap.org/users/sign_up

Code, um das Wetter zu erhalten und an LINE zu senden

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

 2019-12-25 15.30.35.png

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.

So senden Sie eine Nachricht an mehrere Personen (Hinzugefügt am 28.12.2019)

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

Bereiten Sie eine Rückruffunktion vor

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

Webhook-URL abrufen

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.

Webhook-URL-Einstellungen

Sie kann auf dem Verwaltungsbildschirm von LINE Developer wie folgt eingestellt werden

 2019-12-28 23.14.45.png Es ist in Ordnung, wenn Sie Verify ausführen und SUCCESS erhalten

Übrigens setzen Sie auf demselben Bildschirm auch Folgendes auf Deaktiviert

 2019-12-28 23.16.18.png

Funktionsprüfung

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.

Der Code wurde geändert, um von Python zu LINE zu wechseln

#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.

Laufen Sie regelmäßig

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.

schließlich

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

Erstellen Sie eine App, die LINE jeden Morgen über das Wetter informiert
LINE Bot, der Sie über die interessierenden Aktien informiert
Ich habe mit Lambda eine App erstellt, die LINE über die Qiita-API über "Likes" informiert.
Erstellen Sie eine App, die Schüler mit Python errät
Mit LINEBot habe ich eine Anwendung erstellt, die mich über die "Buszeit" informiert.
Erstellen Sie mithilfe der COTOHA-API eine App, die gut mit Berichten von Personen funktioniert
So erstellen Sie einen Artikel über die Befehlszeile
Erstellen Sie eine App, die Schüler mit der Python-GUI-Version errät
Erstellen wir eine App, die OIDC mit Azure AD authentifiziert
Ich habe einen Linienbot erstellt, der das Geschlecht und das Alter einer Person anhand des Bildes errät
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
(Python) Ich habe eine App von Trello erstellt, die regelmäßig über das Auslaufen von Aufgaben informiert, die bald ablaufen.
Eine Erweiterung von Kivys Mal-App
Heroku-Bereitstellung der ersten Django-App, von der Anfänger abhängig sind
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
[Python] Ich habe eine App erstellt, die automatisch die Audiodatei jedes Wortes herunterlädt, das für die Englisch-Lern-App verwendet wird.
Erstellen Sie eine einfache App, die die Fetch-API für Ajax-Anforderungen in Flask enthält, und erklären Sie sie schnell.
Erstellt einen Slack-Bot, der AWS Lambda über das Ablaufdatum eines SSL-Zertifikats bestätigt und benachrichtigt