如何使用 Python 调用 LinkedIn API?

How to call the LinkedIn API using Python?

我试了很多方法,但none似乎行得通。帮助我使用 python 与 LinkedIn 建立联系。生成访问令牌时出现问题我收到了代码,但它不起作用。我有 python 3.9 请 post 建立连接并获取访问令牌的基本代码示例。我必须使用哪个 redirectUri。我可以使用任何网站 link 作为 rediectUri。

我试图通过 curl 和 Postman 检查 API 但没有得到解决方案,它说是未经授权的访问。 https://github.com/ozgur/python-linkedin <---这是我知道如何使用 API 的地方。接收访问令牌。

第一个解决方案 适用于任何(包括免费)应用程序,它使用 so-called 3-Legged OAuth 2.0 Authentication:

  1. 在浏览器中登录您的帐户。
  2. 通过 this link 创建新应用程序。
  3. 如果您已经有应用程序,您可以通过选择它 here 并根据需要更改其选项来使用它。
  4. 在应用程序凭据中复制 Client ID 和 Client Secret,稍后您将需要它们。
  5. 在您的应用程序的服务器端通过下一个代码创建授权请求 URL 并将其 send/redirect 发送给客户端。如果您的 Python 代码 运行 在本地,您可以在浏览器中使用 import webbrowser; webbrowser.open(url) 代码打开此 URL。也用您的值填写所有字段。代码中有 redirect_uri,这是 URL 发回授权响应的地方,对于本地 运行ning 脚本,您必须 运行 Python HTTP 网络服务器检索结果。
# Needs: python -m pip install requests
import requests, secrets

url = requests.Request(
    'GET',
    'https://www.linkedin.com/oauth/v2/authorization',
    params = {
        'response_type': 'code', # Always should equal to fixed string "code"
        
        # ClientID of your created application
        'client_id': 'REPLACE_WITH_YOUR_CLIENT_ID',
        
        # The URI your users are sent back to after authorization.
        # This value must match one of the OAuth 2.0 Authorized Redirect
        # URLs defined in your application configuration.
        # This is basically URL of your server that processes authorized requests like:
        #     https://your.server.com/linkedin_authorized_callback
        'redirect_uri': 'REPLACE_WITH_REDIRECT_URL', # Replace this with your value
        
        # state, any unique non-secret randomly generated string like DCEeFWf45A53sdfKef424
        # that identifies current authorization request on server side.
        # One way of generating such state is by using standard "secrets" module like below.
        # Store generated state string on your server for further identifying this authorization session.
        'state': secrets.token_hex(8).upper(),
        
        # Requested permissions, below is just example, change them to what you need.
        # List of possible permissions is here:
        #     https://docs.microsoft.com/en-us/linkedin/shared/references/migrations/default-scopes-migration#scope-to-consent-message-mapping
        'scope': '%20'.join(['r_liteprofile', 'r_emailaddress', 'w_member_social']),
    },
).prepare().url

# You may now send this url from server to user
# Or if code runs locally just open browser like below

import webbrowser
webbrowser.open(url)
  1. 用户通过之前的 URL 授权您的应用程序后,他的浏览器将被重定向到 redirect_uri 并附加两个字段 codestate对于这个 URL,code 是您应该存储在服务器上的唯一授权码,code 如果不使用,会在 30 minutes 之后过期,state 是状态的副本从上面的代码来看,这个状态就像你当前授权的唯一 ID session,只使用一次相同的状态字符串并且每次随机生成它,而且状态不是秘密的东西因为你将它发送给授权内部的用户URL,但应该是唯一的并且很长。完全重定向的示例 URL 是 https://your.server.com/linkedin_authorized_callback?code=987ab12uiu98onvokm56&state=D5B1C1348F110D7C.

  2. 接下来你必须通过下一个代码将之前获得的code交换为access_token,下一个代码应该是运行在你的服务器上或者你的应用程序是运行ning,因为它使用了您的应用程序的 client_secret,并且这是一个秘密值,所以您不应该向 public 显示它,切勿与任何人分享 ClientSecret,除了某些可信任的人人,因为这些人将有能力假装(伪造)是您的应用程序,而实际上他们不是。

# Needs: python -m pip install requests
import requests
access_token = requests.post(
    'https://www.linkedin.com/oauth/v2/accessToken',
    params = {
        'grant_type': 'authorization_code',
        # This is code obtained on previous step by Python script.
        'code': 'REPLACE_WITH_CODE',
        # This should be same as 'redirect_uri' field value of previous Python script.
        'redirect_uri': 'REPLACE_WITH_REDIRECT_URL',
        # Client ID of your created application
        'client_id': 'REPLACE_WITH_YOUR_CLIENT_ID',
        # Client Secret of your created application
        'client_secret': 'REPLACE_WITH_YOUR_CLIENT_SECRET',
    },
).json()['access_token']
print(access_token)
    之前脚本得到的
  1. access_token60 days有效!所以很长一段时间。如果您打算只为自己或您的朋友使用您的应用程序,那么您可以在两个月内手动 pre-generate 一次,通过手动为几个人提供几个令牌,而不需要服务器。

  2. 接下来使用access_token 代表刚刚授权的上述LinkedIn 用户进行任何API 调用。在所有调用中包含 Authorization: Bearer ACCESS_TOKEN HTTP header。下面是这样一个 API 代码的示例:

