[Python]MicroContest lib

Download | Vote Up (2) | Vote Down (0)

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'

(disponible en téléchargement http://www.microcontest.com/contribution.php)

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

Puis, nous devons nous connecter sur le site pour pouvoir accéder aux épreuves :
1microcontest.connexion(1, 'username', 'password')

Le premier paramètre représente le numéro de l'épreuve, le second votre nom d'utilisateur sur le site et le troisième votre mot de passe
Après, nous devons créer une liste qui nous servira pour la valeur de retour.
1tab = {}

Nous devons ensuite récupérer toutes les variables dont nous avons besoin dans le challenge, dans notre cas, 'a' et 'b', à l'aide de la fonction get_values():
1
2a = int(microcontest.get_values('a'))
3b = int(microcontest.get_values('b'))

La fonction retourne un str nous le convertissons donc en int pour pouvoir faire des calculs tranquillement.
Maintenant, nous pouvons additionner nos deux variables comme demandé :
1
2c = a + b 
3tab['s'] = c 

Ce code pourra d’ailleurs être raccourci de la façon suivante :
1
2tab['s'] = a+b

S est le nom de la variable de retour, vous pourrez la trouver sur la page de chaque challenge.
Puis, il ne nous reste plus qu'a envoyer le résultat à la page :
1
2microcontest.send_values(1, tab)

Ou le premier paramètre est le numéro de l'épreuve et le second la liste contenant les résultats.

Ce qui nous donne au final (je suis trop gentil :D

 1
 2import microcontest
 3microcontest.connexion(1, 'username', 'password')
 4tab = {} 
 5a = int(microcontest.get_values('a'))
 6b = int(microcontest.get_values('b'))
 7
 8c = a + b 
 9tab['s'] = c 
10microcontest.send_values(1, tab)

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


Be the first to give feedback !

Please login to comment !