[Python] LINE-Benachrichtigung über die neuesten Informationen mithilfe der automatischen Suche von Twitter

Wie der Titel schon sagt, habe ich einen Code geschrieben, der die automatische Suche mit Python mithilfe der Twitter-API realisiert und die daraus erhaltenen Informationen mit LINE Notify benachrichtigt.


Motivation

Die Anzahl der an diesem Tag infizierten Personen wird täglich im Zusammenhang mit der Epidemie des neuen Koronavirus bekannt gegeben. Unabhängig davon, ob Sie sich um diese Nummer sorgen müssen oder nicht, öffnen Sie Twitter und suchen Sie von Mittag bis Abend, wenn Informationen über die Anzahl der infizierten Personen in Tokio veröffentlicht werden, um die aktuellen Nachrichten zu überprüfen, von denen Sie nicht wissen, wann sie veröffentlicht werden. Ich habe die Angewohnheit anzurufen. (Ich persönlich denke, dass es am schnellsten ist, die aktuellen Nachrichten über die Anzahl der infizierten Personen auf Twitter zu überprüfen.) ➡︎ Ich möchte die Suche nach Twitter auf Twitter vergeblich machen! !! Das ist das Motiv für diese Zeit.


Was wurde erreicht?

  1. Automatische Suche auf Twitter
  2. Holen Sie sich Zahlen aus Tweets über die Anzahl der Infizierten in Tokio
  3. Mit LINE benachrichtigen Benachrichtigen

Diese Implementierung ist auf die Anzahl der Infizierten in Tokio spezialisiert, scheint jedoch mit geringfügigen Änderungen auf verschiedene Arten angewendet werden zu können.


Dinge notwendig

Das Vorbereiten dieser kann tatsächlich der schwierigste Teil sein. Es macht Spaß zu googeln und verschiedene Tools mit "{was du machen willst} Python" zu finden, aber lol

Implementierung

Die Implementierungsdetails werden unten erläutert, während der tatsächliche Code betrachtet wird.

0. Implementierungsübersicht

** 1. Verschiedene Importe ** ** 2. Erstellen Sie ein Objekt für den Twitter-Zugriff ** ** 3. Erstellen Sie ein Objekt für die LINE-Benachrichtigung ** ** 4. Erstellen Sie eine automatische Suchfunktion **

1. Verschiedene Importe

import requests
import datetime
import time
import pandas as pd

from IPython.display import clear_output
#Funktion zum Löschen der Druckausgabe

import tweepy
import MeCab

tagger = MeCab.Tagger("-Owakati")

Der "Tagger" in der letzten Zeile ist das Objekt, das beim Teilen von Sätzen mit MeCab verwendet wird.

Insbesondere mit tagger.parse

tagger.parse("Das Wetter ist heute gut, nicht wahr?")
# => 'Das Wetter ist heute gut, nicht wahr?\n'
tagger.parse("Das Wetter ist heute gut, nicht wahr?").split()
# => ['heute', 'Ist', 'Gut', 'Wetter', 'ist', 'Hallo']

Es ist wie es ist. Wie wir später sehen werden, wird in dieser Implementierung split () verwendet, um einen Listentyp zu erstellen und Tweets zu verarbeiten.

2. Erstellen Sie ein Objekt für den Twitter-Zugriff

Erstellen Sie ein Objekt, das den Schlüssel und das Token enthält, die Sie durch Registrieren der Twitter-API erhalten haben. Referenz: "Verwendung von Tweety ~ Teil 1 ~ [Getting Tweet]"

consumer_key = "Schlüssel hier erhalten/Token eingeben"
consumer_secret = "Das gleiche wie oben"
access_token = "Das gleiche wie oben"
access_token_secret = "Das gleiche wie oben"

auth = tweepy.OAuthHandler(consumer_key,consumer_secret)
auth.set_access_token(access_token,access_token_secret)

api = tweepy.API(auth)  #Ich werde dies später verwenden

3. Erstellen Sie ein Objekt für die LINE-Benachrichtigung

Ich habe den Code aus dem zuvor zitierten Artikel "Senden einer Nachricht an LINE mit Python" (https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9) verwendet.

