[Python] Notification LINE des dernières informations à l'aide de la recherche automatique Twitter

Comme le titre l'indique, j'ai écrit un code qui réalise une recherche automatique avec python en utilisant l'API Twitter et notifie les informations obtenues avec LINE Notify.


Motivation

Le nombre de personnes infectées ce jour-là est annoncé quotidiennement en lien avec l'épidémie du nouveau virus corona. Que vous ayez ou non à vous soucier du nombre, ouvrez Twitter et effectuez une recherche vers midi jusqu'au soir lorsque des informations sur le nombre de personnes infectées à Tokyo sont publiées pour vérifier les dernières nouvelles dont vous ne savez pas quand elles sortiront. J'ai l'habitude d'appeler. (Je pense personnellement que c'est le plus rapide pour vérifier les dernières nouvelles du nombre de personnes infectées sur Twitter) ➡︎ Je veux éliminer le travail de recherche sur Twitter en vain! !! C'est le motif de cette fois.


Ce qui a été réalisé

  1. Recherche automatique sur Twitter
  2. Obtenez des chiffres à partir de tweets sur le nombre de personnes infectées à Tokyo
  3. Notifier avec LINE Notify

Cette implémentation est spécialisée pour le nombre de personnes infectées à Tokyo, mais il semble qu'elle puisse être appliquée de différentes manières avec un léger changement.


Les choses nécessaires

Leur préparation peut en fait être la partie la plus difficile. C'est amusant de rechercher sur Google et de trouver divers outils avec "{what you want to do} python", mais lol

la mise en oeuvre

Les détails de l'implémentation sont expliqués ci-dessous tout en regardant le code réel.

0. Aperçu de la mise en œuvre

** 1. Diverses importations ** ** 2. Créez un objet pour l'accès Twitter ** ** 3. Créez un objet pour la notification LINE ** ** 4. Créez une fonction de recherche automatique **

1. Diverses importations

import requests
import datetime
import time
import pandas as pd

from IPython.display import clear_output
#Fonction pour effacer la sortie d'impression

import tweepy
import MeCab

tagger = MeCab.Tagger("-Owakati")

Le "tagger" sur la dernière ligne est l'objet utilisé lors du fractionnement de phrases avec MeCab.

Plus précisément, en utilisant tagger.parse

tagger.parse("Il fait beau aujourd'hui, n'est-ce pas")
# => 'Il fait beau aujourd'hui, n'est-ce pas\n'
tagger.parse("Il fait beau aujourd'hui, n'est-ce pas").split()
# => ['aujourd'hui', 'Est', 'Bien', 'Météo', 'est', 'Hey']

C'est comme ça. Comme nous le verrons plus tard, dans cette implémentation, split () est utilisé pour créer un type de liste et gérer les tweets.

2. Créez un objet pour l'accès Twitter

Créez un objet qui incorpore la clé et le jeton obtenus en enregistrant l'API Twitter. Référence: "Comment utiliser Tweety ~ Partie 1 ~ [Obtenir un Tweet]"

consumer_key = "Clé obtenue ici/Entrez le jeton"
consumer_secret = "Comme ci-dessus"
access_token = "Comme ci-dessus"
access_token_secret = "Comme ci-dessus"

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

api = tweepy.API(auth)  #Je vais l'utiliser plus tard

3. Créez un objet pour la notification LINE

J'ai utilisé le code de l'article que j'ai cité plus tôt, "Envoyer un message à LINE avec Python" (https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9).

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 = "Entrez le jeton ici"
 
bot_Notify = LINENotifyBot(access_token=access_token_Notify)

Maintenant, si vous faites bot_Notify.send (message =" xxxxx "), LINE sera livré à la destination spécifiée du jeton.

4. Créez une fonction de recherche automatique

L'idée de base est

--Un certain nombre des derniers tweets contenant les mots-clés "Tokyo, infection, {date} jour" sont extraits. --S'il y a une expression «n personnes», obtenez que n

C'est comme répéter ce processus à intervalles réguliers.

Voici donc la dernière fonction ** auto_search ** à exécuter.