import requests
print(requests.get(
    'https://api.linkedin.com/v2/jobs',
    params = {
        # Any API params go here
    },
    headers = {
        'Authorization': 'Bearer ' + access_token,
        # Any other needed HTTP headers go here
    },
).json())
  1. 更多详细信息can be read here。关于您的应用程序的组织方式,有 3 个选项:
    • 您的应用程序 运行ning 完全在远程服务器上,这意味着身份验证和 运行ning 应用程序(API 调用)都在某个专用的远程服务器上完成。那么安全性就没有问题了,服务器不会共享任何秘密,例如 client_secretcodeaccess_token.
    • 您的应用程序 运行 在用户机器上本地运行,而身份验证 运行 偶尔由您的服务器进行,​​另外一些其他事情,例如在数据库中存储必要的数据,也可以由服务器完成.然后您的服务器不需要共享 client_secretcode,而是共享 access_token,它被发送回应用程序到用户的机器。也可以,然后您的服务器可以跟踪哪些用户正在使用您的应用程序,如果需要阻止用户,也可以撤销部分或全部 access_tokens。
    • 您的应用程序完全 运行 在本地用户的机器上,根本没有使用专用服务器。在这种情况下,所有 client_secretcodeaccess_token 都存储在用户的机器上。在这种情况下,您无法撤销某些特定用户对您的应用程序的访问权限,您只能通过在您的应用程序设置中重新生成 client_secret 来撤销所有这些用户。此外,您无法跟踪您的应用程序用户的任何工作(尽管您的应用程序 settings/info 页面中可能有一些使用统计信息)。在这种情况下,任何用户都可以查看您的应用程序代码并复制 client_secret,除非您将 Python 编译为某些 .exe/.dll/.so 并加密您的客户端秘密在那里。如果有人 client_secret 他可以假装(假)是你的应用程序,这意味着如果你的应用程序以某种方式联系其他用户,那么他可以通过显示你的应用程序界面来尝试授权其他人,同时在下面有一些其他欺诈代码,基本上是你的应用程序不再那么安全或受信任。本地代码也可以很容易地修改,因此您不应该相信您的应用程序会完全执行您的代码。此外,为了像在前面的步骤 5)-7) 中那样授权用户,如果是本地应用程序,您必须启动 Python HTTP 服务器才能检索步骤 5) 的重定向结果。

下面是 第二种解决方案 只有当您的应用程序是 LinkedIn Developer Enterprise Products 付费订阅的一部分时才有效,然后您需要 Enable Client Credentials Flow 在您的应用程序中设置,下一步使用 so-called 2-Legged OAuth 2.0 Authentication:

  1. 在浏览器中登录您的帐户。
  2. 创建新的this link.
  3. 申请
  4. 如果您已经有应用程序,您可以通过选择它 here 并根据需要更改其选项来使用它。
  5. 在应用程序凭据中复制 ClientID 和 ClientSecret,稍后您将需要它们。
  6. 通过下一个 Python 代码创建 AccessToken(输入正确的客户端 ID 和客户端密码),你应该 运行 下一个代码只在你的服务器端或只在受信任的人的计算机上,因为代码使用您的应用程序的 ClientSecret 是秘密的东西,不应显示给 public:
# Needs: python -m pip install requests
import requests
access_token = requests.post(
    'https://www.linkedin.com/oauth/v2/accessToken',
    params = {
        'grant_type': 'client_credentials',
        'client_id': 'REPLACE_WITH_YOUR_CLIENT_ID',
        'client_secret': 'REPLACE_WITH_YOUR_CLIENT_SECRET',
    },
).json()['access_token']
print(access_token)
  1. 从以前的响应中复制 access_token,它会在发布后 30 分钟后过期,因此您需要经常使用以前的脚本来获取新的访问令牌。
  2. 现在您可以使用此令牌执行您需要的任何 API 请求,如下面的代码(access_token 取自前面的步骤):
import requests
print(requests.get(
    'https://api.linkedin.com/v2/jobs',
    params = {
        # Any API params go here
    },
    headers = {
        'Authorization': 'Bearer ' + access_token,
        # Any other needed HTTP headers go here
    },
).json())
  1. 更多详情可阅读here or here