【问题标题】:403 "Request had insufficient authentication scopes" when creating drafts in Google API with Python使用 Python 在 Google API 中创建草稿时出现 403“请求的身份验证范围不足”
【发布时间】:2022-04-15 19:35:19
【问题描述】:

我是第一次使用 google api,并且对一般的编码很陌生,并且有一个我确信很简单的问题,但我找不到答案。当我运行以下代码时 -

credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
service = discovery.build('gmail', 'v1', http=http)

results = service.users().labels().list(userId='me').execute()
labels = results.get('labels', [])

if not labels:
    print('No labels found.')
else:
    print('Labels:')
    for label in labels:
        print(label['name'])


message_body = "This is the message"

message = {'message': message_body}

draft = service.users().drafts().create(userId='me', body=message).execute()

我能够成功地列出我的 gmail 帐户中的标签,但是创建草稿的请求会返回一条错误消息“请求的身份验证请求不足”。我发现创建草稿需要以下范围之一:

但在我的一生中,我无法弄清楚这到底意味着什么或如何实现这一点,尽管我已尽我所能在某个地方找到它。

【问题讨论】:

    标签: python-2.7 gmail-api


    【解决方案1】:

    如果您遵循快速入门,您的代码中可能有一个全局变量SCOPES,其值为https://www.googleapis.com/auth/gmail.readonly。当您的用户被重定向到 Google 时会使用这些范围,以便为您提供 access_token,以便您可以阅读用户 gmail 帐户的内容。

    为了发送草稿等,您需要您提到的范围之一,例如https://mail.google.com/。将SCOPES 的值更改为此字符串,并删除位于~/.credentials/gmail-python-quickstart.json 的凭据,如the Quickstart 所述,以便获得不仅可以读取内容的新凭据。

    【讨论】:

    • 这确实回答了我问的问题,所以谢谢。但是,现在我收到错误“httplib2.CertificateHostnameMismatch:服务器提供的证书与主机 gmail.modify.googleapis.com 不匹配”。看起来其他人也有这个错误,解决方案不清楚。你有什么见解吗?
    • @JamesL 很高兴它成功了!我不知道如何处理您遇到的这个新错误,抱歉。很奇特。
    • 事实证明,我在尝试解决我的第一个问题时更改了一些其他内容,当我将其更改回来时,它修复了错误。现在我收到一个错误“'draft.message' 的值无效,这完全是一个不同的问题,我应该能够弄清楚。感谢您的所有帮助!
    • @JamesL 确保您的消息格式类似于this answer。如果您尝试API Explorer,您会看到您需要将请求正文格式化为{ "message": { "raw": "Rdjbf..."} }
    【解决方案2】:

    我还发现在您的工作目录中,您需要删除token.pickle 文件,然后根据您的目的将SCOPES 变量替换为these 之一。因此,例如,如果您尝试发送电子邮件,请使用

    SCOPES = ['https://www.googleapis.com/auth/gmail.send']
    

    【讨论】:

      【解决方案3】:

      使用 gem google/apis/gmail_v1 的 Ruby 快速入门代码示例(范围 readonly 似乎是强制性的,但可以添加其他范围):

      SCOPE = Google::Apis::GmailV1::AUTH_GMAIL_READONLY, Google::Apis::GmailV1::AUTH_GMAIL_COMPOSE
      

      在运行 quickstart.rb 之前删除令牌文件 (token.yaml) 并确保您位于它所在的目录中。 当您转到生成的链接时,系统会要求您分别批准每个范围的访问权限。

      如果生成令牌后范围出现错误(例如范围不能包含空格),请在代码中尝试以下语法

        SCOPE ||= [Google::Apis::GmailV1::AUTH_GMAIL_READONLY, Google::Apis::GmailV1::AUTH_GMAIL_COMPOSE]
      

      【讨论】:

        【解决方案4】:

        我再次制作了凭据,我的错误得到了解决..

        【讨论】:

          猜你喜欢
          • 2023-03-13
          • 2016-04-28
          • 1970-01-01
          • 2021-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-22
          • 1970-01-01
          相关资源
          最近更新 更多