Тема: отримання даних з google spreadsheet в pandas dataframe
Розгадую ребус, який колись вже успішно вирішив 4-5 років тому, і ось мушу знову, бо щось не бачу своїх давніших записів на цю тему.
from __future__ import print_function
import os.path
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly']
SAMPLE_SPREADSHEET_ID = 'my_spreadhseet_id'
SAMPLE_RANGE_NAME = 'abc1!A4:C'
def main():
creds = None
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
with open('token.json', 'w') as token:
token.write(creds.to_json())
try:
service = build('sheets', 'v4', credentials=creds)
sheet = service.spreadsheets()
result = sheet.values().get(spreadsheetId=SAMPLE_SPREADSHEET_ID,
range=SAMPLE_RANGE_NAME).execute()
values = result.get('values', [])
if not values:
print('No data found.')
return
print('my values:')
for row in values:
print('%s, %s' % (row[0], row[4]))
except HttpError as err:
print(err)
if __name__ == '__main__':
main()
Відкривається (1) url https://accounts.google.com/o/oauth2/au … ent_id=... і просить моєї авторизації, після чого - спроба відкрити інший (2) url http://localhost:8080/?state=vb4.............&code=4/0AX4...........&scope=https://www.googleapis.com/auth/spreadsheets.readonly - але оскільки нема ніякого вебсервера на localhost, то браузер очікувано повертає помилку.
І тут пригадую що колись брав параметри з (2) url і надсилав POST запит щоб згенерувати token.json, після чого оновлення кредів відбувається автоматично. Імовірність що тут ще хтось таким займався - низька, але вирішив зафіксувати тут свої думки на потім принаймні для самого себе.