[PYTHON] [Google Photo & Slack Photo Bot] Eine Geschichte über das Erstellen eines Bots, der ein Foto in Google Photo erfasst und an Slack sendet.

Vorwort

――Ich wollte im Herbst meines zweiten Studienjahres Entwicklungsingenieur werden und begann mein Selbststudium in Programmierung.

Warum ich beschlossen habe, einen Artikel zu schreiben

Auf diese Weise habe ich beschlossen, einen Fotobot zu erstellen, aber ich fand es schwierig ... zu diesem Zeitpunkt ist noch ein langer Weg vor mir. Ich stecke oft fest und habe beschlossen, einen Artikel zu schreiben. (Der Grund für das Schreiben in Python ist, dass ich studieren wollte, weil es eine Sprache war, die ich nie persönlich geschrieben hatte, weil der CTO Python mag lol)

Tor

Rufen Sie, wie im Bild unten gezeigt, den Bot namens gallery auf, geben Sie gallery ein und lassen Sie das Bild nachlassen.

Schauen wir uns die Verarbeitung einzeln an.

Verfahren

  1. Erstellen Sie einen Bot-Benutzer in Slack
  2. Installieren Sie die in Python implementierte Bot-Bibliothek
  3. Installieren Sie das gdata-Modul
  4. Google Auth-Authentifizierung (Abrufen von Fotos von Google Photo)
  5. Veröffentlichen Sie Text und Fotos mithilfe von Rtmbot und Slack API in Slack.

Entwicklungsumgebung

--Python 2.7 (Bereiten Sie die Entwicklungsumgebung mit pyenv vor)

1. Erstellen Sie einen Bot-Benutzer in Slack

Erstellen Sie zunächst einen Bot-Benutzer auf der Seite Slack Apps. Das im roten Rechteck geschriebene ist ein Bot-Token. Kopieren Sie es also an einen anderen Ort. スクリーンショット 2019-06-22 12.44.19.png

2. Installieren Sie die in Python implementierte Bot-Bibliothek