class LINENotifyBot:
    API_URL = 'https://notify-api.line.me/api/notify'
    def __init__(self, access_token):
        self.__headers = {'Authorization': 'Bearer ' + access_token}

    def send(
            self, message,
            image=None, sticker_package_id=None, sticker_id=None,
            ):
        payload = {
            'message': message,
            'stickerPackageId': sticker_package_id,
            'stickerId': sticker_id,
            }
        files = {}
        if image != None:
            files = {'imageFile': open(image, 'rb')}
        r = requests.post(
            LINENotifyBot.API_URL,
            headers=self.__headers,
            data=payload,
            files=files,
            )
       
access_toke_Notify = "Geben Sie hier den Token ein"
 
bot_Notify = LINENotifyBot(access_token=access_token_Notify)

Wenn Sie nun "bot_Notify.send (message =" xxxxx ")" ausführen, wird LINE an das angegebene Ziel des Tokens gesendet.

4. Erstellen Sie eine automatische Suchfunktion

Die Grundidee ist

Es ist, als würde man diesen Vorgang in regelmäßigen Abständen wiederholen.

Hier ist also die letzte auszuführende Funktion ** auto_search **.

def auto_search(item=100,wait_time=60,rate=0.5):
    
    """
    item:Anzahl der abzurufenden Tweets
    wait_time:Zeitintervall für die automatische Suche Einheit s
    rate:Prozentsatz der Tweets, die die geschätzte Anzahl infizierter Personen enthalten
    """
   
    d = datetime.datetime.now().day
    m = datetime.datetime.now().month

    print("searching on Twitter...")
    pre_mode = 0  #Variablen zum Aufzeichnen von Nummern, die zuvor die Rate überschritten haben

    while True:
        df = find_infected_num(d,item)  # "n Menschen"Eine Funktion, die n vom Typ DataFrame zurückgibt
        num_mode = df.mode().values[0,0]  #Häufigster Wert von df=Holen Sie sich Kandidaten für die Anzahl der infizierten Personen
        count = df.groupby("num").size()  #Aggregierte Daten der Anzahl der Tweets pro n

        #num_Die Häufigkeit des Auftretens des Modus überschreitet die Rate & num_Modus ist ein neues Erscheinungsbild
        if count.max() > item*rate and num_mode!=pre_mode:
            #Ergebnisausgabe
            print("\n--RESULT--")
            print(count)

            #LINE Benachrichtigung über Ergebnisse
            text = "{}Mond{}Tag\n Infizierte Menschen in Tokio[{}]Mann\n * Tweet-Verhältnis ist{:.2f}%".format(m,d,num_mode,count.max()/item*100)
            bot_Notify.send(message=text)  #An LINE senden

            #Bedingte Verzweigung, um eine Fortsetzung zu ermöglichen, wenn das Ergebnis unangemessen ist
            if input("\ncontinue? y/n   ")=="n":
                break  #Ende

        waiting(2,wait_time,count)  #Zur Anzeige während der Wartezeit

        #pre_Modus-Update
        if count.max() > item*rate:
            pre_mode = num_mode

** find_infected_num ** ist eine Funktion zum Zurückgeben von n von "n Personen" in DataFrame. Hier werden der in 1 hergestellte Tagger und die in 2 hergestellte API verwendet.

def find_infected_num(d,item):
    num_list = []  #Liste zum Speichern n
    for tweet in tweepy.Cursor(api.search, q=['Infektion',"Tokio","{}Tag".format(d)]).items(item):
        split_tweet = tagger.parse(tweet.text).split()
        if "Mann" in split_tweet:
            index = split_tweet.index("Mann") - 1
            n = cut_number(split_tweet,index)  # "Mann"Funktion, die die Nummer unmittelbar vorher zurückgibt
            num_list.append(n)
    return pd.DataFrame(num_list,columns=["num"])

** cut_number ** hier ist eine Funktion, um die Nummer unmittelbar vor "person" zu erhalten.

def cut_number(split_tweet,index):
    start_i = index  #Eine Variable, die die Position darstellt, an der die Nummer im Tweet begonnen hat
    
    # "Mann"Gibt 0 zurück, wenn die unmittelbar vorhergehende Zahl nicht vom Typ str ist (10000 ist angemessen).
    if not split_tweet[index] in list(map(str,range(0,10000))):
        return 0

    ans = split_tweet[start_i]  # "Mann"Holen Sie sich die Nummer kurz vor
    while True:
        #Fügen Sie auf der linken Seite von ans hinzu, solange die Zahlen fortbestehen
        if split_tweet[start_i-1] in list(map(str,range(0,9))):
            start_i -= 1
            ans = split_tweet[start_i] + ans
        #Gibt ans zurück, wenn die Nummer vorbei ist
        else:
            return ans                   

