Безбраузерный доступ к LinkedIn с помощью Python - PullRequest
9 голосов
/ 21 ноября 2011

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

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

  1. Запустите мое приложение и подождите, пока оно напечатает URL аутентификации
  2. Перейдите по этому URL с помощью моего браузера
  3. Дай мое благословение приложению и подожди, пока оно перенаправит меня на URL
  4. Извлечение токена доступа из URL
  5. Ввести этот токен доступа в мое приложение
  6. Делай то, что мне нужно сделать с 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 })

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Поскольку вы планируете авторизоваться только один раз, а затем вызывать API для получения собственной информации, я бы просто вручную получил ваш токен доступа, а не беспокоился об его автоматизации.

токен доступа пользователягенерируется LinkedIn, когда вы авторизуете данное приложение, является постоянным, если вы не укажете иное на экране авторизации.Все, что вам нужно сделать, это сгенерировать экран авторизации с вашим приложением, пройти через процесс и, в случае успеха, отобразить и сохранить свой токен доступа пользователя (токен и секрет).Как только вы это сделаете, вы можете жестко запрограммировать их в файл, базу данных и т. Д., И при вызове API использовать их.

Это на PHP, но это демо делает в основном это.Просто измените скрипт demo.php, чтобы он выводил ваш токен по мере необходимости.

1 голос
/ 21 ноября 2011

Я не пробовал сам, но я считаю, что теоретически это возможно с Selenium WebDriver с PyVirtualDisplay . Эта идея описана здесь .

...