如何使用 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
:
- 在浏览器中登录您的帐户。
- 通过 this link 创建新应用程序。
- 如果您已经有应用程序,您可以通过选择它 here 并根据需要更改其选项来使用它。
- 在应用程序凭据中复制 Client ID 和 Client Secret,稍后您将需要它们。
- 在您的应用程序的服务器端通过下一个代码创建授权请求 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)
用户通过之前的 URL 授权您的应用程序后,他的浏览器将被重定向到 redirect_uri
并附加两个字段 code
和 state
对于这个 URL,code
是您应该存储在服务器上的唯一授权码,code
如果不使用,会在 30 minutes
之后过期,state
是状态的副本从上面的代码来看,这个状态就像你当前授权的唯一 ID session,只使用一次相同的状态字符串并且每次随机生成它,而且状态不是秘密的东西因为你将它发送给授权内部的用户URL,但应该是唯一的并且很长。完全重定向的示例 URL 是 https://your.server.com/linkedin_authorized_callback?code=987ab12uiu98onvokm56&state=D5B1C1348F110D7C
.
接下来你必须通过下一个代码将之前获得的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)
之前脚本得到的access_token
对60 days
有效!所以很长一段时间。如果您打算只为自己或您的朋友使用您的应用程序,那么您可以在两个月内手动 pre-generate 一次,通过手动为几个人提供几个令牌,而不需要服务器。
接下来使用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())
- 更多详细信息can be read here。关于您的应用程序的组织方式,有 3 个选项:
- 您的应用程序 运行ning 完全在远程服务器上,这意味着身份验证和 运行ning 应用程序(API 调用)都在某个专用的远程服务器上完成。那么安全性就没有问题了,服务器不会共享任何秘密,例如
client_secret
、code
、access_token
.
- 您的应用程序 运行 在用户机器上本地运行,而身份验证 运行 偶尔由您的服务器进行,另外一些其他事情,例如在数据库中存储必要的数据,也可以由服务器完成.然后您的服务器不需要共享
client_secret
、code
,而是共享 access_token
,它被发送回应用程序到用户的机器。也可以,然后您的服务器可以跟踪哪些用户正在使用您的应用程序,如果需要阻止用户,也可以撤销部分或全部 access_token
s。
- 您的应用程序完全 运行 在本地用户的机器上,根本没有使用专用服务器。在这种情况下,所有
client_secret
、code
、access_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
:
- 在浏览器中登录您的帐户。
- 创建新的this link.
申请
- 如果您已经有应用程序,您可以通过选择它 here 并根据需要更改其选项来使用它。
- 在应用程序凭据中复制 ClientID 和 ClientSecret,稍后您将需要它们。
- 通过下一个 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)
- 从以前的响应中复制
access_token
,它会在发布后 30 分钟后过期,因此您需要经常使用以前的脚本来获取新的访问令牌。
- 现在您可以使用此令牌执行您需要的任何 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())
我试了很多方法,但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
:
- 在浏览器中登录您的帐户。
- 通过 this link 创建新应用程序。
- 如果您已经有应用程序,您可以通过选择它 here 并根据需要更改其选项来使用它。
- 在应用程序凭据中复制 Client ID 和 Client Secret,稍后您将需要它们。
- 在您的应用程序的服务器端通过下一个代码创建授权请求 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)
用户通过之前的 URL 授权您的应用程序后,他的浏览器将被重定向到
redirect_uri
并附加两个字段code
和state
对于这个 URL,code
是您应该存储在服务器上的唯一授权码,code
如果不使用,会在30 minutes
之后过期,state
是状态的副本从上面的代码来看,这个状态就像你当前授权的唯一 ID session,只使用一次相同的状态字符串并且每次随机生成它,而且状态不是秘密的东西因为你将它发送给授权内部的用户URL,但应该是唯一的并且很长。完全重定向的示例 URL 是https://your.server.com/linkedin_authorized_callback?code=987ab12uiu98onvokm56&state=D5B1C1348F110D7C
.接下来你必须通过下一个代码将之前获得的
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)
-
之前脚本得到的
access_token
对60 days
有效!所以很长一段时间。如果您打算只为自己或您的朋友使用您的应用程序,那么您可以在两个月内手动 pre-generate 一次,通过手动为几个人提供几个令牌,而不需要服务器。接下来使用
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())
- 更多详细信息can be read here。关于您的应用程序的组织方式,有 3 个选项:
- 您的应用程序 运行ning 完全在远程服务器上,这意味着身份验证和 运行ning 应用程序(API 调用)都在某个专用的远程服务器上完成。那么安全性就没有问题了,服务器不会共享任何秘密,例如
client_secret
、code
、access_token
. - 您的应用程序 运行 在用户机器上本地运行,而身份验证 运行 偶尔由您的服务器进行,另外一些其他事情,例如在数据库中存储必要的数据,也可以由服务器完成.然后您的服务器不需要共享
client_secret
、code
,而是共享access_token
,它被发送回应用程序到用户的机器。也可以,然后您的服务器可以跟踪哪些用户正在使用您的应用程序,如果需要阻止用户,也可以撤销部分或全部access_token
s。 - 您的应用程序完全 运行 在本地用户的机器上,根本没有使用专用服务器。在这种情况下,所有
client_secret
、code
、access_token
都存储在用户的机器上。在这种情况下,您无法撤销某些特定用户对您的应用程序的访问权限,您只能通过在您的应用程序设置中重新生成client_secret
来撤销所有这些用户。此外,您无法跟踪您的应用程序用户的任何工作(尽管您的应用程序 settings/info 页面中可能有一些使用统计信息)。在这种情况下,任何用户都可以查看您的应用程序代码并复制client_secret
,除非您将 Python 编译为某些.exe
/.dll
/.so
并加密您的客户端秘密在那里。如果有人client_secret
他可以假装(假)是你的应用程序,这意味着如果你的应用程序以某种方式联系其他用户,那么他可以通过显示你的应用程序界面来尝试授权其他人,同时在下面有一些其他欺诈代码,基本上是你的应用程序不再那么安全或受信任。本地代码也可以很容易地修改,因此您不应该相信您的应用程序会完全执行您的代码。此外,为了像在前面的步骤5)-7)
中那样授权用户,如果是本地应用程序,您必须启动 Python HTTP 服务器才能检索步骤5)
的重定向结果。
- 您的应用程序 运行ning 完全在远程服务器上,这意味着身份验证和 运行ning 应用程序(API 调用)都在某个专用的远程服务器上完成。那么安全性就没有问题了,服务器不会共享任何秘密,例如
下面是 第二种解决方案 只有当您的应用程序是 LinkedIn Developer Enterprise Products
付费订阅的一部分时才有效,然后您需要 Enable Client Credentials Flow
在您的应用程序中设置,下一步使用 so-called 2-Legged OAuth 2.0 Authentication
:
- 在浏览器中登录您的帐户。
- 创建新的this link. 申请
- 如果您已经有应用程序,您可以通过选择它 here 并根据需要更改其选项来使用它。
- 在应用程序凭据中复制 ClientID 和 ClientSecret,稍后您将需要它们。
- 通过下一个 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)
- 从以前的响应中复制
access_token
,它会在发布后 30 分钟后过期,因此您需要经常使用以前的脚本来获取新的访问令牌。 - 现在您可以使用此令牌执行您需要的任何 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())