#!/usr/local/bin/python # -*- coding: iso-8859-15 -*- # # Pierre Beyssac -- 15/5/2007 # import base64 import cookielib import os import sys import urllib import urllib2 # Compte à configurer username = 'zzz' password = None class signalspam_old: """Submit a spam using standard web forms.""" connecturl = 'https://www.signal-spam.fr/connexion.php' signalurl = 'https://www.signal-spam.fr/signaler.php' def __init__(self): policy = cookielib.DefaultCookiePolicy( rfc2965=True, strict_ns_domain=cookielib.DefaultCookiePolicy.DomainStrict) cj = cookielib.MozillaCookieJar() cj.set_policy(policy) self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) def _postexpect(self, url, data, expect): """Post form at given url, expect some substring in reply.""" urlenc_data = urllib.urlencode(data) z = self.opener.open(url, urlenc_data) page = z.read() z.close() return page.find(expect) >= 0 def authenticate(self, username, password): """Authenticate to the service. A session cookie will be set as a side effect.""" data = { 'nomutilisateur': username, 'motdepasse': password, 'connexion': 'Connexion' } return self._postexpect(self.connecturl, data, 'Espace membre') def submit(self, msg): """Submit a message.""" data = { 'message': msg, 'envoi': 'Envoyer' } if self._postexpect(self.signalurl, data, 'Succès'): return 202 return 999 class signalspam: """Submit a spam using the undocumented REST API.""" resturl = 'https://www.signal-spam.fr/api/signaler' host = 'www.signal-spam.fr' realm = 'signal-spam' def authenticate(self, username, password): """Authenticate to the service.""" self.auth_handler = urllib2.HTTPBasicAuthHandler() self.opener = urllib2.build_opener(self.auth_handler) self.auth_handler.add_password(self.realm, self.host, username, password) return True def submit(self, msg): """Submit a message.""" # Using base64 in the API is a weird idea, since it's probably # not mandated and uses up 25% more space. urlenc_data = urllib.urlencode({ 'message': base64.b64encode(msg) }) code = 202 try: z = self.opener.open(self.resturl, urlenc_data) except urllib2.HTTPError, e: code = e.code return code if password == None: if len(sys.argv) != 2: print >>sys.stderr, "Missing password" sys.exit(1) password = sys.argv[1] sp = signalspam() print >>sys.stderr, "Connexion en cours...", sys.stderr.flush() if not sp.authenticate(username, password): print >>sys.stderr, "Erreur de connexion" sys.exit(1) print >>sys.stderr, "ok" print >>sys.stderr, "Lecture sur stdin..." mailtext = '\n\n' lines = 0 for l in sys.stdin: mailtext += l lines += 1 msglist = mailtext.split('\n\nFrom ')[1:] l = len(msglist) print >>sys.stderr, "Fin de lecture, %d ligne(s), %d message(s)" % (lines, l) if lines < 10 or l < 1: print >>sys.stderr, "Trop court !" sys.exit(1) #sys.exit(0) n = 1 for msg in msglist: code = sp.submit('From ' + msg) if code == 202: print >>sys.stderr, "Envoi ok message %d/%d" % (n, l) else: print >>sys.stderr, "Erreur %d à l'envoi du message %d/%d" % (code, n, l) n += 1