[PYTHON] Laden Sie gemeinsam die Bilder herunter, die in den Text der Pull-Anfrage auf Github eingefügt wurden

Die Screenshots stammen aus DroidKaigi / Konferenz-App-2020.

Warum

Wir entwickeln Apps für unsere eigenen Dienste. Als vorläufigen Bericht, wenn der App-Updater veröffentlicht wird, möchte ich die Freigabe der Screenshot-Liste neu erstellter oder geänderter Bildschirme für die Planungs- und Betriebsabteilungen teilweise automatisieren. Wenn Sie es später in einem Satz zusammenstellen, können Sie es auch effizient erstellen, da bereits eine Sammlung von Screenshots vorhanden ist. Das Entwicklungsteam, dem ich angehöre, hat die Angewohnheit, Screenshots und Gif-Animationen in den Text der Pull-Anfrage einzufügen, wenn eine Überprüfung der Pull-Anfrage angefordert wird. Daher werde ich dieses Bild mit der Planungs- und Betriebsabteilung teilen.

Massen-Download mit Python

Vorbereitungen

sh


mkdir Downloads
pip install PyGithub BeautifulSoup4 requests

Ausführung Python-Quellcode

main.py


import os
from datetime import datetime, timedelta
#Konvertieren Sie von Markdown in HTML
import markdown
#Github API-Client
from github import Github
#HTML-Parser
from bs4 import BeautifulSoup
#HTTP-Client
import requests
#Holen Sie sich die Erweiterung vom MIME-Typ
import mimetypes

#Zielverzeichnis
save_dir = "Downloads"
#Erstellen Sie ein verantwortliches Objekt, um Markdown in HTML zu konvertieren
md = markdown.Markdown()
#Machen Sie hier ein Zugriffstoken
# https://github.com/settings/tokens
access_token = os.environ['GITHUB_API_ACCESS_TOKEN']
#Erstellen Sie ein Github-Objekt mit einem Zugriffstoken
g = Github(access_token)
#Repository abrufen
gr = g.get_organization('DroidKaigi').get_repo('conference-app-2020')
#Für persönliche Repositories
# gr = g.get_user().get_repo('repository_name')
#Bereich zum Herunterladen(Standard für das Erstellungsdatum der Anforderung ziehen)
start_datetime = datetime(2020, 1, 1)
end_datetime = datetime(2020, 1, 13)
#Holen Sie sich eine Liste der geschlossenen Pull-Anforderungen
prs = gr.get_pulls(state='close', base='master')
for pr in prs:
    #Die Reihenfolge ist in absteigender Reihenfolge des Erstellungsdatums
    if pr.created_at < start_datetime:
        #Sie müssen nicht weiter zurückgehen
        break
    if pr.created_at < end_datetime:
        #Geben Sie den Downloadbereich ein
        #Beschränkt auf fusionierte PR
        if pr.merged != True:
            continue
        print("#%d %s" % (pr.number, pr.title))
        #Konvertieren Sie den Markdown des Pull-Anforderungskörpers in HTML
        html = md.convert(pr.body)
        #HTML analysieren
        soup = BeautifulSoup(html, features='html.parser')
        #Für alle img Tags
        for img_index, img in enumerate(soup.find_all('img')):
            #Ruft den Wert des src-Attributs als Bild-URL ab
            url = img.get('src')
            #Unterstützt Fälle, in denen das src-Attribut leer ist
            if len(url) == 0:
                continue
            #URL herunterladen
            r = requests.get(url)
            if r.ok:
                #Erfolgreicher Download
                #Holen Sie sich den MIME-Typ der Datei
                content_type = r.headers['Content-Type']
                #Holen Sie sich die Erweiterung vom MIME-Typ
                ext = mimetypes.guess_extension(content_type)
                #Ich möchte den Titel der Pull-Anforderung in den Dateinamen aufnehmen
                #Wenn der Dateiname einen Schrägstrich enthält, können Sie keine Datei erstellen.
                #In vollen Winkel konvertieren
                title = pr.title.replace('/', '/')
                #Zielpfad erstellen
                path = "%s/%04d_%s_%02d.%s" % (save_dir,
                                               pr.number, title, img_index, ext)
                #Bild speichern
                with open(path, 'wb') as f:
                    f.write(r.content)
            else:
                #Download-Fehler
                message = "Image download error\n%s\n%d %s" % (
                    url, r.status_code, r.reason)
                raise RuntimeError(message)

Je nach Situation angepasst

Derzeit wird der obige Quellcode auf einem lokalen PC ausgeführt und sofort in einen lokalen Ordner heruntergeladen. Zum Beispiel wäre es gut, eine solche Anpassung an die Situation der Organisation oder des Projekts vorzunehmen.

Laden Sie Bilder nur für den Unterschied im Versions-Upgrade herunter

Lassen Sie im Release-Workflow von Homebrew App die PR-Liste nach der vorherigen Versionsversion und Release Note zusammenführen. Ich führe ein Python-Skript aus, das automatisch erstellt wird (Quickecho / Releases). Wenn Sie den Text aus der PR-Liste erhalten und den gleichen Vorgang wie oben ausführen, können Sie das Bild nur für den Unterschied im Versions-Upgrade herunterladen.

Link zum entsprechenden Quellcode

wichtiger Punkt

Bitte beachten Sie, dass die Screenshots, die Sie mit anderen Abteilungen teilen, keine vertraulichen Informationen wie AWS-Zugriffsschlüssel enthalten.

Recommended Posts

Laden Sie gemeinsam die Bilder herunter, die in den Text der Pull-Anfrage auf Github eingefügt wurden
[Blender] Druckt alle an das Objekt angehängten ShapeKey-Namen
So erhöhen Sie die Anzahl der Datensatzbilder für maschinelles Lernen
Speichern Sie Bilder im Web mit Python (Colab) auf einem Laufwerk.
Immerhin die Geschichte der Rückkehr von Linux zu Windows
Rufen Sie github api in Python auf, um Informationen zur Pull-Anforderung zu erhalten
Der Weg zum Herunterladen von Matplotlib
Messen Sie die Testabdeckung von Push-Python-Code auf GitHub.
Zeigen Sie das Bild der an den PC angeschlossenen Kamera auf der GUI an.
Lesen Sie den gesamten Inhalt von proc / [pid] ~ Von setgroups bis wchan ~
Verkleide das Gras auf GitHub und versuche Ingenieur zu werden.
Lesen Sie den gesamten Inhalt von proc / [pid] ~ Von oom_adj bis sessionid ~
Verwendung von Jupyter am Frontend von Spacon ITO
Ein Befehl zum einfachen Überprüfen der Netzwerkgeschwindigkeit auf der Konsole
So aktualisieren Sie die Python-Version von Cloud Shell in GCP
Lesen Sie den gesamten Inhalt von proc / [pid] ~ Von attr bis cpuset ~
Die Geschichte, dass "calendar.day_abbr" auf dem Admin-Bildschirm von django nicht aktualisiert werden konnte
Laden Sie die Bilder und Videos herunter, die in den Tweets enthalten sind, die Ihnen auf Twitter gefallen haben, und laden Sie sie auf Google Drive hoch
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Zuallererst CMake.