[PYTHON] J'ai essayé de collecter automatiquement des images érotiques de Twitter à l'aide de l'API Cloud Vision de GCP

introduction

Premier message et je viens de commencer à apprendre la programmation, il y a donc beaucoup de phrases et de codes pauvres, mais j'espère que vous pourrez le lire.

Motivation

Lorsque je parcourais des images sur Twitter, j'étais stressé par de nombreux tweets et images contenant uniquement du texte autre que le genre cible. Par conséquent, j'ai pensé que ce serait mieux si je ne pouvais extraire que ceux désirés. (Résumé: je veux des images érotiques)

Préparation

Obtenez une clé API pour utiliser l'API Cloud Vision Cet article a été utile

L'API Twitter s'applique à l'utilisation et obtient une clé API et un jeton. Cela prend un peu de temps et d'efforts car il est nécessaire de décrire l'utilisation prévue en anglais. Cet article a été utile

Les trois bibliothèques tierces suivantes sont utilisées. Tous peuvent être installés avec pip.

  1. schedule
  2. tweepy
  3. requests

Flux de traitement approximatif

  1. Obtenez des tweets de la chronologie Twitter
  2. Enregistrez l'image à partir de l'URL si le tweet contient une image
  3. Envoyez l'image à l'API Cloud Vision pour analyse
  4. Supprimer tout sauf ceux jugés adultes

la mise en oeuvre

main.py


import base64
import json
import os
import pickle
import time

import schedule
import tweepy
import requests

Importez la bibliothèque.

main.py


API_KEY        = 'Twitter API key'
API_SECRET_KEY = 'Twitter API secret key'
ACCESS_TOKEN        = 'Twitter Access token'
ACCESS_TOKEN_SECRET = 'Twitter Access token secret'

CVA_API_KEY = "Cloud Vision API key"

Conservez chaque clé que vous avez obtenue.

Extraire les données nécessaires de Twitter

Tout d'abord, obtenez le TL qui est la source du tweet. Cette fois, j'utilise list_timeline parce que je veux extraire les tweets du compte ajouté à la liste, mais je pense qu'il est également bon d'utiliser user_timeline, etc. pour se limiter à un compte spécifique.

main.py


auth = tweepy.OAuthHandler(API_KEY, API_SECRET_KEY)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)


api = tweepy.API(auth, wait_on_rate_limit=True)


#Obtenez des tweets de la chronologie
def main():
    with open('before_tl.pickle', 'rb') as f:
        before_tl = pickle.load(f)
    tl = api.list_timeline(owner_screen_name="Identifiant Twitter de l'administrateur de la liste", slug="Le nom de la liste que vous souhaitez obtenir")
    with open('before_tl.pickle', 'wb') as f:
        pickle.dump(tl, f)
    for tweet in reversed(tl):    #Tweet, inversé pour trier l'heure RT par ordre chronologique
        if not tweet in before_tl:
            media_getter(tweet)

La raison d'économiser TL avec pickle est d'éviter de surpasser l'API GCP de paiement à l'utilisation. Lors du passage d'un tweet de TL, il est assemblé avec le TL précédent et le traitement n'est exécuté que pour les nouveaux tweets.

main.py


#Nom d'écran de l'utilisateur à partir du Tweet(ID)Avoir
def username_geter(tweet):
    if 'RT' in tweet.text:
        return tweet.retweeted_status.user.screen_name
    return tweet.user.screen_name


#Obtenez la liste d'URL des images
def media_getter(tweet):
    try:
        medialist = [d.get('media_url') for d in tweet.extended_entities["media"]]
        name = username_geter(tweet)
        for media in medialist:
            img_save(media,name)
    except:
        print('Text Only')

Le nom d'écran de l'utilisateur est utilisé comme nom de fichier lors de l'enregistrement de l'image.

Ceci termine le processus d'obtention de l'URL de l'image à partir de Twitter.

Processus de stockage d'images

