[PYTHON] Une histoire à laquelle j'étais accro à essayer d'obtenir une URL de vidéo avec tweepy

introduction

Les dernières images et vidéos de l'actrice Mayu Matsuoka sont automatiquement envoyées tous les jours.Lors de la création de LINE Bot, j'étais accro à essayer d'obtenir l'URL de l'image / vidéo de tweepy, donc je vais la partager.

En y repensant maintenant, j'ai passé beaucoup de temps perdu, mais si j'écris un article pour le moment, ce temps perdu sera un peu récompensé! !! Je vais l'écrire.

L.png

Code d'origine

search_tweets.py


import os
import tweepy
from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta

consumer_key = os.getenv('TWITTER_CONSUMER_KEY')
consumer_secret = os.getenv('TWITTER_CONSUMER_SECRET')
access_token = os.getenv('TWITTER_ACCESS_TOKEN')
access_token_secret = os.getenv('TWITTER_ACCESS_TOKEN_SECRET')
bearer_token = os.getenv('TWITTER_ACCESS_TOKEN_SECRET')


#Recherchez les tweets liés à Mayu Matsuoka sur Twitter et obtenez l'URL
def search_tweets():
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)

    yesterday = datetime.strftime(datetime.today() - relativedelta(days=1), f"%Y-%m-%d")
    #Recherche Twitter à la condition qu'il y ait des images et des vidéos de 10 likes ou plus, d'hier à aujourd'hui, 1 ou plusieurs retweets, en omettant les retweets
    q = f'#Filtre Mayu Matsuoka OU Mayu Matsuoka:media exclude:retweets min_faves:10 since:{yesterday} min_retweets:1'

    #La partie problématique
    tweets = tweepy.Cursor(api.search, q=q).items(20)

    contents = []
    for tweet in tweets:
        print(tweet.text)
        print(tweet.extended_entities)
        try:
            media = tweet.extended_entities['media']
            for m in media:
                print(m)
                preview = m['media_url_https']
                if m['type'] == 'video':
                    origin = [variant['url'] for variant in m['video_info']['variants'] if variant['content_type'] == 'video/mp4'][0]
                else:
                    origin = m['media_url_https']

                #Formaté pour l'envoi avec LINE Bot
                content = {'preview': preview, 'origin': origin, 'type': m['type']}
                contents.append(content)

            print('--------------------------------------------')
        except:
            print('Error')
            print('--------------------------------------------')
    return contents


if __name__ == "__main__":
    search_tweets()

** J'aurais dû être en mesure d'obtenir l'URL des deux tweets avec des images et des vidéos avec ce code. .. .. .. .. ** **

Je ne parviens pas à obtenir l'URL de la vidéo comme prévu

Je peux rechercher des tweets, mais je remarque que certaines URL de vidéos peuvent être obtenues et d'autres non.

Il peut y avoir une erreur lors de l'essai. .. ..

Quand j'ai imprimé chaque tweet, j'ai trouvé des tweets sans Extended_entities.

for tweet in tweets:
        print(tweet.text)
        #Cause partie
        # extened_Puisqu'il n'y a pas d'entités, une erreur se produit ici sauf:J'allais.
        print(tweet.extended_entities)
        try:
            media = tweet.extended_entities['media']

Quand j'ai cherché, il y avait de nombreux articles.

Recevez des tweets de plus de 140 caractères https://qiita.com/hitsumabushi845/items/f7fd87106381fc65fc86

** Il semble que Extended_entities disparaisse lorsque l'URL du tweet et de la vidéo dépasse 140 caractères. ** **

Il m'a fallu beaucoup de temps pour remarquer cela. Ou plutôt, quand je l'ai recherché, il a été résolu en un instant.

Solution

L'ajout de tweet_mode = 'extended' et include_entities = True aux paramètres api.search résoudra le problème.

tweets = tweepy.Cursor(api.search, q=q).items(20)
tweets = tweepy.Cursor(api.search, q=q, 
    #Ici, prolongez la partie omise
    tweet_mode='extended', #Obtenez tous les tweets omis
    include_entities=True).items(20) #Récupérer tous les liens omis

J'ai pu obtenir l'URL de la vidéo, mais je lance une erreur. ..

AttributeError: 'Status' object has no attribute 'text'

Apparemment, lorsque tweet_mode est défini sur extended, le nom de la clé du texte du tweet passe de text à full_text.

for tweet in tweets:
        # text → full_text
        # print(tweet.text)
        print(tweet.full_text)
        print(tweet.extended_entities)
        try:
            media = tweet.extended_entities['media']

Code modifié

search_tweets.py


import os
import tweepy
from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta

consumer_key = os.getenv('TWITTER_CONSUMER_KEY')
consumer_secret = os.getenv('TWITTER_CONSUMER_SECRET')
access_token = os.getenv('TWITTER_ACCESS_TOKEN')
access_token_secret = os.getenv('TWITTER_ACCESS_TOKEN_SECRET')
bearer_token = os.getenv('TWITTER_ACCESS_TOKEN_SECRET')


#Recherchez les tweets liés à Mayu Matsuoka sur Twitter et obtenez l'URL
def search_tweets():
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)

    yesterday = datetime.strftime(datetime.today() - relativedelta(days=1), f"%Y-%m-%d")
    #Recherche Twitter à la condition qu'il y ait des images et des vidéos de 10 likes ou plus, d'hier à aujourd'hui, 1 ou plusieurs retweets, en omettant les retweets
    q = f'#Filtre Mayu Matsuoka OU Mayu Matsuoka:media exclude:retweets min_faves:10 since:{yesterday} min_retweets:1'

    #La partie problématique
    tweets = tweepy.Cursor(api.search, q=q).items(20)

    contents = []
    for tweet in tweets:
        print(tweet.full_text)
        print(tweet.extended_entities)
        try:
            media = tweet.extended_entities['media']
            for m in media:
                print(m)
                preview = m['media_url_https']
                if m['type'] == 'video':
                    origin = [variant['url'] for variant in m['video_info']
                              ['variants'] if variant['content_type'] == 'video/mp4'][0]
                else:
                    origin = m['media_url_https']

                #Formaté pour l'envoi avec LINE Bot
                content = {'preview': preview, 'origin': origin, 'type': m['type']}
                contents.append(content)

            print('--------------------------------------------')
        except:
            print('Error')
            print('--------------------------------------------')
    return contents


if __name__ == "__main__":
    search_tweets()

en conclusion

Pour moi, qui suis fan de Mayu Matsuoka (communément appelé Mayura) et que je n'ai plus le temps de consulter la chronologie de Twitter tous les jours, ce LINE Bot est uniquement pour moi, mais si vous le souhaitez, je lis cet article. Si vous êtes fan de Mayu Matsuoka, veuillez vous inscrire en tant qu'ami avec le code QR ci-dessous! !! !!

Je vous remercie! !!

L.png

De plus, s'il y a des erreurs dans cet article, ou si vous pensez que vous devriez en faire plus, veuillez en commenter de plus en plus! !!

Article de référence

[Python] Recherchez et obtenez des tweets Twitter avec tweepy https://vatchlog.com/tweepy-search/ Recevez des tweets de plus de 140 caractères https://qiita.com/hitsumabushi845/items/f7fd87106381fc65fc86 Obtenir l'URL de la vidéo avec Python + tweepy https://thinkami.hatenablog.com/entry/2017/11/02/062226

Recommended Posts

Une histoire à laquelle j'étais accro à essayer d'obtenir une URL de vidéo avec tweepy
Une histoire à laquelle j'étais accro à essayer d'installer LightFM sur Amazon Linux
J'étais accro à essayer Cython avec PyCharm, alors prenez note
Une histoire à laquelle j'étais accro chez np.where
Une histoire à laquelle j'étais accro après la communication SFTP avec python
Une histoire à laquelle j'étais accro à appeler Lambda depuis AWS Lambda.
Une note à laquelle j'étais accro lors de la création d'une table avec SQL Alchemy
J'étais accro à la création d'un environnement Python venv avec VS Code
J'obtiens un UnicodeDecodeError en essayant de me connecter à oracle avec python sqlalchemy
Une note à laquelle j'étais accro lors de l'exécution de Python avec Visual Studio Code
J'étais accro au grattage avec Selenium (+ Python) en 2020
J'étais accro à essayer logging.getLogger avec Flask 1.1.x
[IOS] Animation GIF avec Pythonista3. J'en étais accro.
J'ai essayé de commencer avec Hy ・ Définir une classe
Une histoire accro aux pipelines Azure
Ce à quoi j'étais accro en traitant d'énormes fichiers dans un environnement Linux 32 bits
Une histoire à laquelle j'étais accro en spécifiant nil comme argument de fonction dans Go
J'étais accro au multitraitement + psycopg2
Un mémorandum lors de l'acquisition automatique avec du sélénium
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai écrit un script pour vous aider à démarrer avec AtCoder à grande vitesse!
Une note à laquelle j'étais accro lors de l'émission d'un bip sous Linux
J'obtiens une erreur en essayant d'installer maec 4.0.1.0 avec pip
Notez que j'étais accro à accéder à la base de données avec mysql.connector de Python en utilisant une application Web
J'étais accro à ne pas pouvoir obtenir une adresse e-mail de Google avec l'authentification django-allauth
J'ai essayé de commencer avec Hy
J'étais accro à pip installer mysqlclient
Obtenez des réponses à des tweets spécifiques avec tweepy
J'étais accro à Flask sur dotCloud
Ce que j'étais accro à Python autorun
Utilisez Python de Java avec Jython. J'étais aussi accro.
J'ai essayé de créer un service de raccourcissement d'url sans serveur avec AWS CDK
[Python] Quand j'ai essayé de créer un outil de décompression avec un fichier zip que je connaissais juste, j'étais accro à sys.exit ()
Ce à quoi j'étais accro lors de la création d'applications Web dans un environnement Windows
[Introduction à json] Non, j'en étais accro. .. .. ♬
Je veux faire un jeu avec Python
J'ai été en vain parce que je n'ai pas pu obtenir de commande parent avec pybitflyer
J'ai essayé d'obtenir des données CloudWatch avec Python
Trois choses auxquelles j'étais accro lors de l'utilisation de Python et MySQL avec Docker
J'obtiens une UnicodeDecodeError lors de l'exécution avec mod_wsgi
Histoire d'essayer d'utiliser Tensorboard avec Pytorch
J'ai créé un outil pour obtenir de nouveaux articles
Je veux écrire dans un fichier avec Python
Zubu amateur veut démarrer Python
Notez que j'étais accro à la configuration de TensowFlow
Une histoire qui nécessitait des préparatifs pour essayer de faire un tutoriel Django avec des centos simples
Une histoire qui a échoué lors de la tentative de suppression du suffixe d'une chaîne avec rstrip
Je ne trouve pas l'horloge tsc! ?? L'histoire d'essayer d'écrire un patch de noyau
Je suis resté bloqué en essayant de spécifier un chemin relatif avec relative_to () en python
Une histoire sur un débutant Python essayant d'obtenir des résultats de recherche Google à l'aide de l'API
Un débutant a essayé de colorier un dessin au trait avec un chainer. J'ai pu le faire.
Je veux faire la transition avec un bouton sur le ballon
Je veux escalader une montagne avec l'apprentissage par renforcement
J'ai essayé de démarrer avec le script python de blender_Part 01
Comment obtenir un utilisateur connecté avec les forms.py de Django
J'ai essayé de démarrer avec le script python de blender_Partie 02
Une histoire d'essayer un monorepo (Golang +) Python avec Bazel
Je veux travailler avec un robot en python.
Je veux diviser une chaîne de caractères avec hiragana