Colaboratory에서 인증 없이 G Suite를 사용하는 방법

18381 단어 colaboratoryPython3

인증 없이 실행할 수 있도록 시도한 배경



최근, 스프레드시트의 수만의 데이터를 취급하는데 GAS에서는 한계를 느끼고 있어, Colab에서 실행하면 가벼웠기 때문에 Colab에서의 스프레드시트 조작이 많아져 왔습니다.
하지만 매번 아래와 같은 인증을 하는 것이 귀찮았기 때문에 인증 없이 실행할 수 있는 방법을 구현했습니다.



Colab의 일반 코드
!pip install gspread

from google.colab import auth
from oauth2client.client import GoogleCredentials
import gspread

# 認証処理
auth.authenticate_user()
gc = gspread.authorize(GoogleCredentials.get_application_default())

ss_id = 'スプレッドシートのID'
sht_name = 'シート名'

workbook = gc.open_by_key(ss_id)
worksheet = workbook.worksheet(sht_name)

Colab이 아니라 Python에서 스프레드시트를 조작할 때 인증이 필요하지 않으므로,
같은 코드로 구현할 수 있도록 했습니다.
Python에서의 구현 방법은 아래를 참고로 했습니다.

파이썬에서 스프레드 시트를 조작하는 방법

JSON 파일을 준비하는 단계



자세한 것은 상기 기사를 보는 것이 알기 쉽습니다만, 간이적인 순서는 아래와 같습니다.

① Spreadsheet API, Drive API 활성화
htps : // 이런. cぉd. 오, ぇ. 코 m / 아피 s / ぃ b 등 ry / ぇえ ts. ㅇㅜㅜㅜㅜ 이 m
htps : // 이런. cぉd. 오, ぇ. 이 m/아피 s/아피/d리ょぇ. ㅇㅜㅜㅜㅜ 이 m
② 자격 증명으로 서비스 계정을 만들고 JSON 데이터 다운로드
htps : // 이런. cぉd. 오, ぇ. 코 m / 아피 s / c 레덴치아 ls

JSON 데이터를 애플리케이션으로 게시



Python으로 구현할 때 다운로드한 JSON 파일의 위치를 ​​지정해야 합니다.
그러나 Colab에서는 로컬 폴더에서 데이터를 읽을 수 없으며 드라이브의 파일 만 지정할 수 있으며,
드라이브의 파일을 지정하는 데도 인증이 필요했습니다.
그래서 인증에 필요한 JSON 파일은 GAS 응용 프로그램에서 가져 오도록했습니다.

GAS, JSON 데이터
function doGet(e) {

  // ダウンロードしたJSONファイルをそのまま記載
  const json = {
    "type": "service_account",
    "project_id": "",
    "private_key_id": "",
    "private_key": ""
    "client_email": "",
    "client_id": "",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://oauth2.googleapis.com/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_x509_cert_url": ""
  };

  return ContentService.createTextOutput(JSON.stringify(json)).setMimeType(ContentService.MimeType.JSON);
}

GAS에서 위의 파일을 만든 후 ウェブアプリケーションとして導入그 때 발행되는 URL을 아래 코드에 넣는 것으로 인증없이 실행 가능합니다.
※액세스 범위는 全員(匿名ユーザを含む) 로 해 주십시오.

스프레드시트 작업을 수행하는 방법



미리 조작 할 스프레드 시트에 위의 JSON 파일로 나온 중
client_email 주소를 공유해야 합니다.

인증 없이 실행 코드
import requests
import gspread
import json
from oauth2client.service_account import ServiceAccountCredentials 

scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']

# 上記で発行されたURLを記載
json_file = 'url'

# URLの情報を辞書型へ変換
key = json.loads(requests.get(json_file).text)

# 通常「ServiceAccountCredentials.from_json_keyfile_name」でJSONファイルのディレクトリを指定するが
# 辞書型データを直接読み込ませる
credentials = ServiceAccountCredentials.from_json_keyfile_dict(key, scope)

gc = gspread.authorize(credentials)

ss_id = 'スプレッドシートのID'
sht_name = 'シート名'

workbook = gc.open_by_key(ss_id)
worksheet = workbook.worksheet(sht_name)

그러나 API를 두드리는 빈도는 100초 동안 100회가 상한이므로 주의하십시오.
htps : // 이런. cぉd. 오, ぇ. 코 m/아피 s/아피/시에 ts. ㅇㅜㅜㅜㅜ 코 m / 쿠오타 s? hl = 그럼

드라이브 조작을하는 방법



드라이브 작동을 위한 준비



스프레드시트처럼 작업할 폴더에 권한을 부여하는 것을 잊지 마십시오.

드라이브 작동을 위한 준비
import json
import requests
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from oauth2client.service_account import ServiceAccountCredentials 

scope = ['https://www.googleapis.com/auth/drive']

# 上記で発行されたURLを記載
json_file = 'url'

# URLの情報を辞書型へ変換
key = json.loads(requests.get(json_file).text)

# 通常「ServiceAccountCredentials.from_json_keyfile_name」でJSONファイルのディレクトリを指定するが辞書を直接読み込ませる
credentials = ServiceAccountCredentials.from_json_keyfile_dict(key, scope)

gauth = GoogleAuth()
gauth.credentials = credentials

drive = GoogleDrive(gauth)

파일 업데이트



폴더에 텍스트를 업로드하는 경우
#IDを指定してUPLOADする
FOLDER_ID = ''
f = drive.CreateFile({'title' : 'ファイル名.txt',
             'parents' : [{'id' : FOLDER_ID }]})
f.SetContentString("Hello World !")
f.Upload()

드라이브에서 폴더 ID 또는 파일 ID를 찾는 방법



폴더 이름에서 폴더 ID를 얻는 함수
def get_folderid(FORDER_NAME):
  """
  フォルダ名からフォルダIDを取得する関数
  """
  FORDER_ID = ''
  for folder_list in drive.ListFile({'q':"mimeType='application/vnd.google-apps.folder'"}):
    FORDER_ID = [folder['id'] for folder in folder_list if folder['title'] == FORDER_NAME][0]
    return FORDER_ID
    if FORDER_ID:
      break

폴더 ID와 파일 이름에서 파일 ID를 얻는 함수
def get_fileid(FORDER_ID, FILE_NAME):
  """
  フォルダIDとファイル名からファイルIDを取得する関数
  """
  for file_list in drive.ListFile({'q': f"'{FORDER_ID}' in parents"}):
    FILE_ID = ''
    FILE_ID = [file['id'] for file in file_list if file['title'] == FILE_NAME][0]
    return FILE_ID
    if FILE_ID:
      break

csv 데이터를 pandas로 처리하는 방법



패턴①
import pandas as pd
file_id = 'ファイルID'
file_name = 'ファイル名.csv'

f = drive.CreateFile({'id': file_id})
f.GetContentFile(file_name)

df = pd.read_csv(file_name, encoding='CP932', header=None)
df.head()

패턴②
import pandas as pd
from io import StringIO

file_id = 'ファイルID'

downloaded = drive.CreateFile({'id': file_id})
csv = StringIO(downloaded.GetContentString())
df = pd.read_csv(csv)
df.head()

좋은 웹페이지 즐겨찾기