【问题标题】:Using a variable from a dictionary in a loop to attach to an API call在循环中使用字典中的变量附加到 API 调用
【发布时间】:2021-12-07 12:27:30
【问题描述】:

我正在使用下面的代码调用 LinkedIn API,它可以满足我的需求。 但是,当我在循环中使用几乎相同的代码时,它会返回类型错误。

它返回一个类型错误:

File "C:\Users\pchmurzynski\OneDrive - Centiq Ltd\Documents\Python\mergedreqs.py", line 54, in <module>
    auth_headers = headers(access_token)
TypeError: 'dict' object is not callable

这条线有问题(在循环之外也可以正常工作):

headers = headers(access_token)

我试着改成

headers = headers.get(access_token)

headers = headers[access_token]

编辑: 我也试过这个,同样的错误:

auth_headers = headers(access_token)

但这没有帮助。我究竟做错了什么?为什么字典在循环外可以正常工作,但在循环内却不行,我应该怎么做才能使其正常工作?

我希望实现的是获得一个列表,我可以将其保存为 json,其中包含为“shids”列表中的每个 ID 调用的共享统计信息。这可以通过单独的请求来完成 - 一个 ID 的一个链接,

(f'https://api.linkedin.com/v2/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity=urn%3Ali%3Aorganization%3A77487&ugcPosts=List(urn%3Ali%3AugcPost%3A{shid})

或带有 id 列表的请求。

(f'https://api.linkedin.com/v2/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity=urn%3Ali%3Aorganization%3A77487&ugcPosts=List(urn%3Ali%3AugcPost%3A{shid},urn%3Ali%3AugcPost%3A{shid2},...,urn%3Ali%3AugcPost%3A{shidx})

更新代码感谢您的 cmets。

shlink = ("https://api.linkedin.com/v2/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity=urn%3Ali%3Aorganization%3A77487&shares=List(urn%3Ali%3Ashare%3A{})")
#loop through the list of share ids and make an api request for each of them
shares = []
token = auth(credentials) # Authenticate the API
headers = fheaders(token) # Make the headers to attach to the API call.
for shid in shids:
    #create a request link for each sh id
    r = (shlink.format(shid))
    #call the api
    res = requests.get(r, headers = auth_headers)
    share_stats = res.json()
    #append the shares list with the responce
    shares.append(share_stats["elements"])

【问题讨论】:

  • 请提供错误的完整堆栈跟踪,它通常包含有价值的信息
  • 我相信当您使用 headers[access_token] 时错误发生了变化,发生了什么?
  • 在第二个 sn-p 中,shids, requests, auth, headers 没有定义。如需调试帮助,您需要提供minimal reproducible example,包括完整但最少的代码、示例输入和预期输出。你可以edit。有关更多提示,请参阅How to Ask
  • File "C:\Users\pchmurzynski\OneDrive - Centiq Ltd\Documents\Python\mergedreqs.py",第 59 行,在 headers = headers(access_token) # 使标头附加到 API 调用。 TypeError: 'dict' 对象不可调用
  • 是的,你用headers(access_token)可以看到报错,但是你用headers[access_token]或者headers.get(access_token)报错会不一样,但是你没说他们是什么跨度>

标签: python python-requests linkedin-api


【解决方案1】:

在循环外工作正常

因为在循环中,您重新定义了变量。添加了打印语句以显示它

from liapiauth import auth, headers  # one type

for ...:
    ... 
    print(type(headers))
    headers = headers(access_token)  # now set to another type
    print(type(headers))

经验教训 - 不要覆盖您的导入


一些重构——你的授权令牌没有改变,所以不要把它放在循环中;您可以对所有 LinkedIn API 查询使用一种方法

from liapiauth import auth, headers
import requests

API_PREFIX = 'https://api.linkedin.com/v2'

SHARES_ENDPOINT_FMT = '/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity=urn%3Ali%3Aorganization%3A77487&shares=List(urn%3Ali%3Ashare%3A{}'

def get_linkedin_response(endpoint, headers):
    return requests.get(API_PREFIX + endpoint, headers=headers)

def main(access_token=None):
    if access_token is None:
       raise ValueError('Access-Token not defined')
    auth_headers = headers(access_token)

    shares = []
    for shid in shids:
        endpoint = SHARES_ENDPOINT_FMT.format(shid)
        resp = get_linkedin_response(endpoint, auth_headers)
        if resp.status_code // 100 == 2: 
            share_stats = resp.json()
            shares.append(share_stats[1])

    # TODO: extract your data here
    idlist = [el["id"] for el in shares_list["elements"]]

if __name__ == '__main__':
    credentials = 'credentials.json'
    main(auth(credentials))

【讨论】:

  • 非常感谢,但我仍然遇到同样的错误。这次对于 auth_headers = headers(access_token) 这行我修改了第一篇
  • 您仍在代码的第 13 行重新定义标头: headers = headers(access_token) # 使标头附加到 API 调用。
  • @PiotrChmurzynski 你有两个部分的if __name__ == '__main__':。你应该只有一个
  • 感谢您的帮助@OneCricketeer。现在可以使用了!
  • @Piotr 随时使用帖子旁边的复选标记接受答案
猜你喜欢
  • 2018-12-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
相关资源
最近更新 更多