Я пишу приложение командной строки, которое обращается к linkedin. Я использую python-linkedin API.
Все работает, как я и ожидал, но у меня действительно большие проблемы с процессом аутентификации. В настоящее время мне нужно:
- Запустите мое приложение и подождите, пока оно напечатает URL аутентификации
- Перейдите по этому URL с помощью моего браузера
- Дай мое благословение приложению и подожди, пока оно перенаправит меня на URL
- Извлечение токена доступа из URL
- Ввести этот токен доступа в мое приложение
- Делай то, что мне нужно сделать с linkedin
Мне не нравится делать шаги 2-5 вручную, поэтому я хотел бы автоматизировать их. То, о чем я думал, было:
- Используйте безголовый клиент, такой как mechanize , чтобы получить доступ к URL с шага 1 выше
- Очистить экран и дать мое благословение автоматически (может потребоваться ввести имя пользователя и пароль - я их знаю, так что все в порядке)
- Дождитесь перенаправления и получите URL перенаправления
- Извлечение токена из URL
- PROFIT!
Время вопроса:
- Оглядываясь вокруг, этот парень прямо здесь на SO пытался сделать нечто подобное, но ему сказали, что это невозможно. Зачем?
- Тогда этот парень здесь делает это в Jython и HtmlUnit. Должно быть возможно с прямым Python и механизировать, верно?
- Наконец, кто-нибудь видел решение с прямым Python и механизацией (или любой другой альтернативой безголового браузера)? Я не хочу изобретать велосипед, но при необходимости закодирую его.
EDIT
Код для инициализации токенов (с использованием подхода принятого ответа):
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 })