J'ai essayé d'utiliser l'API Google avec Ruby et Python - Faites de la base de données une feuille de calcul et gérez-la avec Google Drive

introduction

Il enregistre une série d'étapes pour enregistrer les données du journal telles que l'activité des utilisateurs qui accumule des données quotidiennes ou des données d'enregistrement des utilisateurs (CSV) sur Google Drive sous la forme d'une feuille de calcul Google. En utilisant ce mémo, vous pouvez effectuer les opérations suivantes.

Et ainsi de suite, il n'y a qu'un mérite honnête. La cible de ce mémo est «les personnes qui veulent savoir comment automatiser le travail dans les plus brefs délais» et «les personnes qui ont essayé d'utiliser l'API Google mais qui sont frustrées par la littérature anglaise peu amicale». Après lecture, nous visons un état où ces personnes ** "comprennent en quelque sorte comment utiliser l'API Google" **.

_ ** * Ci-dessous, la discussion se poursuivra sur l'hypothèse qu'un environnement pouvant utiliser Ruby ou Python a été construit. ** _

Environnement de développement

Langue utilisée

OS

Préparation préalable

Tout d'abord, vous devez vous inscrire pour utiliser l'API Google. Veuillez exécuter selon le flux suivant.

  1. Accédez à la ** Google Developer Console ** https://console.developers.google.com/start/api?id=drive
  2. Sélectionnez ** "Créer un projet" ** et continuez jusqu'à ce que ** Tableau de bord ** apparaisse
  3. Après avoir créé le projet, sélectionnez ** "Créer des informations d'identification" ** dans l'onglet ** Informations d'identification ** et sélectionnez ** "OAuth Client ID" **
  4. Sélectionnez ** "Autre" ** parmi les options, entrez un nom approprié pour le nom et cliquez sur "OK" sur l'écran suivant.
  5. Téléchargez les informations d'identification au format JSON et enregistrez-les sous client_secret.json sous ~ / .credential /
  6. Si vous utilisez Git, modifiez .gitignore et veillez à ne pas inclure la clé API

Installation de la bibliothèque

Ruby $ gem install google-api-client

Python $ pip install --upgrade google-api-python-client

Créer un script

Créez le script suivant dans n'importe quel répertoire. De plus, veuillez noter que les tâches effectuées par la version Ruby et la version Python ci-dessous ne sont pas 100% identiques.

Ruby: uploader.rb

require 'google/apis/drive_v3'
require 'googleauth'
require 'googleauth/stores/file_token_store'

require 'fileutils'

credentials_dir     = File.join(Dir.home, '.credentials')
CLIENT_SECRETS_PATH = File.join(credentials_dir, 'client_secret.json')
CREDENTIALS_PATH    = File.join(credentials_dir, 'sampleApp.yaml')
OOB_URI             = 'urn:ietf:wg:oauth:2.0:oob'
APPLICATION_NAME    = 'sampleApp'
SCOPE               = Google::Apis::DriveV3::AUTH_DRIVE

