Python entrando em um fórum
Pergunta
Eu escrevi isso para tentar fazer login em um fórum (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()
No entanto, quando eu o corro, ele 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
Alguma idéia de como resolver isso?
editar
Adicionar uma vírgula entre a string e os dados fornece esse erro em vez disso
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
Eu mudei o código do 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()
Isso não joga nenhuma mensagem de erro, apenas fornece 3 linhas em branco. É porque estou tentando ler a página de login que desaparece após o login. Se sim, como faço para exibir o índice que é o que deve aparecer após o acertar de login.
Solução
Sua linha
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login"[logindata])
é semanticamente inválido python. Presumivelmente você quis dizer
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login", [logindata])
que tem uma vírgula que separa os argumentos. No entanto, o que você realmente quer é simplesmente
page = urllib2.urlopen("http://www.woarl.com/board/ucp.php?mode=login", logindata)
Sem tentar envolver o Logindata em uma lista e usar a versão mais atualizada do Urlopen é a biblioteca URLLIB2.
Outras dicas
Que tal usar uma vírgula entre a string,"http:..."
e os dados urléticos, [logindata]
?
Sua sequência de URL não deveria ser
"http://www.woarl.com/board/ucp.php?mode=login"[logindata]
Mas
"http://www.woarl.com/board/ucp.php?mode=login", logindata
Eu acho que, porque [] é para matriz e exige um número inteiro. Eu posso estar errado porque não fiz muito python.
Se você fizer um tipo de logindata, poderá ver que é uma string:
>>> import urllib
>>> logindata = urllib.urlencode({'username': 'x', 'password': 'y'})
>>> type(logindata)
<type 'str'>
Colocá -lo entre colchetes ([]) coloca em um contexto de lista, o que não é o que você deseja.
Isso seria mais fácil com o módulo "mecanizar" de alto nível.