À partir de là, vous pouvez enregistrer l'image et la transmettre à Cloud Vision pour analyse.

main.py


#Enregistrez l'image à partir de l'URL et changez la destination de sauvegarde en fonction du jugement
def img_save(media,name):
    url_path = media.split("/")[-1]
    file_name = "adult/" + name + url_path

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

    with open(file_name, "wb") as f:
        f.write(image)
    identify = img_sort(file_name)

    if identify == "adult":
        print('---saved image---')
    else:
        import os
        os.remove(file_name)

   


#Renvoie un jugement en fonction du résultat
def img_sort(img_path):
    res_json = img_judge(img_path)
    judgement = res_json['responses'][0]['safeSearchAnnotation']['adult']

    if judgement == "POSSIBLE":
        print(judgement)
        return "possible"
    elif judgement == "LIKELY" or judgement == "VERY_LIKELY":
        print(judgement)
        return "adult"
    else:
        print(judgement)


#Envoyez des images à cloudvisoinapi et recevez des résultats
def img_judge(image_path):
    api_url = 'https://vision.googleapis.com/v1/images:annotate?key={}'.format(CVA_API_KEY)
    with open(image_path, "rb") as img:
        image_content = base64.b64encode(img.read())
        req_body = json.dumps({
            'requests': [{
                'image': {
                    'content': image_content.decode('utf-8')
                },
                'features': [{
                    'type': 'SAFE_SEARCH_DETECTION'
                }]
            }]
        })
        res = requests.post(api_url, data=req_body)
        return res.json()

La destination de sauvegarde de l'image est déterminée en divisant l'URL par "/" et en la listant, et en combinant le dernier répertoire extrait avec le nom d'écran et le répertoire.

