[PYTHON] Ich habe versucht, ein System zu erstellen, um den Programmführer automatisch zu erfassen → ihn an einem Tag im Kalender zu registrieren

Überblick

Ich wollte eine Geschichte über das posten, was ich gemacht habe, und ich wollte Serverless berühren, also Ich habe versucht, ein System zu erstellen, das den Programmführer meines Lieblingsprogramms ** Mitsuaki Iwagos World Cat Walk ** erfasst, den ich jedes Mal aufzeichne und automatisch im Kalender (Zeitbaum) registriere.

Was wurde verwendet

Es gibt eine NHK-Programmführer-API. Holen Sie sie sich also einmal am Tag, filtern Sie die Daten und registrieren Sie sie bei der Kalender-API. Es gibt einen kostenlosen Dienst namens cron-job.org für die reguläre Ausführung, und ich habe ihn verwendet, weil es einen gibt, der zum angegebenen Zeitpunkt eine Anfrage an die angegebene URL senden kann.

Dieses Mal wollte ich es an einem Tag fertigstellen, also habe ich die Google Cloud-Funktion verwendet, mit der ich das bekannteste Python schreiben kann.

Erstellen

Gefolgt von etwas, das nicht viel Code enthält. Es tut mir Leid.

Zuerst dachte ich darüber nach, eine E-Mail zu senden, indem ich einen Fehler entdeckte, aber als ich die Google Cloud-Funktion untersuchte, bemerkte ich es nachts ... Zuckerberg des Herzens sagte dieses Wort, also habe ich es vorerst erstellt tat.

Programmführererfassung

Zunächst gibt es Spuren von Klassifizierungsversuchen.


# default
import os
from typing import List
from datetime import datetime, timedelta
import json
# from pip
import requests


apikey = os.environ["NHK_API_KEY"]


class NHKApi():
    area = "130"
    genre = "1001"
    base_url = "http://api.nhk.or.jp/v2/pg/genre"
    #NHK-Synthese g1
    #BS Premium s3
    @classmethod
    def url(cls, service: str, date_str: str) -> str:
        url = f"{cls.base_url}/{cls.area}/{service}/{cls.genre}/{date_str}.json"
        return url


def get_g1_data(date_str: str):
    url = NHKApi.url("g1", date_str)
    response = requests.get(url, params={"key": apikey})
    if response.status_code == 200:
        return response.json()
    else:
        return {}


def get_s3_data(date_str: str):
    url = NHKApi.url("s3", date_str)
    response = requests.get(url, params={"key": apikey})
    if response.status_code == 200:
        return response.json()
    else:
        return {}


def check_is_nekoaruki(service: str, program: dict) -> bool:
    """Stellen Sie fest, ob die Programmführungsdaten das Gehen mit der Katze enthalten"""
    is_nekoaruki = False
    try:
        title = program["title"]
        if "Katze geht" in title:
            is_nekoaruki = True
    except KeyError:
        print("data type is invalided")
    return is_nekoaruki


def filter_nekoaruki(service: str, data: dict) -> List[dict]:
    filtered_programs: list = []
    if data and data.get("list"):
        try:
            programs = data["list"][service]
            filtered_programs = [i for i in programs if check_is_nekoaruki(service, i)]
        except KeyError:
            print("data type is invalided")
    return filtered_programs


def get_days() -> List[str]:
    days_ls = []
    dt_format = "%Y-%m-%d"
    search_day = 6  #Holen Sie sich für 6 Tage
    current = datetime.now()

    for i in range(search_day):
        days_ls.append((current + timedelta(days=i)).strftime(dt_format))
    return days_ls


def get_nekoaruki() -> List[dict]:
    days = get_days()
    programs: list = []
    for day in days:
        g1_data = filter_nekoaruki("g1", get_g1_data(day))
        s3_data = filter_nekoaruki("s3", get_s3_data(day))
        one_day_data = g1_data + s3_data
        if one_day_data:
            for data in one_day_data:
                programs.append(data)
    return programs

Kalender hinzugefügt

Auch hier habe ich gerade die Kalender-ID-Erfassung hinzugefügt-> mit registrierten Daten vergleichen->. Ein Sturm des Kompromisses.

class TimeTreeAPI():
    url = "https://timetreeapis.com"
    api_key = os.environ["TIMETREE_API_KEY"]
    headers = {'Authorization': f'Bearer {api_key}',
               "Accept": "application/vnd.timetree.v1+json",
               "Content-Type": "application/json"}


