banniere.png

Le script du concours pour le livre

Je me suis donné une heure pour écrire le script qui extraira de la boîte 'concourspython@gmail.com' les 5 gagnants au jeu jeudi prochain.


L'objectif n'était pas ici de faire un script bien léché, réutilisable ou organisé en classes, mais plutôt d'obtenir le résultat rapidement.


Grâce à libgmail et bien sur les modules standards comme email ou random, j'ai pu mettre au point ce script en moins de 70 lignes


Quel bonheur Python



import libgmail
import sys
import random
from email import message_from_string

# réponses bidons bien sûr ;)
results = ['1:a', '2:a', '3:a', '4:a', '5:a', '6:a', '7:a']

def qualifyContent(message_source):
    """ test if the mail wins """
    qualification = [False] * 7
    for line in message_source.strip().split():
        line = line.strip()
        if line in results:
            qualification[results.index(line)] = True
    return False not in qualification

def extractContent(message_source):
    """ get the mail body """
    message = message_from_string(message_source)
    payload = message.get_payload()
    if isinstance(payload, list) and len(payload) > 0:
        # trying first part
        payload = payload[0].get_payload()
    if not isinstance(payload, str):
        return None
    return payload

def getResults(login, password):
    """ retrieve mails from gmail and qualify them
    winners / losers / failures
    """
    ga = libgmail.GmailAccount(login, password)
    ga.login()
    failures = []
    losers = []
    winners = []
    folder = ga.getMessagesByFolder('inbox', allPages=True)
    current = 0
    for thread in folder:
        for msg in thread:
            if not current % 5:
                sys.stdout.write('%d' % current)
            else:
                sys.stdout.write('.')
            sys.stdout.flush()
            message = extractContent(msg.source)
            if message is None:
                failures.append(msg.source)
            elif qualifyContent(message):
                winners.append(msg.sender)
            else:
                losers.append(msg.sender)
            current += 1
    sys.stdout.write('\n')
    return winners, losers, failures, current

winners, losers, failures, num_players = getResults("concourspython@gmail.com",  "secret")
print '%d mails received' % num_players
print '%d winners' % len(winners)
print str(winners)
print '%d losers' % len(losers)
print str(losers)
print '%d failures' % len(failures)
print str(failures)
print 'picking up winners'
random.shuffle(winners)
final_winners = random.sample(winners, 5)
print str(final_winners)

Vous aimez ce post ? partagez-le :


"une petite faille" posté par brahici le 23/01/2006 à 09:51
salut Tarek,

il me semble détecter une petite faille dans ton script. tu ne vérifies pas dans ton tableau de bonnes réponses si il y a des doublons (ou plus) d'adresse email.
je sais bien que tous les utilisateurs de python sont de braves et honnêtes développeurs, et que aucun n'aurait la bonne (mauvaise ?) idée de développer un script qui envoie un grand nombre de fois toutes les solutions possibles, s'assurant ainsi une confortable probabilité de remporter l'ouvrage (lequel est, à la simple lecture du sommaire, fort attrayant).

@+
brahici
"Re: une petite faille" posté par tarek le 23/01/2006 à 11:16
Salut,
Oui effectivement je n'ai pas fait cette vérification, je peux la rajouter.

Je suis parti du principe que les gens qui veulent vraiment 'tricher' utiliserait probablement des adresses mails différentes.

Il y a aussi le problème des familles nombreuses, comme à l'époque des concours manufrance ("un bulletin par foyer") où je peux me retrouver avec: robert.dupond@gémail.com, corinne.dupond@gémail.com, voisine.des.dupond@gémail.com, etc..

Le problème est qd meme minimisé par le fait que le script affiche à l'écran les mails.

Enfin bref ca reste difficile à contrôler tout ça, mais je suis en contact avec la NSA qui me fournit les logs des FAI et les ips, ils valident tout derrière ;)

Merci pour le feedback !

"Re: une petite faille" posté par Kagou le 27/01/2006 à 14:19
En plus des doublons, il faudrait tenir compte du fait que si on a 10 messages provenant de la même adresse et qu'au moins un d'entre eux est faux alors il faut éliminer ces 10 messages. :)

Kagou... qui attend avec impatience le tirage au sort (jeudi prochain ?!) car du coup il doit fermer les yeux chez son libraire afin de ne pas céder à la tentation de l'achetter quand même :D
Trackback URL | Categories: coding 3 comments - add

Tarek Ziadé. Copyright 2006. Tous droits réservés. Licence contenu site
BuzTrucs
Add to Technorati Favorites