====Google Drive Report Delivery==== The code below delivers reports to a Google Drive folder. Note that you need to... * Have created a Google Cloud application, * Created a **Service Account** under that application with a **JSON** key, * Enabled the **Google Drive API** for the application, * Installed the **pydrive2** package in Python on the ReportList server, and * Copied your JSON key into the [[report_list:reports_directory|Report Directory]] named //googlekey.json//. * Shared the target folder(s) - with at least Edit permissions - with the service account user. ===Destination=== The destination (specified in your subscription in the reporting addon) should be the unique ID of the destination Google Drive folder. For example, **gdrive#28372dgjs_22831** would upload data to the folder '28372dgjs_22831'. You can find this unique ID in the address bar when you open the Google Drive folder in your browser. Note that //you must share this folder with the service account user in Google Drive to be permitted to write files//. import time import sys import requests import datetime import os import json import traceback import os from pydrive2.auth import GoogleAuth from pydrive2.drive import GoogleDrive from oauth2client.service_account import ServiceAccountCredentials failedfiles = [] failreason = None f = open(sys.argv[1]) content = f.read() f.close() details = json.loads(content) jsonfile=os.path.dirname(__file__) + "/googlekey.json" # Define the Google Drive API scopes and service account file path gauth = GoogleAuth() # NOTE: if you are getting storage quota exceeded error, create a new service account, and give that service account permission to access the folder and replace the google_credentials. gauth.credentials = ServiceAccountCredentials.from_json_keyfile_name(jsonfile, scopes=['https://www.googleapis.com/auth/drive']) drive = GoogleDrive(gauth) print("Setup Connection to Google Drive") # ID of channel that you want to upload file to for d in details['destinations']: folder_id = d['name'] for att in d['attachments']: try: # Uploading files requires the `files:write` scope file1 = drive.CreateFile( {'parents': [{"id": folder_id}], 'title': att[1]}) file1.SetContentFile(att[0]) file1.Upload() except: traceback.print_exc() failedfiles.append(att[1]) if failreason is not None: failreason += " / Could Not Upload" else: failreason = "Could Not Upload" if len(failedfiles) > 0: print("-----") print(failreason) else: print("-----") print("SUCCESS")