def get_calendar() -> str:
    response = requests.get(TimeTreeAPI.url + "/calendars", headers=TimeTreeAPI.headers)
    if response.status_code == 200:
        data = response.json()
        calendars = data["data"]
        for calendar in calendars:
            #Ich benutze nur einen Kalender, damit der erste Kalender in Ordnung ist
            if calendar["attributes"]["order"] == 0:
                return calendar
            else:
                pass
    else:
        return response.text


def check_upcoming_events(calendar_id: str):
    """Erhalten Sie registrierte Events im Wert von 7 Tagen"""
    response = requests.get(TimeTreeAPI.url + f"/calendars/{calendar_id}/upcoming_events",
                            headers=TimeTreeAPI.headers,
                            params={"days": 7})
    if response.status_code == 200:
        data = response.json()
        return data
    else:
        return None


def convert_to_timetree_style(data: dict, calendar_id: str):
    timetree_dict = {
        "data": {
            "attributes": {
                "title": data["title"],
                "category": "schedule",
                "all_day": False,
                "start_at": data["start_time"],
                "end_at": data["end_time"],
                "description": data["title"] + "\n" + data["content"],
                "location": data["service"]["name"],
                "url": "https://www4.nhk.or.jp/nekoaruki/"
            },
            "relationships": {
                "label": {
                    "data": {
                        "id": f"{calendar_id},1",
                        "type": "label"
                    }
                }
            }
        }
    }
    return timetree_dict


def add_event(data: dict, calendar_id: str):
    """Ereignis an API senden und hinzufügen"""
    json_data = json.dumps(data)
    response = requests.post(TimeTreeAPI.url + f"/calendars/{calendar_id}/events",
                             headers=TimeTreeAPI.headers, data=json_data)
    if response.status_code == 201:
        return True
    else:
        return False


def convert_all(programs: dict, cal_id: str):
    events: list = []
    for program in programs:
        events.append(convert_to_timetree_style(program, cal_id))
    return events


def post_events(data_ls: List[dict], calendar_id: str, registered: List[dict]):
    """Fügen Sie hinzu, indem Sie registrierte Ereignisse mit erfassten Daten vergleichen"""
    add_events: list = []
    title_ls = [i["title"] for i in registered]
    for data in data_ls:
        #Überspringen, wenn der Titel registriert ist
        #Ich kann nicht feststellen, dass sich die Sendezeit seit meiner Registrierung geändert hat, aber nein
        if data["data"]["attributes"]["title"] in title_ls:
            pass
        else:
            add_events.append(data)
    if add_events:
        for event in add_events:
            add_event(event, calendar_id)


def extract_registered_data(data_ls: List[dict]):
    """Extrahieren Sie nur Cat-Walking-Ereignisse aus registrierten Daten"""
    filtered_registered_events = filter(lambda x: "Katze geht" in x["attributes"]["title"], data_ls)
    extracted: list = []
    #Zuerst wollte ich aktualisieren, als sich die Startzeit änderte
    for program in filtered_registered_events:
        extracted.append({"title": program["attributes"]["title"],
                          "start": program["attributes"]["start_at"]})
    return extracted


 def main(request):
     if request.get_json()["hoge"] == "hoge":
         # get programs
         nekoaruki_programs = get_nekoaruki()
         # get cal_id
         cal_id = get_calendar()["id"]
         # get upcoming events
         registered_events = check_upcoming_events(cal_id)["data"]
         # filter upcoming events
         extracted = extract_registered_data(registered_events)
         data_ls = convert_all(nekoaruki_programs, cal_id)
         post_events(data_ls, cal_id, extracted)
         return "success!"
     else:
         return "failed..."

Funktionseinstellungen

Projekt erstellen-> Funktion erstellen-> Code einfügen-> Umgebungsvariablen festlegen usw.

Vergessen Sie nicht, zusätzlich zum API-Schlüssel "TZ = Asia / Tokyo" in die Umgebungsvariable einzufügen und die Zeitzone zu ändern. Requirements == 2.22.0 zur Anforderung.txt hinzugefügt.

スクリーンショット 2020-02-14 21.20.28.png

Geplante Ausführungseinstellungen

Erstellen Sie einfach ein Konto bei cron-job.org und richten Sie einen Job bei Cronjobs-> Create cronjob ein. Sie können auch die zu buchenden Daten festlegen.

スクリーンショット 2020-02-14 21.45.34.png

Zusammenfassung

Es ist peinlich, eine Postleitzahl zu schreiben, in der nur die Funktionen aufgelistet sind ... Ich denke jedoch, dass eines der guten Dinge an Hobbyprodukten ist, dass man sie nur durch Umzug herstellen kann. Es ist schön, alles kostenlos machen zu können.

Es war auch eine gute Ernte, festzustellen, dass es einfach war, eine Umgebung ohne Server zu erstellen.

