Le script du concours pour le livreJe 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)
"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
|
A propos
|