使用Python无浏览器访问LinkedIn
我正在写一个命令行应用程序,用来访问LinkedIn。我使用的是python-linkedin这个API。
整体上运行得还不错,但我对认证过程有个很大的不满。目前,我需要:
- 启动我的应用程序,等它打印出一个认证网址
- 用浏览器打开那个网址
- 同意应用程序的请求,然后等它把我重定向到另一个网址
- 从这个网址中提取访问令牌
- 把这个访问令牌输入到我的应用程序里
- 然后就可以在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 WebDriver 和 PyVirtualDisplay 来实现。这个想法在 这里 有详细描述。
2
因为你打算只授权一次,然后就用这个权限去调用API获取你自己的信息,所以我建议你手动获取你的访问令牌,而不是去搞自动化。
当你在LinkedIn上授权某个应用时生成的用户访问令牌是永久有效的,除非你在授权页面上特别说明要更改。你只需要用你的应用生成授权页面,按照流程走一遍,成功后就可以把你的用户访问令牌(包括令牌和密钥)显示出来并保存下来。一旦你有了这个令牌,就可以把它写死在一个文件、数据库等地方,之后在调用API的时候就用这个令牌。
虽然是用PHP写的,但这个示例基本上就是这样做的。你只需要修改demo.php脚本,让它根据需要显示你的令牌就可以了。