Lassen Sie mich ein wenig erklären, warum eine solche Funktion benötigt wird. Wenn zum Beispiel der Satz "Heute gibt es 123 infizierte Personen" angezeigt wird, wenn Sie versuchen, durch Mecab zu teilen,

tagger.parse("123 Menschen sind heute infiziert").split()
# => ['heute', 'von', 'Infektion', 'Person', 'Ist', '1', '2', '3', 'Mann']

Auf diese Weise wurden 1, 2 und 3 getrennt. Da nur die letzte Ziffer der Anzahl infizierter Personen abgerufen werden kann, habe ich ** cut_number ** erstellt, um die richtige Anzahl zu erhalten.


Eine weitere Funktion, die in ** auto_search ** angezeigt wird, ist ** wait **. Diese Funktion visualisiert die verbleibende Zeit bis zur nächsten automatischen Suche. (Es ist wie ein Bonus, weil es nichts mit der Funktion der Haupteinheit zu tun hat.)

def waiting(div,wait_time,count):
    clear_output()
    for i in range(1,wait_time//div+1):
        print("waiting: |"+"*"*i+" "*(wait_time//div-i)+"|")
        print("\n--RESULT--")
        print(count)
        time.sleep(div)
        clear_output()
    print("searching on Twitter...")

Versuchen Sie es mit

Aufgrund der Art des Algorithmus ist es nicht immer möglich, den vorläufigen Bericht über die Anzahl der infizierten Personen abzurufen. Daher versuche ich, ihn zu verschieben und die Parameter anzupassen. (Der obige Code verwendet den bereits angepassten Wert.)

Das Folgende ist das Ausführungsergebnis von ** 7/19 **.

Ergebnis 1

(Laufen mit item = 30)

スクリーンショット 2020-07-19 17.19.04.png

Zu diesem Zeitpunkt erhielt LINE die folgende Benachrichtigung. LINE_capture_616855110.578717.jpg

Wenn Sie y in das Eingabefeld "Weiter" eingeben, wird die Suche fortgesetzt, aber die Anzahl der an diesem Tag in Tokio angekündigten infizierten Personen beträgt 188, also ist es in Ordnung. (Auch wenn Sie weiter suchen, erhalten Sie keine wiederholten Benachrichtigungen, da pre_mode = 188.)

Ergebnis 2

(Laufen mit item = 100)

スクリーンショット 2020-07-19 21.27.13.png

Während des Wartens wird es so angezeigt. Wie Sie aus RESULT ersehen können, gibt es keine Kandidaten, die 50% überschreiten, sodass keine Benachrichtigung erfolgt. Im Gegenteil, es ist ersichtlich, dass der Prozentsatz nach Ablauf einer bestimmten Zeitspanne seit Bekanntgabe der Anzahl der infizierten Personen auch bei korrekter Anzahl abnimmt.

Zukünftige Aufgaben

Basierend auf den Testergebnissen werde ich zukünftige Probleme auflisten.

Ich möchte dieses Programm weiterhin täglich ausführen und testen, um diese Probleme zu bestätigen.

Beiseite

Es scheint, dass Sie den vorläufigen Wert der Anzahl infizierter Personen erhalten können, indem Sie den Tweet der offiziellen Nachrichtenagentur angeben, ohne die Mehrheitsentscheidung aus verschiedenen Tweets zu treffen (und das ist richtig), aber ich weiß nicht genau, wo ich am schnellsten twittern soll. Da es keine solche Methode gibt, habe ich diese Methode ausprobiert. Übrigens habe ich es am 18.7. Getestet, aber die Tweet-Rate von "290" lag unmittelbar nach der Ankündigung über 80%, wahrscheinlich weil die Anzahl der Infizierten in Tokio 290 betrug. Als Reaktion darauf wurde 7/19 zunächst als "Rate = 0,8" betrieben, scheiterte jedoch ohne Benachrichtigung, selbst wenn der vorläufige Wert herauskam. Es lag an mir, die Rate zu senken und anzupassen. Es ist schwierig, je nach Tag über unterschiedliche Grade zu sprechen, aber ich freue mich darauf zu sehen, wie genau Benachrichtigungen mit dem einfachen Algorithmus "Aufnehmen vieler gemurmelter Zahlen" erfolgen können. Aus diesem Grund kann es sein, dass das Interesse eher als persönliche Entwicklung als als praktischer Nutzen verfolgt wird. Lol

Recommended Posts

[Python] LINE-Benachrichtigung über die neuesten Informationen mithilfe der automatischen Suche von Twitter
Suchen Sie Twitter mit Python
Google sucht mit Python nach der Zeichenfolge in der letzten Zeile der Datei
Tweet mit der Twitter-API in Python
Auf der Suche nach dem schnellsten FizzBuzz in Python
Versuchen Sie es mit dem Sammlungsmodul (ChainMap) von python3
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 2
Schneiden Sie einen Teil der Zeichenfolge mit einem Python-Slice aus
der Zen von Python
Der Schmerz von gRPC mit Python. November 2019. (Persönliches Memo)
[Python] Verwenden der Linien-API [1. Erstellung des Beauty-Bots]
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 1
Erläuterung des Konzepts der Regressionsanalyse mit Python Extra 1
Verwenden Sie die Such-API der National Parliament Library in Python
Studie aus Python Hour8: Verwenden von Paketen
Die Geschichte der automatischen Sprachkonvertierung von TypeScript / JavaScript / Python
Stellen Sie die neueste Version von Python in Linux (Debian) von Chromebook
Ich habe das neueste automatische Testtool "Playwright for Python" berührt.
Web-Scraping-Informationen zu Lachprogrammen und Benachrichtigungen über LINE
Anzeigen mit dem Python-Modul des mobilen Nifty Cloud-Backends
Probieren Sie die ähnliche Suche von Image Search mit Python SDK [Search] aus.
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Ermitteln Sie den Durchmesser des Diagramms anhand der Suche nach Breitenpriorität (Python-Speicher).
Ausgabe von Produktinformationen an csv mithilfe der Rakuten-Produktsuch-API [Python]
Auf dem Weg zum Ruhestand von Python2
Automatisches Update des Python-Moduls
Versuchen Sie es mit der Twitter-API
Mit Python auf Twitter posten
Suchalgorithmus mit word2vec [Python]
Python: Grundlagen der Verwendung von Scikit-Learn ①
Versuchen Sie es mit der Twitter-API
Suche nach Twitter-Tweets mit Python
Online-Übertragung mit Python
Über die Funktionen von Python
Die Kraft der Pandas: Python
[Python] Lassen Sie sich täglich von LINE über das Ranking der Suchergebnisse auf Ihrer Website informieren.
Finden Sie den kritischen Pfad von PERT mithilfe der Breitenprioritätssuche und der Tiefenprioritätssuche
[Python] Ich habe die Route des Taifuns mit Folium auf die Karte geschrieben
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
Basiskarteninformationen mithilfe der Python-Geotiff-Konvertierung numerischer Höhendaten
Crawlen mit Python und Twitter API 2-Implementierung der Benutzersuchfunktion
Ich habe mir die Metainformationen von BigQuery angesehen und versucht, sie zu verwenden
Sammeln Sie Produktinformationen und Prozessdaten mit der Rakuten-Produktsuch-API [Python].
[Python] Erstellen Sie ein Skript, das FeedParser und LINE Notify verwendet, um LINE über die neuesten Informationen zum neuen Koronavirus des Ministeriums für Gesundheit, Arbeit und Soziales zu informieren.
Rufen Sie den Wert des Dropdown-Menüs mit Python und Selen ab und legen Sie ihn fest
[Erkennung von Anomalien] Versuchen Sie es mit der neuesten Methode des Fernunterrichts
PhytoMine-I hat versucht, mit Python die genetischen Informationen der Pflanze zu erhalten
Bilderfassung von Firefox mit Python
[Python] Der Stolperstein des Imports
Erster Python 3 ~ Der Beginn der Wiederholung ~
Probieren Sie das Python LINE Pay SDK aus
Trübungsentfernung mit Python detailEnhanceFilter
Existenz aus Sicht von Python
pyenv-change die Python-Version von virtualenv
[Python] Die potenzielle Feldplanung von Python Robotics verstehen
Überprüfung der Grundlagen von Python (FizzBuzz)