Aller au contenu

Utilisateur:Probot/upload.py

Une page de Wikipédia, l'encyclopédie libre.
# -*- 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()