[PYTHON] Téléchargez collectivement les images collées dans le corps de la pull request sur Github

Les captures d'écran sont empruntées à DroidKaigi / conference-app-2020.

Pourquoi

Nous développons des applications pour nos propres services. En guise de rapport préliminaire lors de la sortie du programme de mise à jour de l'application, je souhaite automatiser partiellement le partage d'une liste de captures d'écran nouvellement créées ou modifiées avec les services de planification et d'exploitation. De plus, lorsque vous le regroupez dans une phrase plus tard, vous pouvez le faire efficacement car il existe une collection de captures d'écran qui ont déjà été collectées. L'équipe de développement à laquelle j'appartiens a l'habitude de mettre des captures d'écran et des animations Gif dans le corps de la pull request lors de la demande de révision de la pull request, donc je partagerai cette image avec le service de planification et des opérations.

Téléchargement en masse à l'aide de Python

Préparation préalable

sh


mkdir Downloads
pip install PyGithub BeautifulSoup4 requests

Exécution du code source Python

main.py


import os
from datetime import datetime, timedelta
#Convertir de Markdown en HTML
import markdown
#Client API Github
from github import Github
#Analyseur HTML
from bs4 import BeautifulSoup
#Client HTTP
import requests
#Obtenir l'extension du type MIME
import mimetypes

#Répertoire de destination
save_dir = "Downloads"
#Créer un objet responsable pour convertir le markdown en HTML
md = markdown.Markdown()
#Créez un jeton d'accès ici
# https://github.com/settings/tokens
access_token = os.environ['GITHUB_API_ACCESS_TOKEN']
#Créer un objet Github avec un jeton d'accès
g = Github(access_token)
#Obtenir le référentiel
gr = g.get_organization('DroidKaigi').get_repo('conference-app-2020')
#Pour les référentiels personnels
# gr = g.get_user().get_repo('repository_name')
#Gamme à télécharger(Date de création de la demande d'extraction standard)
start_datetime = datetime(2020, 1, 1)
end_datetime = datetime(2020, 1, 13)
#Obtenir une liste des pull requests fermées
prs = gr.get_pulls(state='close', base='master')
for pr in prs:
    #L'ordre est l'ordre décroissant de la date de création
    if pr.created_at < start_datetime:
        #Vous n'avez plus besoin de revenir en arrière
        break
    if pr.created_at < end_datetime:
        #Entré dans la plage de téléchargement
        #Limité aux relations publiques fusionnées
        if pr.merged != True:
            continue
        print("#%d %s" % (pr.number, pr.title))
        #Convertir le démarquage du corps de la demande d'extraction en HTML
        html = md.convert(pr.body)
        #Analyser le HTML
        soup = BeautifulSoup(html, features='html.parser')
        #Pour toutes les balises img
        for img_index, img in enumerate(soup.find_all('img')):
            #Récupère la valeur de l'attribut src comme URL de l'image
            url = img.get('src')
            #Prend en charge les cas où l'attribut src est vide
            if len(url) == 0:
                continue
            #Télécharger l'URL
            r = requests.get(url)
            if r.ok:
                #Téléchargement réussi
                #Obtenez le type mime du fichier
                content_type = r.headers['Content-Type']
                #Obtenir l'extension du type mime
                ext = mimetypes.guess_extension(content_type)
                #Je souhaite inclure le titre de la demande d'extraction dans le nom du fichier
                #Si le nom de fichier contient une barre oblique, vous ne pouvez pas créer de fichier.
                #Convertir en plein angle
                title = pr.title.replace('/', '/')
                #Créer un chemin de destination
                path = "%s/%04d_%s_%02d.%s" % (save_dir,
                                               pr.number, title, img_index, ext)
                #Enregistrer l'image
                with open(path, 'wb') as f:
                    f.write(r.content)
            else:
                #Échec du téléchargement
                message = "Image download error\n%s\n%d %s" % (
                    url, r.status_code, r.reason)
                raise RuntimeError(message)

Personnalisé selon la situation

Pour le moment, le code source ci-dessus est exécuté sur un PC local et téléchargé dans un dossier local à la fois. Par exemple, il serait bon de faire une telle personnalisation en fonction de la situation de l'organisation ou du projet.

Téléchargez des images uniquement pour la différence de mise à niveau de version

Dans le workflow de publication de Homebrew App, obtenez la liste des relations publiques fusionnée après la version précédente et la [Note de publication](https://github.com/tfandkusu/ J'exécute un script Python qui crée automatiquement (quickecho / releases). Si vous obtenez le texte de la liste PR et effectuez le même processus que ci-dessus, vous ne pouvez télécharger l'image que pour la différence de mise à niveau de version.

Lien vers le code source applicable

point important

Veuillez vous assurer que les captures d'écran que vous partagez avec d'autres services ne contiennent pas d'informations sensibles telles que les clés d'accès AWS.

Recommended Posts

Téléchargez collectivement les images collées dans le corps de la pull request sur Github
[Blender] Imprimer tous les noms ShapeKey attachés à l'objet
Comment augmenter le nombre d'images de jeux de données d'apprentissage automatique
Enregistrer des images sur le Web sur un lecteur avec Python (Colab)
Après tout, l'histoire du retour de Linux à Windows
Appelez l'API github en python pour obtenir des informations sur la demande d'extraction
Obtenez des images de sites intéressants / 47 à l'aide de Python (Partie 2/2: liste des cibles publiées par github)
La route pour télécharger Matplotlib
Mesurez la couverture de test du code python poussé sur GitHub.
Affichez l'image de la caméra connectée à l'ordinateur personnel sur l'interface graphique.
Lire tout le contenu de proc / [pid] ~ De setgroups à wchan ~
Déguisez l'herbe sur GitHub et essayez de devenir ingénieur.
Lire tout le contenu de proc / [pid] ~ De oom_adj à sessionid ~
Comment utiliser Jupyter sur le frontal de Spacon ITO
Une commande pour vérifier facilement la vitesse du réseau sur la console
Comment mettre à jour la version Python de Cloud Shell dans GCP
Lire tout le contenu de proc / [pid] ~ De attr à cpuset ~
L'histoire de l'échec de la mise à jour de "calendar.day_abbr" sur l'écran d'administration de django
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
Tutoriel "Cython" qui rend Python explosif: lorsque le code C ++ dépend de la bibliothèque. Tout d'abord, CMake.