2010-12-13 31 views
0

Je souhaite remplir un formulaire Web avec un script python et l'envoyer avec une requête POST. Le problème est que la forme a fileuploading. J'ai trouvé ceci: poster pour python. Donc, je suis venu avec FireBug sur le site avec le formulaire et rempli. Ce que je vis:Envoyer une image avec un message

values[action] add_save 
values[mod] blog 
values[depth] 2 
values[pid] 121 
values[title] title 
values[title_eng] title_en 
img PNG...[a lot of binary image data] 

Ce site de utilise l'autorisation, j'ai donc:

passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, theurl, username, password) 
authhandler = urllib2.HTTPBasicAuthHandler(passman) 

opener = poster.streaminghttp.register_openers() 
opener.add_handler(authhandler) 

Maintenant, je suis venu avec l'échantillon par défaut du site et a écrit le code:

index = """some parsed integer""" 
datagen, headers = multipart_encode({ 
     'values[action]': 'add_save', 
     'values[mod]': 'blog', 
     'values[depth]': '2', 
     'values[pid]': index, 
     'values[title]' : 'title', 
     'values[title_eng]' : 'title_eng', 
     'img': open('1.png', 'rb') 
    }) 

request = urllib2.Request(theurl, datagen, headers) 
getdata = urllib2.urlopen(request) 
print getdata.read() 

Je ne J'ai des erreurs, etc. Mais après l'envoi du POST le script ne l'ajoute pas dans la base de données (quand je fais cela à la main, tout va bien).

J'ajouté ce code:

for value in datagen: 
    print value 

Et le résultat est: link. (123 nombre dans le texte est cette valeur de la variable d'index).

Répondre

0

Je n'ai pas utilisé votre approche auparavant, mais j'ai utilisé MultipartPostHandler avec succès pour faire quelque chose de similaire. Abrégé, un exemple ressemblerait à ceci.


import MultipartPostHandler 
import urllib2 

form_opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler) 
urllib2.install_opener(form_opener) 
datagen = {vars} 
o=opener.open(url, datagen) 

MultipartPostHandler se trouve here.

Vous pouvez également ajouter urllib2.HTTPCookieProcessor() à l'ouvre pour gérer l'authentification comme ceci:


import urllib 

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor()) 
# Or, (MultipartPostHandler.MultipartPostHandler, urllib2.HTTPCookieProcessor()) 
urllib2.install_opener(opener) 
login = urllib.urlencode(dict(username='user',password='pass',login='Login')) 
o=opener.open(url, login) 

Ceci est mon premier message alors pardonnez-moi si je suis un peu hors cible :)

+0

Merci, je vais vérifier dans quelques heures. – Ockonal

+0

Super, ça marche! Merci beaucoup. – Ockonal

+0

Le lien MultipartPostHandler est mort –

0

Avez-vous vérifié la réponse de chacune des demandes que vous avez fait (y compris l'exploitation forestière dans le site) pour vous assurer que vous avez été servi la bonne page et avoir le bon jeu de cookies?