def auto_search(item=100,wait_time=60,rate=0.5):
    
    """
    item:Nombre de tweets à récupérer
    wait_time:Intervalle de temps pour la recherche automatique Unité s
    rate:Pourcentage de tweets contenant le nombre estimé de personnes infectées
    """
   
    d = datetime.datetime.now().day
    m = datetime.datetime.now().month

    print("searching on Twitter...")
    pre_mode = 0  #Variables d'enregistrement des nombres qui dépassaient auparavant le taux

    while True:
        df = find_infected_num(d,item)  # "n personnes"Une fonction qui renvoie n du type DataFrame
        num_mode = df.mode().values[0,0]  #Valeur la plus fréquente de df=Obtenez des candidats pour le nombre de personnes infectées
        count = df.groupby("num").size()  #Données agrégées du nombre de tweets par n

        #num_La fréquence d'apparition du mode dépasse le taux et le nombre_le mode est une nouvelle apparence
        if count.max() > item*rate and num_mode!=pre_mode:
            #Sortie de résultat
            print("\n--RESULT--")
            print(count)

            #Notification LINE des résultats
            text = "{}Mois{}journée\n Personnes infectées à Tokyo[{}]Homme\n * Le ratio de tweets est{:.2f}%".format(m,d,num_mode,count.max()/item*100)
            bot_Notify.send(message=text)  #Envoyer à LINE

            #Branchement conditionnel pour permettre la poursuite si le résultat est inapproprié
            if input("\ncontinue? y/n   ")=="n":
                break  #Fin

        waiting(2,wait_time,count)  #Pour affichage pendant le temps d'attente

        #pre_mise à jour du mode
        if count.max() > item*rate:
            pre_mode = num_mode

** find_infected_num ** est une fonction pour renvoyer n sur "n personnes" dans DataFrame. Ici, le tagger préparé en 1 et l'api préparé en 2 sont utilisés.

def find_infected_num(d,item):
    num_list = []  #Liste à stocker n
    for tweet in tweepy.Cursor(api.search, q=['infection',"Tokyo","{}journée".format(d)]).items(item):
        split_tweet = tagger.parse(tweet.text).split()
        if "Homme" in split_tweet:
            index = split_tweet.index("Homme") - 1
            n = cut_number(split_tweet,index)  # "Homme"Fonction qui renvoie le nombre immédiatement avant
            num_list.append(n)
    return pd.DataFrame(num_list,columns=["num"])

** cut_number ** inclus ici est une fonction pour obtenir le nombre immédiatement avant "personne".

def cut_number(split_tweet,index):
    start_i = index  #Une variable qui représente la position où le numéro a commencé dans le tweet
    
    # "Homme"Renvoie 0 si le nombre immédiatement avant n'est pas de type str (10000 est approprié)
    if not split_tweet[index] in list(map(str,range(0,10000))):
        return 0

    ans = split_tweet[start_i]  # "Homme"Obtenez le numéro juste avant
    while True:
        #Ajouter à la gauche de ans tant que les nombres continuent
        if split_tweet[start_i-1] in list(map(str,range(0,9))):
            start_i -= 1
            ans = split_tweet[start_i] + ans
        #Renvoie ans lorsque le nombre est terminé
        else:
            return ans                   

Permettez-moi d'expliquer un peu pourquoi une telle fonction est nécessaire. Par exemple, s'il y a une phrase "Aujourd'hui, il y a 123 personnes infectées", si vous essayez de diviser par mecab,

tagger.parse("123 personnes sont infectées aujourd'hui").split()
# => ['aujourd'hui', 'de', 'infection', 'La personne', 'Est', '1', '2', '3', 'Homme']

De cette manière, 1, 2 et 3 ont été séparés. Dans l'état actuel des choses, seul le dernier chiffre du nombre de personnes infectées peut être obtenu, j'ai donc créé ** cut_number ** pour obtenir le nombre correct.


Une autre fonction qui apparaît dans ** auto_search ** est ** wait **, qui est une fonction qui visualise le temps restant jusqu'à la prochaine recherche automatique. (C'est comme un bonus car cela n'a rien à voir avec la fonction de l'unité principale.)

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...")

Essayez d'utiliser

En raison de la nature de l'algorithme, il n'est pas toujours possible d'attraper le rapport préliminaire du nombre de personnes infectées, donc j'essaye en fait de le déplacer et d'ajuster les paramètres. (Le code ci-dessus utilise la valeur déjà ajustée)

Voici le résultat de l'exécution de ** 7/19 **.

Résultat 1

(Exécution avec ʻitem = 30`)

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

À ce moment, LINE a reçu la notification suivante. LINE_capture_616855110.578717.jpg

Si vous entrez y dans le champ de saisie continuer?, La recherche se poursuivra, mais le nombre de personnes infectées annoncé à Tokyo ce jour-là est de 188, donc ça va. (Même si vous continuez à rechercher, vous ne recevrez pas de notifications répétées car pre_mode = 188.)

Résultat 2

(Exécution avec ʻitem = 100`)

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

En attendant, il est affiché comme ceci. Comme vous pouvez le voir dans RESULT, il n'y a aucun candidat qui dépasse 50%, donc aucune notification ne viendra. Au contraire, après un certain laps de temps depuis l'annonce du nombre de personnes infectées, même le nombre correct diminuera.

Tâches futures

Sur la base des résultats des tests, je vais énumérer les futurs problèmes.

Je souhaite continuer à exécuter ce programme quotidiennement et à le tester pour confirmer ces problèmes.

De côté