class DriveUploader
    #Définissez le chemin d'accès au dossier contenant le fichier CSV que vous souhaitez télécharger
    FILE_DIR = 'out/'

    #Définissez l'ID du dossier sur Google Drive dans lequel vous souhaitez stocker le fichier
    #Les détails sont résumés ci-dessous
    FOLDER_ID        = '<Your Folder ID>'
    MASTER_FILE_ID   = '<Your Master FIle ID>'
    MASTER_FOLDER_ID = '<Your Master Folder ID>'

    def initialize
        #Générer une instance d'API
        @@drive   = Google::Apis::DriveV3
        @@service = @@drive::DriveService.new
        @@service.client_options.application_name = APPLICATION_NAME
        @@service.authorization = authorize
    end

    def authorize
        FileUtils.mkdir_p(File.dirname(CREDENTIALS_PATH))

        client_id = Google::Auth::ClientId.from_file(CLIENT_SECRETS_PATH)
        token_store = Google::Auth::Stores::FileTokenStore.new(file: CREDENTIALS_PATH)
        authorizer = Google::Auth::UserAuthorizer.new(client_id, SCOPE, token_store)
        user_id = 'default'
        credentials = authorizer.get_credentials(user_id)
        if credentials.nil?
            url = authorizer.get_authorization_url(base_url: OOB_URI)
            puts "Open the following URL in the browser and enter the " +
                 "resulting code after authorization"
            puts url
            code = gets
            credentials = authorizer.get_and_store_credentials_from_code(user_id: user_id, code: code, base_url: OOB_URI)
        end
        credentials
    end

    def upload_csvs
        ##
        #Méthode pour télécharger un fichier
        #Dans le dossier spécifié"~~.csv"Téléchargez tous les fichiers nommés

        #Trouvez le fichier à télécharger
        file_path = File.join(FILE_DIR, '*.csv')
        files     = Dir.glob(file_path)
        abort('No files to upload.') if files.empty?

        #Répétez la tâche de téléchargement pour tous les fichiers applicables
        counter = 0
        files.each.with_index(1) do |a_file, i|
            #Nommez le fichier"MMDD_FileName"Convertir au format
            file_name = Date.today.strftime('%m%d') + a_file.gsub(/out\/\d{4}-\d{2}-\d{2}/,'').gsub('.csv','')
            puts "\nUploading[#{i}/#{files.count}]: #{file_name}"

            #Définir où télécharger
            file_metadata = @@drive::File.new(
                name:      file_name,
                mime_type: 'application/vnd.google-apps.spreadsheet',
                parents:   [FOLDER_ID]
            )

            #Téléchargez le fichier converti dans le dossier spécifié sur Goodle Drive
            file = @@service.create_file(file_metadata, upload_source: a_file, content_type: 'text/csv', fields: 'id')
            file_id = file.id

            puts "Successfully uploaded as:\nhttps://docs.google.com/spreadsheets/d/#{file_id}\n"
            counter += 1
        end

        #Résultat de sortie
        puts "\n\nTotal: #{counter.to_s} Files Uploaded\n"
    end

    def copy_master
        ##
        #Copiez le fichier principal tel que les rapports quotidiens que vous souhaitez copier sur Google Drive en même temps que le téléversement
        #Le fichier maître est déjà défini comme une constante au début

        master_file_metadata = @@drive::File.new(
            name:    "#{Date.today.strftime('%m%d')}_Dashboard",
            parents: [MASTER_FOLDER_ID]
        )
        master_file = @@service.copy_file(MASTER_FILE_ID, master_file_metadata)
        puts "\nSuccessfully created as: #{master_file.name}\nhttps://docs.google.com/spreadsheets/d/#{master_file.id}"
    end
end

#Ce script du terminal[./uploader.rb]Description à exécuter avec la commande
if __FILE__ == $0
    puts "Start uploading reports to Drive..."
    DriveUploader.new.upload_csvs
    puts "Copying master file in Drive..."
    DriveUploader.new.copy_master
end

Python: uploader.py

import httplib2
import os
import sys
import time
import glob

from   apiclient      import discovery
import oauth2client
from   oauth2client   import client
from   oauth2client   import tools
from   apiclient.http import MediaFileUpload

CREDENTIAL_DIR     = os.path.join(os.path.expanduser('~'), '.credentials')
CLIENT_SECRET_FILE = os.path.join(CREDENTIAL_DIR, 'client_secret.json')
CREDENTIAL_PATH    = os.path.join(CREDENTIAL_DIR, 'piwikReport.json')
APPLICATION_NAME   = 'piwikReport'
SCOPES             = 'https://www.googleapis.com/auth/drive'

#Définissez le chemin d'accès au dossier qui stocke le fichier CSV que vous souhaitez télécharger
FILE_DIR = 'out/'

#Définissez l'ID du dossier sur Google Drive dans lequel vous souhaitez stocker le fichier
#Les détails sont résumés ci-dessous
FOLDER_ID        = '<Your Folder ID>'
MASTER_FILE_ID   = '<Your Master FIle ID>'
MASTER_FOLDER_ID = '<Your Master Folder ID>'

