Utilisateur:Probot/upload.py
Apparence
# -*- coding: utf-8 -*- # BatchUpload Bot # Utilisateur:Dake - 2005 # (code sous license GPL) import os, sys, re import httplib import urllib ##################################################### utilisateur = "UTILISATEUR_COMMONS" motDePasse = "MOTDEPASSE_COMMONS" site = "commons.wikimedia.org" ##################################################### def get_content_type(filename): import mimetypes return mimetypes.guess_type(filename)[0] or 'application/octet-stream' def post_multipart(conn, selector, fields, files, cookies): """ Post fields and files to an http host as multipart/form-data. fields is a sequence of (name, value) elements for regular form fields. files is a sequence of (name, filename, value) elements for data to be uploaded as files Return the server's response page. """ content_type, body = encode_multipart_formdata(fields, files) conn.putrequest('POST', selector) conn.putheader('content-type', content_type) conn.putheader('content-length', str(len(body))) conn.putheader("User-agent", "Simplet-Bot/1.0") if cookies: conn.putheader('Cookie',cookies) conn.endheaders() conn.send(body) response = conn.getresponse() returned_html = response.read() return response, returned_html def encode_multipart_formdata(fields, files): """ fields is a sequence of (name, value) elements for regular form fields. files is a sequence of (name, filename, value) elements for data to be uploaded as files Return (content_type, body) ready for httplib.HTTP instance """ BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$' CRLF = '\r\n' L = [] for (key, value) in fields: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"' % key) L.append('') L.append(value) for (key, filename, value) in files: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename)) L.append('Content-Type: %s' % get_content_type(filename)) L.append('') L.append(value) L.append('--' + BOUNDARY + '--') L.append('') body = CRLF.join(L) content_type = 'multipart/form-data; boundary=%s' % BOUNDARY return content_type, body # préparation URL if len(sys.argv)<3: print "Nom du fichier absent ou nom de la licence absent : python batchUpload.py image.jpg licence.txt" sys.exit() print "Upload de " + sys.argv[1] conn = httplib.HTTPConnection(site) print "Login" parametres = urllib.urlencode({"wpName" : utilisateur, "wpPassword" : motDePasse, "wpLoginattempt" : "Identification", "wpRemember" : "1"}) entetes = { "Content-type": "application/x-www-form-urlencoded", "User-agent": "SimpletBot/1.0"} conn.request("POST", "/w/wiki.phtml?title=Special:Userlogin&action=submit", parametres, entetes); reponse = conn.getresponse() print reponse.read() cookie = reponse.getheader("set-cookie") print "Analyse de la réponse du serveur" # analyse de la réponse (cookie) cookieMatch = re.compile(': (.*?);') cookieString = "" for resultat in reponse.msg.getallmatchingheaders('set-cookie'): m = cookieMatch.search(resultat) if m: cookieString += m.group(1) + "; " cookieString = cookieString[:-2] print cookieString print "Lecture de la page " entetes = { "Content-type": "application/x-www-form-urlencoded", "User-agent": "SimpletBot/1.0", "Cookie": cookie} conn.request('GET', "/w/wiki.phtml?title=Special:Upload&action=edit", {}, entetes) reponse = conn.getresponse() body = reponse.read() entetes = { "Content-type": "application/x-www-form-urlencoded", "User-agent": "SimpletBot/1.0", "Cookie": cookie} nomImage = sys.argv[1] ####r"""/tmp/FairytaleWorld/64x64/actions/Fairytale_exit.png""" nomLicence = sys.argv[2] nomImage = nomImage.replace(' ', '_') description = open(nomLicence, "rb").read() contents = open(nomImage, "rb").read() formdata = {} formdata["wpUploadDescription"] = description (filepath, filename) = os.path.split(nomImage) print filepath print filename formdata["wpDestFile"] = filename formdata["wpUploadAffirm"] = "1" formdata["wpUpload"] = "upload bestand" formdata["wpIgnoreWarning"] = "1" print "Ecriture de la page " response, returned_html = post_multipart(conn, r"""/w/wiki.phtml?title=Special:Upload&action=submit""", formdata.items(), (('wpUploadFile', nomImage, contents),), cookie) print response, returned_html # fermeture conn.close()