Il semble que vous pouvez obtenir la valeur préliminaire du nombre de personnes infectées en précisant le tweet de l'agence de presse officielle sans prendre la décision majoritaire à partir de divers tweets (et c'est exact), mais je ne sais pas exactement où tweeter le plus rapidement. Il n'y a pas de telle méthode, j'ai donc essayé cette méthode. Au fait, je l'ai testé le 18/07, mais le taux de tweet de "290" a dépassé 80% immédiatement après l'annonce, probablement parce que le nombre de personnes infectées à Tokyo était de 290. En réponse à cela, 7/19 a été initialement exploité comme «taux = 0,8», mais a échoué car la notification n'est pas arrivée même si la valeur préliminaire est sortie. C'était à moi de baisser le taux et de l'ajuster. Il est difficile de parler de différents degrés selon les jours, mais j'ai hâte de voir comment des notifications précises peuvent être faites avec le simple algorithme de "ramasser de nombreux nombres murmurés". C'est pourquoi cela peut inclure la poursuite de l'intérêt en tant que développement personnel plutôt que d'utilisation pratique lol

Recommended Posts

[Python] Notification LINE des dernières informations à l'aide de la recherche automatique Twitter
Rechercher sur Twitter avec Python
Google recherche la chaîne sur la dernière ligne du fichier en Python
Tweet à l'aide de l'API Twitter en Python
À la recherche du FizzBuzz le plus rapide en Python
Essayez d'utiliser le module de collections (ChainMap) de python3
Explication du concept d'analyse de régression à l'aide de python Partie 2
Découpez une partie de la chaîne à l'aide d'une tranche Python
le zen de Python
La douleur de gRPC en utilisant Python. Novembre 2019. (Mémo personnel)
[Python] Utilisation de l'API Line [1ère création de Beauty Bot]
Explication du concept d'analyse de régression à l'aide de Python Partie 1
Explication du concept d'analyse de régression à l'aide de Python Extra 1
Utiliser l'API de recherche de la Bibliothèque du Parlement national en Python
Étude de Python Hour8: Utilisation de packages
L'histoire de la conversion automatique du langage de TypeScript / JavaScript / Python
Mettez la dernière version de Python dans Linux (Debian) du Chromebook
J'ai touché au dernier outil de test automatique "Playwright for Python"
Informations de raclage Web sur les programmes de rire et notification en ligne
Afficher à l'aide du module python du backend mobile Nifty Cloud
Essayez une recherche similaire de recherche d'images à l'aide du SDK Python [Recherche]
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
Trouver le diamètre du graphique par recherche de priorité de largeur (mémoire Python)
Exportez les informations produit au format CSV à l'aide de l'API de recherche de produits Rakuten [Python]
Vers la retraite de Python2
Mise à jour automatique du module Python
Essayez d'utiliser l'API Twitter
Publier sur Twitter en utilisant Python
Algorithme de recherche utilisant word2vec [python]
python: principes de base de l'utilisation de scikit-learn ①
Essayez d'utiliser l'API Twitter
Rechercher des tweets Twitter avec Python
Diffusion sur LINE en utilisant python
À propos des fonctionnalités de Python
Le pouvoir des pandas: Python
[Python] Laissez LINE vous informer quotidiennement du classement des résultats de recherche sur votre site.
Trouvez le chemin critique de PERT en utilisant la recherche de priorité de largeur et la recherche de priorité de profondeur
[Python] J'ai écrit la route du typhon sur la carte en utilisant le folium
Lire la sortie standard d'un sous-processus ligne par ligne en Python
Informations sur la carte de base à l'aide de la conversion Geotiff Python des données numériques d'élévation
Exploration avec Python et Twitter API 2-Implémentation de la fonction de recherche d'utilisateurs
J'ai regardé les méta-informations de BigQuery et essayé de les utiliser
Collectez des informations sur les produits et traitez les données à l'aide de l'API de recherche de produits Rakuten [Python]
[Python] Créez un script qui utilise FeedParser et LINE Notify pour informer LINE des dernières informations sur le nouveau virus corona du ministère de la Santé, du Travail et des Affaires sociales.
Obtenez et définissez la valeur du menu déroulant en utilisant Python et Selenium
[Détection d'anomalies] Essayez d'utiliser la dernière méthode d'apprentissage à distance
PhytoMine-I a essayé d'obtenir les informations génétiques de la plante avec Python
Capture d'image de Firefox en utilisant Python
[Python] La pierre d'achoppement de l'importation
First Python 3 ~ Le début de la répétition ~
Essayez le SDK Python LINE Pay
Suppression de la brume à l'aide de Python detailEnhanceFilter
Existence du point de vue de Python
pyenv-changer la version python de virtualenv
[Python] Comprendre le potentiel_field_planning de Python Robotics
Revue des bases de Python (FizzBuzz)