python se connecter à un forum
Question
J'ai écrit ceci pour essayer de vous connecter sur un forum (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()
Cependant, lorsque je l'exécute, il se présente avec;
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
des idées sur la façon de résoudre ce problème?
modifier
ajouter une virgule entre la chaîne et les données donne cette erreur à la place
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
J'ai modifié le code par rapport à ce qu'il était;
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()
Cela ne renvoie aucun message d'erreur, il donne simplement 3 lignes vierges. Est-ce parce que j'essaie de lire la page de connexion qui disparaît après la connexion? Si tel est le cas, comment puis-je l'obtenir pour afficher l'index qui devrait apparaître après la connexion?
La solution
Votre ligne
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login"[logindata])
est sémantiquement invalide Python. Vous vouliez probablement dire
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login", [logindata])
qui a une virgule séparant les arguments. Cependant, ce que vous voulez réellement, c’est tout simplement
page = urllib2.urlopen("http://www.woarl.com/board/ucp.php?mode=login", logindata)
sans chercher à inclure logindata dans une liste et à utiliser la version la plus récente d’urlopen, la bibliothèque urllib2.
Autres conseils
Pourquoi ne pas utiliser une virgule entre la chaîne "http: ..."
et les données codées en url, [logindata]
?
Votre chaîne d'URL ne devrait pas être
"http://www.woarl.com/board/ucp.php?mode=login"[logindata]
Mais
"http://www.woarl.com/board/ucp.php?mode=login", logindata
Je pense, car [] est pour tableau et nécessite un entier. Je peux me tromper car je n’ai pas fait beaucoup de Python.
Si vous faites un type sur logindata, vous pouvez voir qu'il s'agit d'une chaîne:
>>> import urllib
>>> logindata = urllib.urlencode({'username': 'x', 'password': 'y'})
>>> type(logindata)
<type 'str'>
Le mettre entre parenthèses ([]) le place dans un contexte de liste, ce qui n'est pas ce que vous voulez.
Cela serait plus facile avec le mécanisme "mécaniser" de haut niveau. module.