Installieren Sie die Open Source Bot-Verwaltungsbibliothek über pip (https://github.com/slackapi/python-rtmbot).

$ pip install rtmbot 

Erstellen Sie danach die Datei rtmbot.conf und bearbeiten Sie sie wie unten gezeigt.

rtmbot.conf


# Add the following to rtmbot.conf
 DEBUG: True # make this False in production

 # 1.Bitte schreiben Sie hier das Token des damals erstellten Bots.
 SLACK_TOKEN: "xoxb-11111111111-222222222222222"

  #Schreiben Sie hier den Bot-Pfad.(Zwischen den Namen der Verzeichnisse/nicht,.Lass uns schreiben.)
 ACTIVE_PLUGINS:
     - plugins.google_photo_to_slack.GooglePhotoToSlackBot

3. Installieren Sie das gdata-Modul

$ pip install gdata

4. Google OAuth-Authentifizierung (Abrufen von Fotos von Google Photo)

Hier wird erläutert, wie Sie die Google OAuth 2.0-Authentifizierung verwenden.

Google Cloud Platform Dashboard-> Google APIs verwenden-> Anmeldeinformationen, OAuth2.0-Client Erstellen Sie eine ID und laden Sie die geheime JSON-Datei herunter. Wählen Sie als Typ "Andere".

スクリーンショット 2017-08-11 20.19.37.png

Da die Anzahl der Dateien zugenommen hat, ist die Verzeichnisstruktur wie folgt. Im Moment müssen Sie nichts über den Inhalt von "credentials.dat" schreiben.

rtmbot
├── photo-gallery.json
├── credentials.dat
├── plugins
│   ├── __init__.py
│   └── google_photo_to_slack.py
├── rtmbot.conf
└── rtmbot.log

Um Ihr Login zu bestätigen, schreiben Sie zunächst Folgendes. Wenn eines der in der folgenden Datei aufgeführten Module nicht installiert ist, installieren Sie es.

google_photo_to_slack.py


#!/usr/bin/python2.7
 
# module ----  
import os
import webbrowser
from datetime import datetime, timedelta
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
import gdata.photos.service
import gdata.media
import gdata.geo
import httplib2
import json
import urllib2
 
# Google Authetication
def OAuth2Login(client_secrets, credential_store, email):
    scope='https://picasaweb.google.com/data/'
    user_agent='picasawebuploader'
    storage = Storage(credential_store)
    credentials = storage.get()
 
    if credentials is None or credentials.invalid:
        flow = flow_from_clientsecrets(client_secrets, scope=scope, redirect_uri='urn:ietf:wg:oauth:2.0:oob')
        uri = flow.step1_get_authorize_url()
        webbrowser.open(uri)
        code = raw_input('Enter the authentication code: ').strip()
        credentials = flow.step2_exchange(code)
        storage.put(credentials)
 
    if (credentials.token_expiry - datetime.utcnow()) < timedelta(minutes=5):
        http = httplib2.Http()
        http = credentials.authorize(http)
        credentials.refresh(http)
 
    gd_client = gdata.photos.service.PhotosService(source=user_agent,
                                               email=email,
                                               additional_headers={'Authorization' : 'Bearer %s' % credentials.access_token})
    return gd_client
 

# main ----- 
if __name__ == '__main__':
    email = os.environ['EMAIL']
    confDir = os.path.abspath(os.path.dirname(__file__))
    client_secrets = os.path.join(confDir, 'photo-gallery.json') 
    credential_store = os.path.join(confDir, 'credentials.dat') 
    gd_client = OAuth2Login(client_secrets, credential_store, email)
 
    albums = gd_client.GetUserFeed()
    for album in albums.entry:
        print 'Album: %s (%s)' % (album.title.text, album.numphotos.text)
 
        photos = gd_client.GetFeed('/data/feed/api/user/default/albumid/%s?kind=photo' % (album.gphoto_id.text))
        for photo in photos.entry:
            print(photo.title.text)
            f = open(photo.title.text, 'w')
            f.write(urllib2.urlopen(photo.content.src).read())
            f.close()

Und wenn ich die obige Datei starte,

$ python google_photo_to_slack.py

Wie unten gezeigt, zeigt der Browser eine Fotoseite an und die Konsole fordert Sie auf, den im Browser angezeigten Authentifizierungscode einzugeben.

Enter the authentication code: 

Geben Sie den im Browser angezeigten Authentifizierungscode ein, um die Anmeldung abzuschließen.

Noch einmal,

$ python google_photo_to_slack.py 

Wenn Sie ausführen, werden alle Fotos in Google Foto heruntergeladen.

5. Veröffentlichen Sie Text und Fotos mithilfe von Rtmbot und Slack API in Slack.

Bearbeiten Sie die Google PhotoToSlack-Datei oben wie folgt.

GooglePhotoToSlackBot.py


class GooglePhotoToSlackBot (Plugin):
    MEDIA_ARR = []
    RANDOM_NUMBER = 0
    EMAIL = os.version['EMAIL']
    CHANNEL_POST = ''
    SLACK_BOT_TOKEN = os.version['SLACK_BOT_TOKEN']

    PLUGIN_CHILD_DIRECTORY = os.path.abspath(os.path.dirname(__file__))
    PLUGIN_DIRECTORY = os.path.abspath(
        os.path.join(PLUGIN_CHILD_DIRECTORY, os.pardir)
    )
    RTMBOT_DIRECTORY = os.path.abspath(
        os.path.join(PLUGIN_DIRECTORY, os.pardir)
    )
    CLIENT_SECRETS = os.path.join(RTMBOT_DIRECTORY, os.version['SECRET_JSON'])
    CREDENTIAL_STORE = os.path.join(
        RTMBOT_DIRECTORY, os.version['CREDENTIAL_DAT']
    )

    def process_message(self, data):
        feedback_pattern = re.compile(
            #Geben Sie hier die ID des Bots ein, beginnend mit U, das in der API für die Liste der lockeren Benutzer angezeigt wird
            r'.*<@UAAAAAAA.*(gallery).*', re.DOTALL | re.IGNORECASE
        )

        if not (re.match(feedback_pattern, data['text'])):
            return

        self.CHANNEL_POST = data['channel']

        message = u"Das heutige Bild/Ich lade das Video herunter! Bitte warte eine Weile!"
        message += "Das Herunterladen von Videos kann einige Zeit dauern."
        response = self.slack_client.api_call(
            "chat.postMessage",
            channel=self.CHANNEL_POST,
            text=message,
            link_names=1,
            as_user=True
        )

        self.fetch_all_media()
        self.post_random_media()

    def oauth_login(self, client_secrets, credential_store, email):
        scope = 'https://picasaweb.google.com/data/'
        user_agent = 'picasawebuploader'
        storage = Storage(credential_store)
        credentials = storage.get()
        now_time = datetime.utcnow()

        if credentials is None or credentials.invalid:
            flow = flow_from_clientsecrets(
                client_secrets,
                scope=scope,
                redirect_uri='urn:ietf:wg:oauth:2.0:oob'
            )
            uri = flow.step1_get_authorize_url()
            webbrowser.open(uri)
            code = raw_input('Enter the authentication code: ').strip()
            credentials = flow.step2_exchange(code)
            storage.put(credentials)

        if (credentials.token_expiry - now_time) < timedelta(minutes=5):
            http = httplib2.Http()
            http = credentials.authorize(http)
            credentials.refresh(http)

        gd_client = gdata.photos.service.PhotosService(
            source=user_agent,
            email=email,
            additional_headers={
                'Authorization': 'Bearer %s' % credentials.access_token
            }
        )

        return gd_client

    def fetch_all_media(self):
        gd_client = self.oauth_login(
            self.CLIENT_SECRETS,
            self.CREDENTIAL_STORE,
            self.EMAIL
        )

        albums = gd_client.GetUserFeed()
        for album in albums.entry:
            medias = gd_client.GetFeed(
                '/data/feed/api/user/default/albumid/%s' %
                (album.gphoto_id.text)
            )
            for media in medias.entry:
                self.MEDIA_ARR.append(media)

    def get_random_number_in_array(self, arr):
        max_length = len(arr)
        return random.randint(0, max_length)
               
    def post_random_media(self):
        self.RANDOM_NUMBER = self.get_random_number_in_array(self.MEDIA_ARR)
        media_object = self.MEDIA_ARR[self.RANDOM_NUMBER]
        media_file = open(media_object.title.text, 'wb')
        media_file.write(response.content)
        media_file.close()
        media_path = self.RTMBOT_DIRECTORY + "/" + media_object.title.text

        with open(media_path, 'rb') as f:
            param = {
                'token': self.SLACK_BOT_TOKEN,
                'channels': self.CHANNEL_POST,
                'title': u'Today\'s ' + media
            }
            r = requests.post(
                "https://slack.com/api/files.upload",
                params = param,
                files = {'file': f}
            )

Geben Sie dann im Verzeichnis rtmbot den Befehl rtmbot ein, um den rtmbot-Server zu starten. Geben Sie dann in Slack @gallery ein. (Jeder Kanal ist in Ordnung.)

$ rtmbot

Laden Sie das heutige Bild / Video im obigen Code herunter! Bitte warte eine Weile! Wenn das Foto in die Lücke fließt, ist der Fotobot fertig !!

Alle Codes

Ich habe auf Github mit verschiedenen Funktionen gepostet (z. B. Löschen von Fotos, um keine heruntergeladenen Fotos zu sammeln). Ich hoffe, Sie können es sehen, wenn Sie interessiert sind. https://github.com/romukey/PythonAlgorithm/blob/master/google_gallery/plugins/google_photo_to_slack.py

Referenziert

Picasa-Web-API-Dokumentation https://developers.google.com/picasa-web/docs/1.0/developers_guide_python

So melden Sie sich für Google OAuth an https://stackoverflow.com/questions/30474269/using-google-picasa-api-with-python

Recommended Posts

[Google Photo & Slack Photo Bot] Eine Geschichte über das Erstellen eines Bots, der ein Foto in Google Photo erfasst und an Slack sendet.
Eine Geschichte, die Slack und Google Spreadsheet verbindet
Die Geschichte der Erstellung von Botonyan, das den Inhalt von Google Text & Tabellen als Antwort auf ein bestimmtes Keyword in Slack zurückgibt
Eine Geschichte von Versuch und Irrtum beim Versuch, eine dynamische Benutzergruppe in Slack zu erstellen
Eine Geschichte, die die Discord-Aktivität im Slack-Status widerspiegelt
Eine Geschichte darüber, wie man einen relativen Pfad in Python angibt.
Eine Geschichte über alles von der Datenerfassung über die KI-Entwicklung bis hin zur Veröffentlichung von Webanwendungen in Python (3. KI-Entwicklung)
Die Geschichte des Erstellens eines Bots, der aktive Mitglieder in einem bestimmten Slack-Kanal mit Python anzeigt
Eine Geschichte über einen Erstellungsfehler in einer gemeinsam genutzten Bibliothek, die auf libusb verweist
Schreiben Sie ein Programm, das das Programm missbraucht und 100 E-Mails sendet
Wie man einen lockeren Bot macht
Erstellen Sie einen Bot, der die Anzahl der Personen, die für das neue Corona-Virus in Tokio positiv sind, an Slack sendet
Eine Geschichte über das Erstellen eines Programms, mit dem die Anzahl der Instagram-Follower in einer Woche von 0 auf 700 erhöht wird
Eine Geschichte, die es aufgegeben hat, JavaScripthon unter Windows auszuführen.
Die Geschichte, den Versuch aufzugeben, mit Heroku eine Verbindung zu MySQL herzustellen
Eine Geschichte über Python Pop und Append
Eine Geschichte über einen Versuch, uwsgi auf einer fehlgeschlagenen EC2-Instanz zu installieren
Die Geschichte einer Box, die Peppers AL Memory und MQTT miteinander verbindet
Die Geschichte, einen Line Bot zu erstellen, der uns den Zeitplan für die Wettbewerbsprogrammierung erzählt
In Python habe ich einen LINE-Bot erstellt, der Polleninformationen aus Standortinformationen sendet.
Ich habe versucht, einen x86-Bootloader zu erstellen, der vmlinux mit Rust booten kann
Ich möchte einen Slack-Bot, der das Gehalt eines Teilzeitjobs aus dem Zeitplan von Google Kalender berechnet und anzeigt!