Доступ к LinkedIn без браузера с помощью Python

Я пишу приложение командной строки для доступа к linkedin. Я использую API python-linkedin .

Все работает, как я ожидал, но у меня действительно большие претензии к процессу аутентификации. В настоящее время мне нужно:

  1. Запустить мое приложение и дождаться, пока оно напечатает URL-адрес аутентификации.
  2. Перейти к этому URL-адресу в моем браузере
  3. Дайте мое благословение приложению и дождитесь, пока оно перенаправит меня на URL-адрес
  4. Извлеките токен доступа из URL-адреса
  5. Введите этот токен доступа в мое приложение
  6. Сделайте то, что мне нужно делать с linkedin

Мне не нравится выполнять шаги 2–5 вручную, поэтому я хотел бы автоматизировать их. Я думал о следующем:

  • Используйте безголовый клиент, такой как Mechanize , для доступа к URL-адресу из шага 1 выше
  • Очистите экран и автоматически дайте мое благословение (может потребоваться ввести имя пользователя и пароль - я знаю их, так что все в порядке)
  • Подождите, пока меня перенаправят, и возьмите URL-адрес перенаправления
  • Извлеките токен из URL-адреса
  • PROFIT!

Время вопроса:

  • Оглядываясь, этот парень прямо здесь, на SO пытался сделать что-то подобное, но ему сказали, что это невозможно. Почему?
  • Затем этот парень делает это в Jython и HtmlUnit.Должно быть возможно с прямым Python и механизацией, не так ли?
  • Наконец, видел ли кто-нибудь решение с прямым Python и механизацией (или любой другой альтернативой безголовому браузеру)? Не хочу изобретать велосипед, но при необходимости запрограммирую.

РЕДАКТИРОВАТЬ :

Код для инициализации токенов (с использованием подхода принятого ответа):

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 })

9
задан Community 23 May 2017 в 12:04
поделиться