2011-11-21 23 views
8

Estoy escribiendo una aplicación de línea de comandos que accede a linkedin. Estoy usando la API python-linkedin.Acceso sin navegador a LinkedIn con Python

Las cosas funcionan como esperaba, pero tengo una gran queja sobre el proceso de autenticación. Actualmente, necesito:

  1. Iniciar mi solicitud y esperar a que se imprima una URL de autenticación
  2. Ir a esa URL con mi navegador
  3. Dar mi bendición para la aplicación y esperar a que me redirigir a una URL
  4. Extrae el token de acceso de la dirección URL
  5. de entrada que token de acceso en mi aplicación
  6. hacer lo que tengo que ver con linkedin

No me gusta realizar los pasos 2 a 5 manualmente, así que me gustaría automatizarlos. Lo que yo estaba pensando en hacer era:

  • utilizar un cliente sin cabeza como mechanize para acceder a la dirección URL del paso 1 anterior
  • Raspe la pantalla y darle mi bendición de forma automática (puede ser necesaria para usuario y contraseña de entrada - sé que estos, por lo que está bien)
  • esperar a ser redirigido y agarrar el URL de redirección
  • Extracto del token de la URL
  • beneficio!

tiempo Pregunta:

  • Mirando a su alrededor, this guy right here on SO intentó hacer algo similar, pero se le dijo que es imposible. ¿Por qué?
  • Luego, this guy here does en Jython y HtmlUnit. Debería ser posible con Python recto y mecanizado, ¿verdad?
  • Por último, ¿alguien ha visto una solución con Python y mecanizado directo (o cualquier otra alternativa de navegador sin cabeza)? No quiero reinventar la rueda, pero la codificaré si es necesario.

EDITAR:

código para inicializar fichas (utilizando el enfoque de la respuesta aceptada):

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.' 

Código de usar tokens:

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

¿Se está autenticando contra API y luego tirando datos u otras personas? –

+0

@Paul: me estoy autenticando. – misha

+0

¿No podría simplemente hacerlo una vez manualmente y luego almacenar el token localmente (codificarlo en la secuencia de comandos python)? –

Respuesta

2

Como planea autorizarse una sola vez y luego realizar llamadas a la API para obtener su propia información, simplemente recuperaría manualmente su token de acceso en lugar de preocuparse por su automatización.

El token de acceso de usuario generado por LinkedIn cuando autoriza una aplicación determinada es permanente a menos que especifique lo contrario en la pantalla de autorización. Todo lo que necesita hacer es generar la pantalla de autorización con su aplicación, continuar con el proceso y, luego de recuperar el eco, almacenar su token de acceso de usuario (token y secreto). Una vez que tenga eso, puede codificarlos en un archivo, base de datos, etc. y al hacer llamadas a la API, use esos.

Está en PHP, pero this demo hace básicamente esto. Simplemente modifique la secuencia de comandos demo.php para repetir el token según sea necesario.

Cuestiones relacionadas