L'image enregistrée est transmise à l'API et le processus est ramifié en fonction du résultat renvoyé. Cliquez ici pour voir la valeur renvoyée (https://cloud.google.com/vision/docs/reference/rpc/google.cloud.vision.v1?hl=ja#google.cloud.vision. v1.SafeSearchAnnotation).

Il s'agit d'une spécification pour enregistrer LIKELY (très probablement) et au-dessus et supprimer les autres, mais cette fois, j'ai changé la destination de sauvegarde en fonction du jugement pour vérifier l'exactitude de Cloud Vision.

main.py


import shutil

elif identify == "possible":
    new_file_name = "possible/" + name + url_path
    shutil.move(file_name, new_file_name)
    print('---saved possibleimage---')
else:
    new_file_name = "other/" + name + url_path
    shutil.move(file_name, new_file_name)
    print('---saved otherimage---')

Courir

Faisons le. Le traitement est effectué toutes les 8 secondes en utilisant la planification.

main.py


if __name__ == "__main__":
    schedule.every(8).seconds.do(main)
    while True:
        schedule.run_pending()
        time.sleep(1)

Résultat d'exécution

(Parce qu'il utilise une image tierce, l'image est floue) CEDAnrzRRw406711591791780_1591792292.png

J'ai pu extraire en toute sécurité et enregistrer uniquement les images érotiques. C'est un chef-d'œuvre que les images s'ajoutent de plus en plus. IFUDYjuALJPrNEI1591792337_1591792339.png Il a été confirmé que la précision était assez élevée par rapport à celle jugée POSSIBLE. Tout ce que vous pouvez voir est jugé PROBABLE ou supérieur.

Épilogue

Cette fois, j'ai utilisé SAFE_SEARCH_DETECTION (la possibilité de déterminer si une image contient du contenu nuisible), mais il existe de nombreuses autres fonctionnalités dans l'API Cloud Vision. Si vous faites bon usage de la fonction, vous pouvez l'utiliser pour diverses collections et classifications d'images.

Les références

Essayez TEXT_DETECTION de l'API Google Cloud Vision en Python J'ai essayé d'utiliser l'API Google Cloud Vision Comment utiliser Tweety ~ Partie 1 ~ [Obtenir un Tweet]

Recommended Posts

J'ai essayé de collecter automatiquement des images érotiques de Twitter à l'aide de l'API Cloud Vision de GCP
J'ai essayé d'utiliser l'API Google Cloud Vision
J'ai essayé d'extraire des caractères des sous-titres (OpenCV: API Google Cloud Vision)
J'ai essayé de collecter automatiquement des images de Kanna Hashimoto avec Python! !!
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
Comment utiliser l'API Cloud Vision de GCP
Détectez les caractères japonais à partir d'images à l'aide de l'API Cloud Vision de Google avec Python
[Rails] Comment détecter des images radicales en analysant des images à l'aide de l'API Cloud Vision
Je voulais collecter beaucoup d'images, j'ai donc essayé d'utiliser "google image download"
J'ai essayé de fonctionner à partir de Postman en utilisant Cisco Guest Shell comme serveur API
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
J'ai essayé de rechercher des vidéos à l'aide de l'API de données Youtube (débutant)
Essayez de juger des photos de plats à l'aide de l'API Google Cloud Vision
J'ai essayé l'API Google Cloud Vision pour la première fois
[Go language] Collectez et enregistrez des images Vtuber à l'aide de l'API Twitter
J'ai essayé d'obtenir diverses informations de l'API codeforces
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc
J'ai essayé de créer l'API Quip
J'ai essayé d'analyser mon chanteur préféré (SHISHAMO) en utilisant l'API Spotify
J'ai touché l'API de Tesla
[Python] J'ai essayé d'obtenir diverses informations en utilisant l'API de données YouTube!
J'ai essayé de me connecter automatiquement à Twitter avec du sélénium (RPA, scraping)
J'ai essayé d'utiliser l'API checkio
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc Préparation 1
J'ai essayé de refactoriser le code du modèle publié dans "Obtenir des images de l'API Flickr avec Python" (Partie 2)
J'ai essayé de livrer du courrier depuis Node.js et Python en utilisant le service de livraison de courrier (SendGrid) d'IBM Cloud!
J'ai essayé de résumer diverses phrases à l'aide de l'API de synthèse automatique "summpy"
Lors de l'introduction de l'API Google Cloud Vision sur les rails, j'ai suivi la documentation.
J'ai essayé d'utiliser Azure Speech to Text.
J'ai essayé d'utiliser l'API de données YOUTUBE V3
J'ai essayé de classer le texte en utilisant TensorFlow
Utiliser l'API Google Cloud Vision de Python
Transcription d'images avec l'API Vision de GCP
J'ai essayé de toucher l'API COTOHA
J'ai créé une API Web
J'ai essayé d'utiliser Headless Chrome de Selenium
J'ai essayé d'utiliser l'API BigQuery Storage
Enregistrez automatiquement les images et les vidéos touchées par la recherche Twitter sur l'iPhone à l'aide de Pythonista3
J'ai essayé de générer automatiquement une table de gestion des ports à partir de L2SW Config
[IBM Cloud] J'ai essayé d'accéder à la table Db2 on Cloud à partir de Cloud Funtions (python)
Les débutants en Python l'ont essayé en 3 jours, de l'installation du système d'exploitation à l'exécution de l'API Twitter
J'ai essayé d'exécuter du code Python à partir de .Net en utilisant Pythonnet (édition Hallo World)
J'ai essayé d'utiliser l'API à distance avec GAE / J
J'ai essayé d'accéder à l'API Qiita depuis le début
J'ai essayé "License OCR" avec l'API Google Vision
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
Comment appeler l'API Cloud à partir de GCP Cloud Functions
[Je veux classer les images à l'aide de Tensorflow] (2) Classifions les images
J'ai essayé "Receipt OCR" avec l'API Google Vision
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai essayé de noter la syntaxe trop humoristique et humoristique en utilisant l'API COTOHA.
Je veux détecter des images de chats d'Instagram
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
J'ai essayé de détecter l'iris à partir de l'image de la caméra