[PYTHON] Ich habe versucht, mit der Cloud Vision API von GCP automatisch erotische Bilder von Twitter zu sammeln

Einführung

Erster Beitrag & Ich habe gerade angefangen, Programmieren zu lernen, daher gibt es viele schlechte Sätze und Codes, aber ich hoffe, Sie werden es lesen.

Motivation

Beim Durchsuchen von Bildern auf Twitter wurde ich von vielen Nur-Text-Tweets und Bildern außer dem Zielgenre gestresst. Daher dachte ich, dass es besser wäre, wenn ich nur die gewünschten extrahieren könnte. (Zusammenfassung: Ich möchte erotische Bilder)

Vorbereitung

Holen Sie sich einen API-Schlüssel zur Verwendung der Cloud Vision-API Dieser Artikel war hilfreich

Die Twitter-API gilt für die Verwendung und erhält einen API-Schlüssel und ein Token. Es erfordert ein wenig Zeit und Mühe, da der Verwendungszweck auf Englisch beschrieben werden muss. Dieser Artikel war hilfreich

Die folgenden drei Bibliotheken von Drittanbietern werden verwendet. Alle können mit pip installiert werden.

  1. schedule
  2. tweepy
  3. requests

Grober Verarbeitungsablauf

  1. Holen Sie sich Tweets von der Twitter-Timeline
  2. Speichern Sie das Bild von der URL, wenn der Tweet ein Bild enthält
  3. Senden Sie das Bild zur Analyse an die Cloud Vision-API
  4. Löschen Sie alle außer denen, die als erwachsen eingestuft werden

Implementierung

main.py


import base64
import json
import os
import pickle
import time

import schedule
import tweepy
import requests

Importieren Sie die Bibliothek.

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"

Behalten Sie jeden Schlüssel, den Sie erhalten haben.

Extrahieren Sie die erforderlichen Daten von Twitter

Holen Sie sich zuerst die TL, die die Quelle des Tweets ist. Dieses Mal verwende ich list_timeline, weil ich die Tweets des zur Liste hinzugefügten Kontos abrufen möchte, aber ich denke, es ist auch gut, user_timeline usw. zu verwenden, um auf ein bestimmtes Konto einzugrenzen.

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)


#Holen Sie sich Tweets von der Timeline
def main():
    with open('before_tl.pickle', 'rb') as f:
        before_tl = pickle.load(f)
    tl = api.list_timeline(owner_screen_name="Listen Sie die Twitter-ID des Administrators auf", slug="Der Name der Liste, die Sie erhalten möchten")
    with open('before_tl.pickle', 'wb') as f:
        pickle.dump(tl, f)
    for tweet in reversed(tl):    #Tweet, umgekehrt, um die RT-Zeit in chronologischer Reihenfolge zu sortieren
        if not tweet in before_tl:
            media_getter(tweet)

Der Grund für das Speichern von TL mit Pickle besteht darin, zu vermeiden, dass die Pay-as-you-go-GCP-API übersteuert wird. Wenn ein Tweet von TL übergeben wird, wird er mit der vorherigen TL sortiert und die Verarbeitung wird nur für neue Tweets ausgeführt.

main.py


#Benutzername von Tweet(ID)Erhalten
def username_geter(tweet):
    if 'RT' in tweet.text:
        return tweet.retweeted_status.user.screen_name
    return tweet.user.screen_name


#Rufen Sie die URL-Liste der Bilder ab
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')

Der Bildschirmname des Benutzers wird beim Speichern des Bildes als Dateiname verwendet.

Damit ist der Vorgang zum Abrufen der Bild-URL von Twitter abgeschlossen.

Bildspeicherprozess

Von hier aus können Sie das Bild speichern und zur Analyse an Cloud Vision übergeben.

main.py


#Speichern Sie das Bild von der URL und ändern Sie das Speicherziel entsprechend der Beurteilung
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)

   


#Gibt ein Urteil entsprechend dem Ergebnis zurück
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)


#Senden Sie Bilder an cloudvisoinapi und erhalten Sie Ergebnisse
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()

Das Speicherziel des Bildes wird bestimmt, indem die URL durch "/" geteilt und aufgelistet wird und das extrahierte letzte Verzeichnis mit dem Bildschirmnamen und dem Verzeichnis kombiniert wird.