class DriveUploader(object):
    def __init__(self):
        """
Authentifiez-vous à l'aide des informations d'identification que vous avez déjà téléchargées et enregistrées
        """
        self.credentials = self.get_credentials()
        self.http        = self.credentials.authorize(httplib2.Http())
        self.service     = discovery.build('drive', 'v3', http=self.http)

    def get_credentials(self):
        """
Vérifiez si l'authentification API est déjà terminée
        """
        if not os.path.exists(CREDENTIAL_DIR):
            os.makedirs(CREDENTIAL_DIR)

        store = oauth2client.file.Storage(CREDENTIAL_PATH)
        credentials = store.get()
        if not credentials or credentials.invalid:
            flags = tools.argparser.parse_args(args=[])
            flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
            flow.user_agent = APPLICATION_NAME
            if flags:
                credentials = tools.run_flow(flow, store, flags)
            else:
                # Python2.Description pour les utilisateurs utilisant 6
                credentials = tools.run(flow, store)
            print('Storing credentials to' + CREDENTIAL_PATH)
        return credentials

    def upload_csvs(self):
        """
Méthode pour télécharger un fichier
Dans le dossier spécifié"~~.csv"Téléchargez tous les fichiers nommés
        """
        #Rechercher des fichiers à télécharger
        file_path = os.path.join(FILE_DIR, '*.csv')
        files     = glob.glob(file_path)
        if not files:
            print('No files to upload.')
            sys.exit()

        #Répétez la tâche de renommer et de télécharger tous les fichiers applicables
        counter = 1
        for a_file in files:
            #Nommez le fichier"MMDD_FileName"Convertir au format
            file_name = time.strftime('%m%d') + a_file.replace('out/','_').replace('.csv','')
            print('>>>\nUploading[' + str(counter) + '/' + str(len(files)) + ']: ' + file_name)

            #Confirmer la destination de téléchargement
            file_metadata = {
                'name'     : file_name,
                'mimeType' : 'application/vnd.google-apps.spreadsheet',
                'parents'  : [FOLDER_ID]
            }

            #Importez les données CSV converties au format de feuille de calcul dans le dossier Google Drive déjà défini
            media   = MediaFileUpload(a_file, mimetype='text/csv', resumable=True)
            file    = self.service.files().create(body=file_metadata, media_body=media, fields='id').execute()
            file_id = file.get('id')

            print('Successfully uploaded as:\nhttps://docs.google.com/spreadsheets/d/' + file_id)
            counter += 1

        #Résultat de sortie
        print('--------------\nTotal: '+ str(counter - 1) + ' Files Uploaded')

    def copy_master(self):
        """
Copiez le fichier principal tel que les rapports quotidiens que vous souhaitez copier sur Google Drive en même temps que le téléversement
Le fichier maître est déjà défini comme une constante au début
        """
        master_file_metadata = {
            'name'    : (time.strftime('%m%d') + '_PiwikReport'),
            'parents' : [MASTER_FOLDER_ID]
        }
        master_file = self.service.files().copy(fileId=MASTER_FILE_ID, body=master_file_metadata, fields='id, name').execute()
        print('Successfully created as: ' + master_file.get('name') + '\nhttps://docs.google.com/spreadsheets/d/' + master_file.get('id'))

#Ce script du terminal[python3 uploader.py]Description à exécuter avec la commande
if __name__ == "__main__":
    DriveUploader().copy_master()

Ensuite, je vais expliquer les constantes dans le code.

Script de lancement

Assurez-vous que vous vous trouvez dans le même répertoire que le script ci-dessus, puis exécutez la commande suivante.

Ruby $ ruby uploader.rb ou $. / uploader.rb

Python $ python3 uploader.py

La première fois, un écran tel que "Voulez-vous vous authentifier?" Peut apparaître, mais vous pouvez tous les autoriser. Si cela vous tient vraiment à cœur, vous pourrez toujours le modifier ultérieurement dans les paramètres. Supprimez également le fichier CSV local dès que le téléchargement est terminé.

Résumé

