【问题标题】:Python Error "TypeError: Got an unexpected keyword argument 'attachmentId'"Python 错误“TypeError:得到了意外的关键字参数‘attachmentId’”
【发布时间】:2018-06-15 15:40:29
【问题描述】:

我正在尝试使用他们的 API 从 gmail 的电子邮件中提取附件,并且在尝试插入变量时遇到了意外的关键字参数。我非常习惯 Javascript,所以这可能就是我遇到此错误并出错的原因,但这里是相关的代码块:

def main():

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

    query = ['plc/trending/31day']

    for x in query:

        results = service.users().messages().list(userId='me', labelIds=None, q='label:' + x, pageToken=None, maxResults=1, includeSpamTrash=None).execute()
        mesgid = results['messages'][0]['id']
        attresults = service.users().messages().get(userId='me', id=mesgid, format=None, metadataHeaders=None).execute()
        attid = attresults['payload']['parts'][1]['body']['attachmentId']
        grabattachment = service.users().messages().attachments().get(userId='me', messageId = mesgid, attachmentId = attid)

【问题讨论】:

标签: python python-3.x gmail-api


【解决方案1】:

official documentation 表明附件的 id 名为 id,而不是 attachmentId

grabattachment = service.users().messages().attachments().get(userId='me', messageId = mesgid, id = attid)

您可能希望缓存 service.users().messages() 和更深层次的调用,例如 .attachments(),并避免每次都调用这么多对象:

messages = service.users().messages()
for x in query:
    results = messages.list(
        userId='me', labelIds=None, q='label:' + x, 
        pageToken=None, maxResults=1, 
        includeSpamTrash=None).execute()
    mesgid = results['messages'][0]['id']
    attresults = messages.get(
        userId='me', id=mesgid, format=None, 
        metadataHeaders=None).execute()
    attid = attresults['payload']['parts'][1]['body']['attachmentId']
    grabattachment = messages.attachments().get(
        userId='me', messageId=mesgid,
        attachmentId=attid)

我还强烈怀疑您最后错过了.execute() 电话。

我也觉得messages.list() 调用已经包含足够的信息来检索附件,而无需单独的messages.get() 调用:

messages = service.users().messages()
for x in query:
    results = messages.list(
        userId='me', labelIds=None, q='label:' + x, 
        pageToken=None, maxResults=1, 
        includeSpamTrash=None).execute()
    attid = results['messages'][0]['payload']['parts'][1]['body']['attachmentId']
    grabattachment = messages.attachments().get(
        userId='me', messageId=mesgid,
        attachmentId=attid).execute()

就个人而言,我仍然会测试多个附件,在加载附件数据之前检查每个附件是否有文件名。

【讨论】:

  • 谢谢!我自己也发现了这一点,但是那些进行更深入通话的技巧也有帮助!再次感谢!
猜你喜欢
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2016-09-17
  • 2019-01-13
  • 2020-11-15
  • 2017-05-10
  • 1970-01-01
相关资源
最近更新 更多