Das gespeicherte Bild wird an die API übergeben und der Prozess wird basierend auf dem zurückgegebenen Ergebnis verzweigt. Klicken Sie hier, um zu sehen, welcher Wert zurückgegeben wird (https://cloud.google.com/vision/docs/reference/rpc/google.cloud.vision.v1?hl=ja#google.cloud.vision). v1.SafeSearchAnnotation).

Es ist eine Spezifikation, LIKELY (höchstwahrscheinlich) und höher zu speichern und die anderen zu löschen, aber dieses Mal habe ich das Speicherziel entsprechend dem Urteil geändert, um die Genauigkeit von Cloud Vision zu überprüfen.

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---')

Lauf

Machen wir das. Die Verarbeitung erfolgt alle 8 Sekunden nach Zeitplan.

main.py


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

Ausführungsergebnis

(Da das Bild eines Drittanbieters verwendet wird, ist das Bild unscharf.) CEDAnrzRRw406711591791780_1591792292.png

Ich konnte nur die erotischen Bilder sicher extrahieren und speichern. Es ist ein Meisterwerk, dass immer mehr Bilder hinzugefügt werden. IFUDYjuALJPrNEI1591792337_1591792339.png Es wurde bestätigt, dass die Genauigkeit im Vergleich zu der als MÖGLICH beurteilten ziemlich hoch war. Alles, was gesehen werden kann, wird als wahrscheinlich oder höher beurteilt.

Nachwort

Dieses Mal habe ich SAFE_SEARCH_DETECTION verwendet (die Fähigkeit zu bestimmen, ob ein Bild schädlichen Inhalt enthält), aber es gibt viele andere Funktionen in der Cloud Vision-API. Wenn Sie die Funktion gut nutzen, können Sie sie für verschiedene Bildersammlungen und Klassifizierungen verwenden.

Verweise

Probieren Sie TEXT_DETECTION der Google Cloud Vision-API in Python aus Ich habe versucht, die Google Cloud Vision-API zu verwenden Verwendung von Tweety ~ Teil 1 ~ [Getting Tweet]

Recommended Posts

Ich habe versucht, mit der Cloud Vision API von GCP automatisch erotische Bilder von Twitter zu sammeln
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Ich habe versucht, Zeichen aus Untertiteln zu extrahieren (OpenCV: Google Cloud Vision API)
Ich habe versucht, automatisch Bilder von Kanna Hashimoto mit Python zu sammeln! !!
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Verwendung der Cloud Vision API von GCP
Erkennen Sie japanische Zeichen anhand von Bildern mithilfe der Cloud Vision-API von Google mit Python
[Rails] Erkennen radikaler Bilder durch Analysieren von Bildern mithilfe der Cloud Vision API
Ich wollte viele Bilder sammeln, also habe ich versucht, "Google Image Download" zu verwenden.
Ich habe versucht, von Postman aus mit Cisco Guest Shell als API-Server zu arbeiten
Ich habe versucht, API list.csv mit Python aus swagger.yaml zu erstellen
Ich habe versucht, Videos mit der Youtube Data API (Anfänger) zu suchen.
Versuchen Sie, Lebensmittelfotos mithilfe der Google Cloud Vision-API zu beurteilen
Ich habe die Google Cloud Vision-API zum ersten Mal ausprobiert
[Go language] Sammeln und speichern Sie Vtuber-Bilder mithilfe der Twitter-API
Ich habe versucht, verschiedene Informationen von der Codeforces-API abzurufen
Ich habe versucht, mit pypyodbc schnell Daten von AS / 400 abzurufen
Ich habe versucht, eine Quip-API zu erstellen
Ich habe versucht, meinen Lieblingssänger (SHISHAMO) mit der Spotify-API zu analysieren
Ich habe Teslas API berührt
[Python] Ich habe versucht, mithilfe der YouTube-Daten-API verschiedene Informationen abzurufen!
Ich habe versucht, mich automatisch mit Selen bei Twitter anzumelden (RPA, Scraping)
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, mit pypyodbc Preparation 1 schnell Daten von AS / 400 abzurufen
Ich habe versucht, den unter "Abrufen von Bildern von der Flickr-API mit Python" (Teil 2) veröffentlichten Vorlagencode zu überarbeiten.
Ich habe versucht, E-Mails von Node.js und Python mithilfe des E-Mail-Zustelldienstes (SendGrid) von IBM Cloud zuzustellen!
Ich habe versucht, verschiedene Sätze mit der automatischen Zusammenfassungs-API "summpy" zusammenzufassen.
Bei der Einführung der Google Cloud Vision-API in Schienen habe ich die Dokumentation befolgt.
Ich habe versucht, Azure Speech to Text zu verwenden.
Ich habe versucht, YOUTUBE Data API V3 zu verwenden
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Verwenden Sie die Google Cloud Vision-API von Python
Transkription von Bildern mit der Vision API von GCP
Ich habe versucht, die COTOHA-API zu berühren
Ich habe eine Web-API erstellt
Ich habe versucht, Headless Chrome von Selenium zu verwenden
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
Speichern Sie Bilder und Videos, die von der Twitter-Suche aufgerufen wurden, automatisch mit Pythonista3 auf dem iPhone
Ich habe versucht, automatisch eine Portverwaltungstabelle aus L2SW Config zu generieren
[IBM Cloud] Ich habe versucht, über Cloud Funtions (Python) auf die Tabelle Db2 on Cloud zuzugreifen.
Python-Anfänger haben es in 3 Tagen von der Installation des Betriebssystems bis zur Ausführung der Twitter-API versucht
Ich habe versucht, Python-Code aus .Net mit Pythonnet auszuführen (Hallo World Edition)
Ich habe versucht, Remote API mit GAE / J zu verwenden
Ich habe versucht, die Qiita-API von Anfang an zu aktivieren
Ich habe "License OCR" mit der Google Vision API ausprobiert
Ich möchte mit Python eine E-Mail von Google Mail senden.
So rufen Sie die Cloud-API über GCP-Cloud-Funktionen auf
[Ich möchte Bilder mit Tensorflow klassifizieren] (2) Lassen Sie uns Bilder klassifizieren
Ich habe "Receipt OCR" mit der Google Vision API ausprobiert
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Ich habe versucht, die Syntax zu bewerten, die mit der COTOHA-API zu humorvoll und humorvoll war.
Ich möchte Bilder von Katzen von Instagram erkennen
Ich habe versucht, mit VOICEROID2 2 automatisch zu lesen und zu speichern
Ich habe versucht, Iris aus dem Kamerabild zu erkennen