c'est tout. Ce mémo était l'article de stratégie le plus rapide à envoyer à ceux qui préconisent l'automatisation du travail et la conversion dans le cloud à l'aide de l'API Google. En premier lieu, quand j'étais analyste de données utilisateurs à l'étranger, j'étais obligé de le faire, et j'ai eu l'expérience de le faire tout en devenant un héros devant des documents anglais et hostiles. Si vous maîtrisez l'anglais, vous pouvez visiter les sites de référence listés ci-dessous. J'espère que beaucoup de gens qui sont obligés de faire un travail inefficace et improductif dans le monde seront heureux grâce à cet article.



Liste de liens de référence:

Recommended Posts

J'ai essayé d'utiliser l'API Google avec Ruby et Python - Faites de la base de données une feuille de calcul et gérez-la avec Google Drive
J'ai essayé de frapper l'API avec le client python d'echonest
J'ai essayé de frapper l'API Mastodon avec Ruby (Faraday) / Python (Pycurl) / PHP (Curl)
J'ai créé un robot musical en utilisant discord.py et l'API Google Drive (testé avec Docker → déployé sur Heroku)
J'ai essayé d'accéder à l'API Qiita depuis le début
J'ai essayé "License OCR" avec l'API Google Vision
J'ai essayé d'utiliser l'API Google Cloud Vision
J'ai essayé "Receipt OCR" avec l'API Google Vision
J'ai essayé d'utiliser la base de données (sqlite3) avec kivy
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
Créez une carte thermique de tweet avec l'API Google Maps
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
Transférer vers un Drive partagé avec l'API Google Drive V3
J'ai essayé de publier automatiquement sur ChatWork au moment du déploiement avec Fabric et ChatWork Api
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
Essayez d'utiliser l'API Twitter rapidement et facilement avec Python
Une note sur l'utilisation de l'API Facebook avec le SDK Python
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
J'ai essayé Google Sign-In avec Spring Boot + Spring Security REST API
J'ai essayé de connecter Raspeye et conect + avec l'API Web
J'ai essayé la gestion du suivi avec l'API Twitter et Python (facile)
J'ai essayé de remplacer le disque dur Windows 10 par un SSD plus petit
J'ai essayé de sauvegarder l'historique des demandes d'API DRF avec django-request
J'ai essayé l'API Google Cloud Vision pour la première fois
L'histoire de la création d'une base de données à l'aide de l'API Google Analytics
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
Un mémorandum lors de l'acquisition automatique avec du sélénium
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai créé un chat chat bot avec Tensor2Tensor et cette fois cela a fonctionné
J'ai essayé d'utiliser l'API de reconnaissance vocale docomo et l'API Google Speech en Java
J'ai essayé le roman Naro API 2
J'ai exécuté GhostScript avec python, divisé le PDF en pages et l'ai converti en image JPEG.
J'ai essayé l'API du roman Naruro
J'ai essayé d'utiliser l'API checkio
J'ai essayé d'exprimer de la tristesse et de la joie face au problème du mariage stable.
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
J'ai défini des variables d'environnement dans Docker et je les ai affichées en Python.
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai vectorisé l'accord de la chanson avec word2vec et je l'ai visualisé avec t-SNE
Convertissez la feuille de calcul en CSV et importez-la dans Cloud Storage avec Cloud Functions
J'ai essayé d'apprendre l'angle du péché et du cos avec le chainer
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé de mettre à jour le calendrier Google avec des rendez-vous CSV à l'aide de Python et de l'API Google
J'ai essayé de contrôler la bande passante et le délai du réseau avec la commande tc
Représenter des conteneurs dans un cadre imbriqué (schéma) dans Jupyter, et ce que j'ai étudié en cours de création
J'ai généré beaucoup d'images comme le favicon du calendrier Google avec Python et je l'ai incorporé dans le projet de Vue
Dans IPython, quand j'ai essayé de voir la valeur, c'était un générateur, donc je l'ai inventé quand j'étais frustré.
J'ai créé un système qui décide automatiquement de s'exécuter demain avec Python et l'ajoute à Google Agenda.
Je voulais connaître le nombre de lignes dans plusieurs fichiers et j'ai essayé de l'obtenir avec une commande
J'ai installé DSX Desktop et l'ai essayé
J'ai essayé un langage fonctionnel avec Python
J'ai essayé de toucher l'API COTOHA
J'ai essayé de jouer avec l'image avec Pillow