gspread w / OAuth2Client服务帐户密钥

时间:2016-08-10 17:43:49

标签: python-2.7 google-oauth gspread

我正在使用gspread和服务帐户密钥,其他,json文件。用python 2.7不断更新谷歌电子表格。我用Raspberry Pi运行最新的Raspian Jessie。我的oauth和gspread应该都是我平台可用的最新版本。我的脚本运行一小时(最大令牌生命周期),然后停止使用错误消息:"无效令牌:无统计令牌过期错误"我的代码如下

import gspread
from oauth2client.service_account import ServiceAccountCredentials
import httplib2
from httplib2 import Http

scope = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name(filename.json,scope)
gc = gspread.authorize(credentials)
wks = gc.open('spreadsheet name')
p1 = wks.worksheet('Printer One')

def functon()
...
p1.append_row(printing)

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

授权每0.5 / 1小时到期一次(我认为这取决于您用于连接的两种可用方法中的哪一种)。

我有一个24/7连接的Google工作表,每2秒更新一次。 几乎总是导致读/写错误的原因是授权错误,但Google API也会向您抛出各种错误,通常会在几秒后解决。这是我更新单元格的一项功能,但使用auth_for_worksheet的详细信息。每个操作(更新单个单元格,更新范围,读取一列值)都具有与函数类似的结构,该函数始终返回授权的工作表。它可能不是最优雅的解决方案,但是这张纸已连接3个月,没有停机时间。

def auth_for_worksheet():
    scope = ['https://spreadsheets.google.com/feeds']
    credentials = ServiceAccountCredentials.from_json_keyfile_name(filename.json,scope)
    gc = gspread.authorize(credentials)
    wks = gc.open('spreadsheet name')
    p1 = wks.worksheet('Printer One')
    return p1

def update_single_cell(worksheet, counter, message):
    """ No data to return, update a single cell in column B to reflect this """

    single_cell_updated = False
    while not single_cell_updated:
        try:
            cell_location = "B" + str(counter)
            worksheet.update_acell(cell_location, message)
            single_cell_updated = True
        except gspread.exceptions.HTTPError:
            logger.critical("Could not update single cell")
            time.sleep(10)
            worksheet = auth_for_worksheet()
    logger.info("Updated single cell")
    return worksheet

if __name__ == '__main__':

    # your code here, but now to update a single cell
    wksheet = update_single_cell(wksheet, x, "NOT FOUND")