MicroContest(http://www.microcontest.com/) est un site de défis informatiques utilisant une forme un peu particulière, en effet, tout ce fait à travers un programme que vous devrez coder, en utilisant une lib proposé par le site.
Malhereusement, cette lib n'est codé que pour être utilisée en C/C++, ce qui peut bloquer certaines personnes n'utilisant pas ce langage, c'est pourquoi je l'ai adaptée en Python, qui est beaucoup plus simple (notamment lorsqu'il s'agit de gérer les sockets).
Voici le code de la lib
1 2import urllib2, urllib , cookielib, re, hashlib 3 4 5 6def connexion(numero, username, password): 7 ''' Connexion to the website ''' 8 url = 'http://www.microcontest.com/contests/' + str(numero) + '/contest.php' 9 password = hashlib.sha1(password).hexdigest() 10 values = {'username' : username, 11 'password' : password, 12 'ID' : numero, 13 'contestlogin' : '1' } 14 global cookiejar 15 global urlopener 16 cookiejar = cookielib.CookieJar() 17 urlopener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar)) 18 data = urllib.urlencode(values) 19 request = urllib2.Request(url, data) 20 urlinfo = urlopener.open(request) 21 page = urlinfo.read() 22 if not 'PHPSESSID' or not '60gp' in [cookie.name for cookie in cookiejar]: #le cookie n est pas present 23 print 'Erreur de connexion' 24 quit() 25 elif 'Erreur Auth' in page: 26 print 'Veuillez patienter, tentative de bruteforce ou login incorrect' 27 quit() 28 else: 29 print 'Correctement connecte' 30 31 parse(page) # recuperation des element interessant dans la page 32 33 34 35 36 37def parse(page): # cette fonction n est pas a appeller manuellement, elle est utilise par la fonction get_values 38 ''' Parse les informations ''' 39 tab = [] 40 global retour 41 retour = {} 42 variable = re.findall('\[(.+?)]', page) # Recupere le nom des variable sur la page 43 couper = page.split('<br/>') # Stocke toutes les valeur separement 44 for valeur in couper: 45 if 'Valeur=' in valeur: 46 tab.append(valeur[7:]) # On enleve le mot Valeur= pour ne garder que la valeur 47 48 i = 0 49 while i < len(tab): # on attribut a chaque variable sa valeur 50 retour[variable[i]] = tab[i] 51 i = i + 1 52 53 54def get_values(nom): 55 ''' recupere les informations de la page du challenge ''' 56 global retour 57 for cle in retour: 58 if cle == nom: 59 return retour[cle] 60 return 'Variable inexistante' 61 62 63 64def send_values(id_epreuve, tableau): 65 ''' Envoi les informations vers la page de validation du challenge ''' 66 url = 'http://www.microcontest.com/contests/' + str(id_epreuve) + '/validation.php' 67 global urlopener 68 data = urllib.urlencode(tableau) 69 request = urllib2.Request(url, data) 70 urlinfo = urlopener.open(request) 71 page = urlinfo.read() 72 if '0' in page: 73 print 'Epreuve echouee, ou déjà validée' 74 elif len(page) == 0: 75 print 'Erreur connexion' 76 else: 77 print 'Vous avez gagne ' + page + ' points'
Comme je suis gentil, je vais pas vous laisser vous démerder seul avec ce bout de code un peu torchons (il manque les accents, j'avais un clavier anglais à l'époque).
Je vous propose donc de résoudre l'épreuve numéro une ensemble grâce à la lib, pour cela, copiez les code de la lib dans un fichier microcontest.py
Nous allons maintenant nous attarder à la résolution, tout d'abord, il nous faut importer la lib donc
1import microcontest
1microcontest.connexion(1, 'username', 'password')
1tab = {}Ce qui nous donne au final (je suis trop gentil :D
Les messages d'erreurs ne sont pas super explicites, mais c'est que le site ne le permet pas, si vous pensez avoir le bon résultat, mais que cela ne fonctionne pas, vérifier vos données pour la connexion, et assurez vous de ne pas avoir préalablement validé cette épreuve.
ex0ns