使用Python无浏览器访问LinkedIn

9 投票
2 回答
2634 浏览
提问于 2025-04-17 06:45

我正在写一个命令行应用程序,用来访问LinkedIn。我使用的是python-linkedin这个API。

整体上运行得还不错,但我对认证过程有个很大的不满。目前,我需要:

  1. 启动我的应用程序,等它打印出一个认证网址
  2. 用浏览器打开那个网址
  3. 同意应用程序的请求,然后等它把我重定向到另一个网址
  4. 从这个网址中提取访问令牌
  5. 把这个访问令牌输入到我的应用程序里
  6. 然后就可以在LinkedIn上做我想做的事情了

我不喜欢手动完成第2到第5步,所以我想自动化这些步骤。我想到的办法是:

  • 使用一个无头客户端,比如mechanize,来访问第一步中的网址
  • 自动抓取页面并同意请求(可能需要输入用户名和密码——我知道这些,所以没问题)
  • 等着被重定向,然后获取重定向的网址
  • 从这个网址中提取令牌
  • 然后就可以大赚一笔了!

现在是提问时间:

  • 我看到有这个人在SO上尝试做类似的事情,但被告知这是不可能的。为什么呢?
  • 然后,这个人用Jython和HtmlUnit实现了这个功能。用纯Python和mechanize也应该可以吧?
  • 最后,有人看到过用纯Python和mechanize(或其他无头浏览器替代品)实现的解决方案吗?我不想重新发明轮子,但如果必要的话我会自己写。

编辑

初始化令牌的代码(使用接受的答案中的方法):

api = linkedin.LinkedIn(KEY, SECRET, RETURN_URL)
result = api.request_token()
if not result:
    print 'Initialization error:', api.get_error()
    return

print 'Go to URL:', api.get_authorize_url()
print 'Enter verifier: ',
verifier = sys.stdin.readline().strip()
if not result:
    print 'Initialization error:', api.get_error()
    return

result = api.access_token(verifier=verifier)
if not result:
    print 'Initialization error:', api.get_error()
    return

fin = open('tokens.pickle', 'w')
for t in (api._request_token, api._request_token_secret, 
        api._access_token, api._access_token_secret ):
    pickle.dump(t, fin)
fin.close()

print 'Initialization complete.'

使用令牌的代码:

api = linkedin.LinkedIn(KEY, SECRET, RETURN_URL)

tokens = tokens_fname()
try:
    fin = open(tokens)
    api._request_token = pickle.load(fin)
    api._request_token_secret = pickle.load(fin)
    api._access_token = pickle.load(fin)
    api._access_token_secret = pickle.load(fin)
except IOError, ioe:
    print ioe
    print 'Please run `python init_tokens.py\' first'
    return

profiles = api.get_search({ 'name' : name })

2 个回答

1

我自己还没试过,但我觉得理论上应该可以用 Selenium WebDriverPyVirtualDisplay 来实现。这个想法在 这里 有详细描述。

2

因为你打算只授权一次,然后就用这个权限去调用API获取你自己的信息,所以我建议你手动获取你的访问令牌,而不是去搞自动化。

当你在LinkedIn上授权某个应用时生成的用户访问令牌是永久有效的,除非你在授权页面上特别说明要更改。你只需要用你的应用生成授权页面,按照流程走一遍,成功后就可以把你的用户访问令牌(包括令牌和密钥)显示出来并保存下来。一旦你有了这个令牌,就可以把它写死在一个文件、数据库等地方,之后在调用API的时候就用这个令牌。

虽然是用PHP写的,但这个示例基本上就是这样做的。你只需要修改demo.php脚本,让它根据需要显示你的令牌就可以了。

撰写回答