Python iniciando sesión en un foro
Pregunta
He escrito esto para intentar iniciar sesión en un foro (phpBB3).
import urllib2, re
import urllib, re
logindata = urllib.urlencode({'username': 'x', 'password': 'y'})
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login"[logindata])
output = page.read()
Sin embargo, cuando lo ejecuto aparece;
Traceback (most recent call last):
File "C:/Users/Mike/Documents/python/test urllib2", line 4, in <module>
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login"[logindata])
TypeError: string indices must be integers
alguna idea sobre cómo resolver esto?
edit
agregar una coma entre la cadena y los datos genera este error
Traceback (most recent call last):
File "C:/Users/Mike/Documents/python/test urllib2", line 4, in <module>
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login",[logindata])
File "C:\Python25\lib\urllib.py", line 84, in urlopen
return opener.open(url, data)
File "C:\Python25\lib\urllib.py", line 192, in open
return getattr(self, name)(url, data)
File "C:\Python25\lib\urllib.py", line 327, in open_http
h.send(data)
File "C:\Python25\lib\httplib.py", line 711, in send
self.sock.sendall(str)
File "<string>", line 1, in sendall
TypeError: sendall() argument 1 must be string or read-only buffer, not list
edit2
He cambiado el código de lo que era;
import urllib2, re
import urllib, re
logindata = urllib.urlencode({'username': 'x', 'password': 'y'})
page = urllib2.urlopen("http://www.woarl.com/board/ucp.php?mode=login", logindata)
output = page.read()
Esto no arroja ningún mensaje de error, solo da 3 líneas en blanco. Esto se debe a que estoy tratando de leer desde la página de inicio de sesión que desaparece después de iniciar sesión. Si es así, ¿cómo hago para que muestre el índice que es lo que debería aparecer después de presionar el inicio de sesión?
Solución
Tu línea
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login"[logindata])
es Python semánticamente inválido. Presumiblemente quisiste decir
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login", [logindata])
que tiene una coma que separa los argumentos. Sin embargo, lo que REALMENTE quiere es simplemente
page = urllib2.urlopen("http://www.woarl.com/board/ucp.php?mode=login", logindata)
sin tratar de incluir datos de inicio de sesión en una lista y usar la versión más actualizada de urlopen es la biblioteca urllib2.
Otros consejos
¿Qué tal usar una coma entre la cadena, " http: ... "
y los datos codificados por urlen, [logindata]
?
Su cadena de URL no debe ser
"http://www.woarl.com/board/ucp.php?mode=login"[logindata]
Pero
"http://www.woarl.com/board/ucp.php?mode=login", logindata
Creo, porque [] es para una matriz y requiere un número entero. Podría estar equivocado porque no he hecho mucho Python.
Si escribe un tipo de datos de inicio de sesión, puede ver que es una cadena:
>>> import urllib
>>> logindata = urllib.urlencode({'username': 'x', 'password': 'y'})
>>> type(logindata)
<type 'str'>
Ponerlo entre paréntesis ([]) lo pone en un contexto de lista, que no es lo que quieres.
Esto sería más fácil con la mecanización de alto nivel módulo.