Damit werden Sie nie die Sendezeit von wandelnden Katzen vergessen. ** Mitsuaki Iwagos World Cat Walk ** Mal sehen.

Recommended Posts

Ich habe versucht, ein System zu erstellen, um den Programmführer automatisch zu erfassen → ihn an einem Tag im Kalender zu registrieren
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe versucht, ein System zu erstellen, das nur gelöschte Tweets abruft
Ein Memorandum beim automatischen Erwerb mit Selen
Ich habe versucht, einen Sender auf der IoT-Plattform "Rimotte" zu registrieren.
Ich möchte den G-Test in einem Monat Tag 1 bestehen
Ich habe den Befehl gegeben, einen farbenfrohen Kalender im Terminal anzuzeigen
Ich habe versucht, eine Site zu erstellen, mit der die aktualisierten Informationen von Azure einfach angezeigt werden können
Ich habe versucht, das automatische Senden einer E-Mail durch Doppelklicken auf das Symbol [Python] zu ermöglichen
Ich habe versucht, den Unterschied zwischen A + = B und A = A + B in Python herauszufinden
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert
Ich habe eine Web-API erstellt
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe ein POST-Skript erstellt, um ein Problem in Github zu erstellen und es im Projekt zu registrieren
Ich habe versucht, das automatische Senden einer E-Mail durch Doppelklicken auf das Symbol [GAS / Python] zu ermöglichen
Machen Sie aus einem Python-Programm einen Daemon und führen Sie es automatisch aus, wenn das Betriebssystem gestartet wird
Als ich versuchte, eine VPC mit AWS CDK zu erstellen, konnte ich es aber nicht schaffen
Als ich in IPython versuchte, den Wert zu sehen, war es ein Generator, also kam ich auf ihn, als ich frustriert war.
Ich habe ein System erstellt, das automatisch entscheidet, ob es morgen mit Python ausgeführt wird, und es zu Google Kalender hinzufügt.
Ein Anfänger des maschinellen Lernens versuchte an einem Tag, eine Sheltie-Urteils-KI zu erstellen
Ich wollte die Anzahl der Zeilen in mehreren Dateien wissen und versuchte, sie mit einem Befehl abzurufen
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
[LPIC 101] Ich habe versucht, die Befehlsoptionen zusammenzufassen, die leicht zu Fehlern führen können
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken (② Registrieren Sie die Umgebung im Fitnessstudio).
Ich habe versucht, das Telefon klingeln zu lassen, als es auf dem IoT-Post veröffentlicht wurde
Ein Python-Anfänger versuchte, bei einem IT-Unternehmen zu praktizieren [Tag 3 in die Wolken ...]
Python-Anfänger haben einen Chat-BOT erstellt, also habe ich versucht, zusammenzufassen, wie man es macht
Ich kann nicht schlafen, bis ich einen Server erstellt habe !! (Einführung in den Python-Server an einem Tag)
Ich habe versucht, es einfach zu machen, die Einstellung des authentifizierten Proxys auf Jupyter zu ändern
Ich habe versucht, einen "verdammt großen Literaturkonverter" zu machen.
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
Es wird kalt, also habe ich versucht, das automatische Ein- und Ausschalten der Klimaanlage mit Raspberry Pi zu ermöglichen!
Als ich versuchte, PIL und matplotlib in einer virtuellen Umgebung zu installieren, war ich süchtig danach.
[Git] Ich habe versucht, anhand eines konkreten Beispiels zu verstehen, wie man Git Stash verwendet.
Ein Programm, das die für iOS-App-Symbole in Python erforderliche Bildgröße automatisch ändert
Ich habe versucht, "ein Herz, auch wenn es getrennt ist" mithilfe eines genetischen Algorithmus in Python zu automatisieren
Ich möchte die Grafik in 3D sehen! Ich kann einen solchen Traum wahr werden lassen.
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Ein Memorandum zur Registrierung der in Hy in PyPI geschriebenen Bibliothek
Ich habe den Super-Resolution-Algorithmus "PULSE" in einer Windows-Umgebung ausprobiert
Ich habe versucht, einen eindimensionalen Zellautomaten in Python zu implementieren
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
Kombinieren Sie Listen zu einem DataFrame mit Pandas
Ich habe versucht, "ein Programm, das doppelte Anweisungen in Python entfernt"
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen
Ich habe versucht "Wie man eine Methode in Python dekoriert"
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Ich habe es in der Sprache Go geschrieben, um das SOLID-Prinzip zu verstehen
Ich habe versucht, die im Geschäftsleben häufig verwendeten Befehle zusammenzufassen
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich möchte den Wörterbuchtyp in der Liste eindeutig machen
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen