[PYTHON] Téléchargez les images et vidéos contenues dans les tweets que vous avez aimés sur Twitter et téléchargez-les sur Google Drive

introduction

C'est mon deuxième article même si je suis débutant. J'espère que vous veillerez sur moi avec des yeux chaleureux. Il est répertorié dans GitHub.

Vous voudrez peut-être enregistrer les images et les vidéos jointes aux tweets de vos artistes, artistes, athlètes, etc. préférés. Je me suis demandé si je pouvais faire quelque chose à ce sujet par programme.

Aperçu

Spécifiez l'ID utilisateur Twitter, téléchargez les images / vidéos incluses dans les tweets que la personne a aimés, dans un dossier local une fois, puis téléchargez-les dans le dossier spécifié de Google Drive. Cela fonctionne en appuyant sur la commande python à partir de cmd. Il ne prend pas en charge des choses comme se déplacer à intervalles réguliers ou toujours démarrer. J'aimerais y remédier un jour, mais le problème dans Question demeure, alors ...

Nous vous recommandons d'utiliser l'API Twitter et l'API Google Drive. Pour plus de détails, reportez-vous au site dans Reference. C'est très facile à comprendre.

Code source

↓ Les paramètres sont résumés. Le haut est la clé API Twitter et le nom d'utilisateur, et le bas est l'ID du répertoire Google Drive à enregistrer. Veuillez saisir la valeur que vous avez obtenue vous-même.

config.py



CONSUMER_KEY = "********************************"
CONSUMER_SECRET = "********************************"
ACCESS_TOKEN = "********************************"
ACCESS_TOKEN_SECRET = "********************************"
USER_ID = "***********"

GOOGLEDRIVE_PICS_DIRECTORY_ID = "********************************"
GOOGLEDRIVE_VIDEOS_DIRECTORY_ID = "********************************"

↓ La partie qui se déplace en tant que principale. Encodé pour la sortie de débogage avec cmd. Il est automatiquement déterminé si les images / vidéos sont incluses. En ce qui concerne les vidéos, il y en a qui ne sont pas .mp4 et d'autres qui sont de petite taille, alors j'essaie d'obtenir celle qui a la plus grande taille.

get_data.py


import json, config
from requests_oauthlib import OAuth1Session
import re
import download
import upload

CONSUMER_KEY = config.CONSUMER_KEY
CONSUMER_SECRET = config.CONSUMER_SECRET
ACCESS_TOKEN = config.ACCESS_TOKEN
ACCESS_TOKEN_SECRET = config.ACCESS_TOKEN_SECRET

USER_ID = config.USER_ID

twitter = OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

url = "https://api.twitter.com/1.1/favorites/list.json"

params ={'screen_name' : USER_ID, 'count' : 200}
res = twitter.get(url, params = params)

def main():
    if res.status_code == 200:
        for line in json.loads(res.text):
            if('extended_entities' not in line):
                return
            for i in line['extended_entities']['media']:
                if('video_info' in i): #if the tweet contains a video.
                    dic = {}
                    for v in i['video_info']['variants']:
                        if ('.mp4' in v['url']): #only .mp4 file.
                            dic[v['url']] = find_max_size(v['url'])
                    print(max(dic, key=dic.get).encode('cp932', 'ignore').decode('cp932'))
                    download.download_videos(max(dic, key=dic.get))
                else:
                    print((i['media_url_https']).encode('cp932', 'ignore').decode('cp932'))
                    download.download_pics(i['media_url_https'])
    else:
        print("Failed: %d" % res.status_code)

def find_max_size(url): #Find the max size video.
    s = re.findall(r'/\d+x\d+/', url) #e.g. /720x1280/
    t = re.findall(r'/\d+x', str(s[0])) #e.g. /720x
    u = re.findall(r'x\d+/', str(s[0])) #e.g. x1280/
    x = int(t[0].replace('x', '').replace('/', '')) #e.g. 720
    y = int(u[0].replace('x', '').replace('/', '')) #e.g. 1280
    return x * y

main()
upload.upload_pics_videos()

↓ C'est la partie pour télécharger des images / vidéos dans un dossier local. J'ai créé des dossiers appelés / pics et / vidéos et je les y ai sauvegardés. Le nom du fichier est unique par date et heure.

download.py


import requests
import datetime
import os

def download_pics(url):
  os.makedirs('pics/', exist_ok=True)
  file_name = "pics/" + datetime.datetime.now().strftime("%Y%m%d%H%M%S%f") + ".jpg "

  response = requests.get(url)
  image = response.content

  with open(file_name, "wb") as stream:
      stream.write(image)

def download_videos(url):
  os.makedirs('videos/', exist_ok=True)
  file_name = "videos/" + datetime.datetime.now().strftime("%Y%m%d%H%M%S%f") + ".mp4"

  response = requests.get(url)
  video = response.content

  with open(file_name, "wb") as stream:
      stream.write(video)

↓ Enfin, c'est la partie à télécharger sur Google Drive. Il se déplace pour télécharger dans le dossier créé à l'avance sur le lecteur.

upload.py


from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from pathlib import Path
import config

def upload_pics_videos():
  gauth = GoogleAuth()
  gauth.CommandLineAuth()
  drive = GoogleDrive(gauth)

  for p in Path("pics").glob("*"):
    q = str(p)
    f = drive.CreateFile({
      "parents": [{
        "id": config.GOOGLEDRIVE_PICS_DIRECTORY_ID
        }]
      })
    f.SetContentFile(q)
    f.Upload()
    print(f['title'], f['id'])

  for p in Path("videos").glob("*"):
    q = str(p)
    f = drive.CreateFile({
      "parents": [{
        "id": config.GOOGLEDRIVE_VIDEOS_DIRECTORY_ID
        }]
      })
    f.SetContentFile(q)
    f.Upload()
    print(f['title'], f['id'])

à la fin

Vous devriez écrire la source plus joliment. Même si je suis nouveau sur Python, je suis plein de remords. Où trouver le nom de la variable ou la taille maximale de la vidéo. .. .. Cependant, j'avais un fort désir de poster un article à M. Qiita, qui m'est toujours redevable comme livrable, et j'ai fait quelque chose qui fonctionne, alors j'ai pris le courage de le publier.

Question

Je voudrais demander à quelqu'un qui est familier avec l'API Twitter, mais sur les restrictions sur les favoris / liste GET utilisés cette fois. Même si vous exécutez réellement cette application ou ce programme

  1. Impossible d'obtenir le numéro spécifié
  2. Parfois, même un cas ne peut être obtenu.
  3. Cela ne fonctionne pas bien même s'il est démarré une fois par jour à intervalles réguliers.

Quand je cherche sur le net

Il semble y avoir une limite comme celle-là, mais je me demande pourquoi elle est respectée. Est-ce parce que l'API n'est pas utilisée correctement ou s'agit-il d'un problème tel qu'un serveur lourd? Je suis un débutant donc je ne suis pas sûr. Je vous serais reconnaissant si vous pouviez me le faire savoir dans les commentaires.

référence

Résumé des procédures depuis l'enregistrement de l'API Twitter (méthode de demande de compte) jusqu'à l'approbation * Informations en août 2019

Télécharger des images sur Google Drive avec Python

Recommended Posts

Téléchargez les images et vidéos contenues dans les tweets que vous avez aimés sur Twitter et téléchargez-les sur Google Drive
Télécharger des images sur Google Drive avec Python
Enregistrez le Tweet de Twitter avec Geo au format CSV et tracez-le sur Google Map.
Enregistrer des images sur le Web sur un lecteur avec Python (Colab)
Script pour sauvegarder les dossiers sur le serveur sur Google Drive
Téléchargez des fichiers Google Drive en Python
Télécharger et télécharger des images avec Falcon
Recevez des tweets avec la fonction Google Cloud et enregistrez automatiquement les images dans Google Photos
Exemple de code pour obtenir oauth_token et oauth_token_secret de l'API Twitter en Python 2.7
Créez et modifiez des feuilles de calcul dans n'importe quel dossier sur Google Drive avec python
[Android] Afficher des images sur le Web dans la fenêtre info de Google Map
Téléchargez collectivement les images collées dans le corps de la pull request sur Github
Implémenté dans Dataflow pour copier la structure hiérarchique de Google Drive vers Google Cloud Storage