Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#76 Le 12/06/2012, à 09:06

Ras'

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

mad


Va t'faire shampouiner par le compteur_V2 en timezone[Canada/Eastern] !
 
Les types awesome n'ont rien à prouver. À personne.
'k bye là

Hors ligne

#77 Le 12/06/2012, à 12:14

ljere

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

voici le code

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# auteur Gabriel Pettier
# license GPL V3 or later

# sert uniquement a compter les points sur ce topic :http://forum.ubuntu-fr.org/viewtopic.php?pid=938704
# et donc probablement inutile a quiquonque vu que mon serveur se charge de le lancer tous les matins
# publié a seul but de vérification par les interressés. ;), peut aussi servir si mon serveur n'est plus là 
# pour assurer le service un jour.

# nécessite python 2.4 minimum, python-beautifulsoup et python-mechanize.

# le fichier '.compteur_logins' doit contenir le login du posteur sur la première ligne, et son mot de passe
# sur la deuxième (cela et seulement cela).

from BeautifulSoup import BeautifulSoup
import urllib2
import re
import time
import sys
import mechanize as ClientForm
import mechanize as ClientCookie

ignoreList = (
    'compteur des leve tot',
    )

class Day:
    """un jours dure de 5h à 9h du matin exclu ([5h:9h[) il contient la derniere entrée (points) de ce jour pour chaques joueurs"""
    def __init__(self):
        self.entries={}

    def addEntry(self, entry):
        #plus simple de faire un try except que de verifier que l'entrée existe. :/
        try:
            self.entries[entry.name] = max(self.entries[entry.name],entry.date.points())
        except:
            self.entries[entry.name] = entry.date.points()

    def __str__(self):
        for entry in self.entries.items():
            print entry,'+',entries[entry]

def utcFrance():
    return 1 + time.localtime(time.time())[-1] #1 + 1 si on est a l'heure d'été


class Date:
    def __init__(self,tuple=(20,0),utc=utcFrance()):
        self.h = (int(tuple[0])-utcFrance()+24+utc)%24
        self.m = int(tuple[1])

    def __cmp__(self, other):
        return cmp(self.points(),other.points())

    def points(self):
        pts =  {5: 10, 6: 6, 7: 3, 8: 1}
        return pts.get(self.h, 0) 

class Entry:
    def __init__(self,name='',date=Date(),edit=Date()):
        self.name = name
        self.date = max(date,edit)

    def setName(self, name):
        self.name = name

    def setDate(self, date):
        if date.points()>self.date.points(): self.date = date

class Score:
    def __init__(self, tuple):
        self.name = tuple[1]
        self.num = int(tuple[0])

    def __gt__(self, other):
        return self.num>other.num

    def __str__(self):
        return '%i    %s' %(self.num, self.name)

def getPage(url, entries, stat, urlscore):
    # essaye jusqu'a 15 fois de récupérer la page
    for i in range(15):
        try:
            page = BeautifulSoup(urllib2.urlopen(url))
            break
        except:
            print 'essai: %s' % i
            if i==14: raise
            time.sleep(60)

    print 'page récupéré, travail en cours'
    for post in page.findAll("div","blockpost rowodd blockpost1")+page.findAll("div","blockpost roweven")+page.findAll("div","blockpost rowodd"):
        str_date = str(post.find("h2").find("span").find("a")).split('>')[1]
        if (
           (str_date.split(' ')[0] in ['Hier']
             and int(str_date.split(' ')[2].split('<')[0].split(':')[0]) in range(5,24))
           or (str_date.split(' ')[0] in ["Aujourd\'hui"]
             and int(str_date.split(' ')[2].split('<')[0].split(':')[0]) in range(5))
           ):
            urlscore = url
            try:
                entry = Entry(str(post.find("div","postleft").find("a")).split(">")[1].split("<")[0])
            except:
                entry = Entry(str(post.find("div","postleft").find("strong")).split(">")[1].split("<")[0])

            utc=utcFrance()
            #print entry.name
            if 'GMT' in str(post):
                try:
                    #print str(post).split("GMT")[-1]
                    utc = int(str(post).split("GMT")[-1].split(" ")[0].split("<")[0])
                    print 'GMT found',utc
                except:
                    print "no good GMT!"
            entry.setDate(Date(str_date.split(" ")[2].split("<")[0].split(":"),utc))
            if str_date.split(" ")[2].split("<")[0].split(":")[0] not in stat:
                stat[str_date.split(" ")[2].split("<")[0].split(":")[0]] = 1
            else:
                stat[str_date.split(" ")[2].split("<")[0].split(":")[0]] += 1

            if post.find('p','postedit') is not None:
                print "edit found"
                try:
                    entry.setDate(Date(str(post.find("p","postedit").find("em")).split("à")[1][1:6].split(":"),utc))
                except:
                    print 'error ->'+str(str(post.find("p","postedit").find("em")).split("à"))
            #on ne veut pas les points des pseudos dans ignoreList
            if entry.name not in ignoreList and (entry.date.points() is not 0): entries.addEntry(entry)


    # erreur si le topic fait moins d'une page de long,FIXME!
    #result = int(url.split('p=')[1]) < int(str(page.findAll('a')[-7]).split('p=')[1].split('"')[0]) #en espérant que le nombre de liens en bas de page ne change pas! :/
    if str(page.find('p','pagelink conl')).split('conl">')[1].split('</p')[0].split(str(page.find('p','pagelink conl').find('strong'))) == ['', '']:
        result = False
    else:
        try:
            result = int(url.split('p=')[1]) < int(str(page.find('p','pagelink conl').findAll('a')[-2]).split('p=')[1].split('"')[0])
        except IndexError:
            result = False
    #FIXED!
    if not result:
        # on vérifie si le sujet est fermé, auquel cas on renvoie le dernier lien fourni sur la page
        if "Discussion fermée" in ''.join( (str( i) for i in page.findAll('p','postlink conr'))):
            print str(page.findAll('div','postmsg')[-1])
            result = str(page.findAll('div','postmsg')[-1].findAll('a')[-1]).split('"')[1]
    return result, urlscore

def renderstats(stats):
    if stats != {}:
        DayStats = {'00': 0, '01': 0, '02': 0, '03': 0, '04': 0, '05': 0, '06': 0, '07': 0, '08': 0, '09': 0, '10': 0, '11': 0, '12': 0, '13': 0, '14': 0, '15': 0, '16': 0, '17': 0, '18': 0, '19': 0, '20': 0, '21': 0, '22': 0, '23': 0}
        DayStats.update(stats)
        HoursBar = 'h|'.join(sorted(DayStats.keys()))+'h'
        HoursBar = HoursBar[20:]+'|'+HoursBar[:19]
        HoursBar = HoursBar[0:len(HoursBar)-1]
        HoursPie = 'h|'.join(sorted(stats.keys()))+'h'
        for k in stats.keys():
            HoursPie = HoursPie.replace(k+'h', k+'h%20-%20'+k+'h59')

        DataBar = ','.join([str(DayStats[x]) for x in sorted(DayStats.keys())])
        DataBar = ','.join(DataBar.split(',')[5:24])+','+','.join(DataBar.split(',')[0:5])
        Vmax10 = str(10*(int(max([DayStats[x] for x in DayStats.keys()]))/10+1))

        urlimage='[img=Répartition]http://chart.apis.google.com/chart?chs=675x280&cht=p3&chco=d80020,d88000,ffd840,20d820,2080ff,101080,a020d8&chf=bg,s,00000000&chl='+HoursPie+'&chd=t:'+','.join([str(stats[x]) for x in sorted(stats.keys())])+'&chp=1.6&chtt=R%C3%A9partition%20des%20posts&chts=606060,16[/img]'

        urlimage+='[img=Posts/heure]http://chart.apis.google.com/chart?chs=675x280&cht=bvs&chxt=x,y&chds=0,'+Vmax10+'&chxr=1,0,'+Vmax10+((Vmax10 == '30' and ',5') or '')+'&chf=b0,lg,0,803000,0,ffc080,1|bg,s,00000000&chxl=0:|'+HoursBar+'h'+'&chxp=0,0.7,4.9,9.1,13.2,17.3,21.5,25.6,29.8,33.9,38,42.2,46.3,50.5,54.6,58.8,62.9,67,71.2,75.3,79.4,83.6,87.7,91.8,96&chd=t:'+DataBar+'&chm=N,803000,0,-1,12&chtt=|Nombre%20de%20posts%20par%20heure&chts=606060,16[/img]'

        return urlimage

    return None

def post(_file, stats):
    # le fichier '.compteur_logins' doit contenir le login du posteur sur la première ligne, et son mot de passe sur la deuxième (cela et seulement cela).
    file = open(".compteur_logins","r")
    login = file.readline().split('\n')[0]
    password = file.readline().split('\n')[0]
    file.close()

    cookieJar = ClientCookie.CookieJar()

    opener = ClientCookie.build_opener(ClientCookie.HTTPCookieProcessor(cookieJar))
    opener.addheaders = [("User-agent","Mozilla/5.0 (compatible)")]
    ClientCookie.install_opener(opener)
    fp = ClientCookie.urlopen("http://forum.ubuntu-fr.org/login.php")
    forms = ClientForm.ParseResponse(fp)
    fp.close()

    form = forms[1]
    form["req_username"] = login
    form["req_password"] = password
    fp = ClientCookie.urlopen(form.click())
    fp.close()

    file = open('url','r')
    tid = file.readline().split('=')[1][:-2] # la première ligne contenant l'addresse du topic.
    file.close()
    fp = ClientCookie.urlopen("http://forum.ubuntu-fr.org/post.php?tid="+tid)
    forms = ClientForm.ParseResponse(fp)
    fp.close()

    print "http://forum.ubuntu-fr.org/post.php?tid="+tid
    print forms[0]
    form = forms[1]
    title = (((_file == "count") and "Scores totaux, depuis le début") or "scores de la période en cours")
    form["req_message"]  = title+" :[ code]"+'\xe2\x80\xad'
    file = open(_file, 'r')
    scores=file.readlines()
    urlimage = renderstats(stats)
    stats = {}
    for i in range(len(scores)):#on veut toutes les lignes restantes
        if i == 0:
            tmpRange = 0
        elif scores[i].split(" ")[0] == scores[i-1].split(" ")[0]:
            pass
        else:
            tmpRange = i
        #et on ajoute la ligne avec le bon rang a l'entrée
        form["req_message"] += (
            (('\xe2\x80\xae' in scores[i-1] and '\xe2\x80\xac') or '')+
            (("Quelqu'un" in scores[i] and "*** champion des leves tot ***\n") or '')+
            str(tmpRange+1)+
            ") "+scores[i]+
            (("Quelqu'un" in scores[i]
                and "******************************************************************************\n") or '')
        )
    form["req_message"] += "[ /code]"+(urlimage or '')

    fp = ClientCookie.urlopen(form.click())
    fp.close()

def main(urlfile, files):
    debug = False
    stats = {}
    f=open(urlfile,"r")
    url=urlscore=f.readline().split('\n')[0]
    f.close()
    entries = Day()

    while True:
        print "lecture de la page "+url
        res = getPage(url, entries, stats, urlscore)
        urlscore = res[1]
        if not res[0]: break
        url=url.split('p=')[0]+'p='+str(1+int(url.split('p=')[1]))
        if res[0] is not True:
            url = url.split('?')[0]+'?'+res[0].split('?')[1]+'&p=1'

    if not debug:
        f=open(urlfile,"w")
        f.write(urlscore+'\n')
        f.close()

    for file in files:
        f=open(file,'r')
        lines=(file=="count10days" and ((time.localtime()[2]==2 and ["0    "+entries.entries.keys()[0]+"\n"]) or f.readlines()) or f.readlines())
        f.close()
        exp = re.compile("^[0-9]+\s*")
        scores = []
        print "lecture scores courants"
        for line in lines:
            if line not in [' ','']:
                scores.append(Score([(line.split(' ')[0]),exp.split(line)[1].split('\n')[0]]))

        new_scores=[]
        for entry,num in entries.entries.items():
            for score in scores:
                if entry.lower() == score.name.lower():
                    score.num+=num
                    break
                if score is scores[-1]:
                    new_scores.append(Score([num,entry]))
                    break
        scores+=new_scores

        # vérification des doublons
        for nScore in range(len(scores)-1):
            for mScore in range(nScore+1,len(scores)-1):
                try:
                    if scores[nScore].name.lower() == scores[mScore].name.lower():
                        scores[nScore].num+=scores[mScore].num
                        del(scores[mScore])
                except:
                    pass
        scores.sort(reverse=True)
        if not debug:
            for score in scores: print score
            f=open(file, "w")
            for score in scores: #print score
                f.write('%s\n'%score)
            f.close()

            for i in range(15):
                try:
                    post(file, stats)
                    stats = {}
                    break
                except:
                    if i == 14: raise
                    time.sleep(60)
        time.sleep(10)

main("url",["count","count10days"])
#post("count",{})
#post("count10days",{})

et l'erreur qui va avec

./Nouveau\ compteur.py 
lecture de la page http://forum.ubuntu-fr.org/viewtopic.php?pid=9590061#p9590061
page récupéré, travail en cours
edit found
error ->['<em>Derni\xc3\xa8re modification par pierguiard (Hier \xc3\xa0 12:35)</em>']
lecture scores courants
Traceback (most recent call last):
  File "./Nouveau compteur.py", line 304, in <module>
    main("url",["count","count10days"])
  File "./Nouveau compteur.py", line 264, in main
    scores.append(Score([(line.split(' ')[0]),exp.split(line)[1].split('\n')[0]]))
IndexError: list index out of range

ancien PC Toshiba satellite_c670d-11 / Linux Mint 21 Vanessa
Nouveau PC ASUS TUF GAMING A17 GPU RTX 4070 CPU AMD Ryzen 9 7940HS w/ Radeon 780M Graphics / Linux Mint 21.2 Victoria / Kernel: 6.4.8-1-liquorix / Desktop: Cinnamon

Hors ligne

#78 Le 12/06/2012, à 12:25

Mindiell

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

Merci, je te dis ça dans la soirée (si j'ai le temps)

Hors ligne

#79 Le 13/06/2012, à 04:07

raspouillas

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

Bonjour du bon matin ...

#80 Le 13/06/2012, à 05:04

raspouillas

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

Je suis seul !

#81 Le 13/06/2012, à 05:06

raspouillas

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

Non !

ps: Il faut bien que je dépasse @Rap' ...

#82 Le 13/06/2012, à 05:43

Floyd Pepper

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

Bonjour


... J'aurais tendance à ne pas utiliser de smilleys.
Le plus tu t'fais chier, le plus t'es emmerdé.

Hors ligne

#83 Le 13/06/2012, à 05:44

ljere

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

hello tout le monde


ancien PC Toshiba satellite_c670d-11 / Linux Mint 21 Vanessa
Nouveau PC ASUS TUF GAMING A17 GPU RTX 4070 CPU AMD Ryzen 9 7940HS w/ Radeon 780M Graphics / Linux Mint 21.2 Victoria / Kernel: 6.4.8-1-liquorix / Desktop: Cinnamon

Hors ligne

#84 Le 13/06/2012, à 06:34

PPdM

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

Salut

Paul Valéry a écrit :

Le réel ne peut s'exprimer que par l'absurde.


La critique est facile, mais l'art est difficile !
L'humanité étant ce qu'elle est, la liberté ne sera jamais un acquit, mais toujours un droit à défendre !
Pour résoudre un problème commence par poser les bonnes questions, la bonne solution en découlera

Hors ligne

#85 Le 13/06/2012, à 06:44

Ras&#039;

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

!!


Va t'faire shampouiner par le compteur_V2 en timezone[Canada/Eastern] !
 
Les types awesome n'ont rien à prouver. À personne.
'k bye là

Hors ligne

#86 Le 13/06/2012, à 06:44

Mindiell

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

Coucou

Hors ligne

#87 Le 13/06/2012, à 06:56

souen

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

Salut!!! (connexion en panne ce matin)
yikes


Nous ne voyons pas le monde comme il est. Nous le voyons comme nous sommes. Anaïs Nin

Hors ligne

#88 Le 13/06/2012, à 17:20

souen

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

souen a écrit :

L'absurde ne peut s'exprimer que par le réel.

hmm


Nous ne voyons pas le monde comme il est. Nous le voyons comme nous sommes. Anaïs Nin

Hors ligne

#89 Le 13/06/2012, à 18:11

Mindiell

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

absurde a écrit :
réel a écrit :
absurde a écrit :

...

...

...

A ce train là, on est mal barré ! yikes

Hors ligne

#90 Le 13/06/2012, à 18:57

Floyd Pepper

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

Ça c'est reel

1    1769    FloydPepper
2    1530    pierguiard
3    1463    MdMax
4    1247    Azurea
5    1192    souen
6    952    Ras&#039;
7    750    raspouillas
8    552    Arcans
9    428    peterp@n
10    359    golgoth42
11    281    mindiell
12    277    omc
13    219    Πυλάδης
14    176    pololasi
15    117    edge_one
16    101    nathéo
17    99    karameloneboudeplus
18    61    agarwood
19    60    Niltugor
20    52    1101011
20    52    jeyenkil
22    43    Crocoii
23    42    nakraïou
23    42    DaveNull
25    40    Biaise
26    39    Clem_ufo
27    38    Atem18
28    34    ljere
29    22    marinmarais
30    18    Ju
31    13    Le grand rohr sha
32    10    Phoenix
32    10    FLOZz
32    10    sakul
32    10    SopolesRâ
36    6    wiscot
36    6    timsy
36    6    Slystone
36    6    Hibou57
36    6    tshirtman
36    6    marting
36    6    c4nuser
43    4    Morgiver
43    4    :!pakman
45    3    Phoenamandre
45    3    gonzolero
45    3    helly
45    3    Le Rouge
49    1    herewegoagain
49    1    TheUploader
49    1    Kyansaa
49    1    Xiti29

Mais en y regardant de près, c'est absurde !



Edit: @ljere
J'ai vu ton intervention sur le TdcT,  je pense que ton idée première est la bonne, pour voir j'aimerais bien que tu relance ton cpt pour vérification, des points et des places. Et comme l'a dit papy si il y a un problème avec un de ses post creuse plutôt par là. Enfin je dis ça je dis rien, le codage en py je connais pas …

Dernière modification par Floyd Pepper (Le 13/06/2012, à 19:27)


... J'aurais tendance à ne pas utiliser de smilleys.
Le plus tu t'fais chier, le plus t'es emmerdé.

Hors ligne

#91 Le 13/06/2012, à 19:26

souen

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

Floyd Pepper a écrit :

Mais en y regardant de près, c'est absurde !

...mais le réel est absurde!!!


Nous ne voyons pas le monde comme il est. Nous le voyons comme nous sommes. Anaïs Nin

Hors ligne

#92 Le 13/06/2012, à 19:37

ljere

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

comme je l'avais dit à pierguiard l'erreur ne vient pas de son édition de poste c'est le comportement normal du script, l'erreur se produit après

scores.append(Score([(line.split(' ')[0]),exp.split(line)[1].split('\n')[0]]))
IndexError: list index out of range

ancien PC Toshiba satellite_c670d-11 / Linux Mint 21 Vanessa
Nouveau PC ASUS TUF GAMING A17 GPU RTX 4070 CPU AMD Ryzen 9 7940HS w/ Radeon 780M Graphics / Linux Mint 21.2 Victoria / Kernel: 6.4.8-1-liquorix / Desktop: Cinnamon

Hors ligne

#93 Le 13/06/2012, à 19:49

souen

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

Une dernière pour la route...

de Juli Zeh Extrait du La Filles sans qualités a écrit :

Le sens de la vie, c’est ce qui reste quand on se débarrasse de tout ce qui est absurde.


Nous ne voyons pas le monde comme il est. Nous le voyons comme nous sommes. Anaïs Nin

Hors ligne

#94 Le 13/06/2012, à 19:53

PPdM

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

@Floyd Papy
c'est pépé pas papy nanmais ho!  tongue


La critique est facile, mais l'art est difficile !
L'humanité étant ce qu'elle est, la liberté ne sera jamais un acquit, mais toujours un droit à défendre !
Pour résoudre un problème commence par poser les bonnes questions, la bonne solution en découlera

Hors ligne

#95 Le 13/06/2012, à 19:55

Floyd Pepper

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

De peur de dire une grosse connerie je ne peux que m'en remettre à toi, mais cette erreur n'empêchait pas ton compteur de compter juste, non ?


... J'aurais tendance à ne pas utiliser de smilleys.
Le plus tu t'fais chier, le plus t'es emmerdé.

Hors ligne

#96 Le 13/06/2012, à 20:00

Floyd Pepper

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

pierguiard a écrit :

@Floyd Papy
c'est pépé pas papy nanmais ho!  tongue

Ah ouai, ça c'est vrai, mille excuses, j'avais oublié que le papy c'était moi.
Dédoublement inverse de la personnalité, ça devient critique … 


... J'aurais tendance à ne pas utiliser de smilleys.
Le plus tu t'fais chier, le plus t'es emmerdé.

Hors ligne

#97 Le 13/06/2012, à 20:35

ljere

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

ah non ce n'est pas ce compteur la que j'avais testé c'est un script qui n'est pas du tout automatisé (d’où les erreurs lors du premier essai)solution non viable pour ce topic


ancien PC Toshiba satellite_c670d-11 / Linux Mint 21 Vanessa
Nouveau PC ASUS TUF GAMING A17 GPU RTX 4070 CPU AMD Ryzen 9 7940HS w/ Radeon 780M Graphics / Linux Mint 21.2 Victoria / Kernel: 6.4.8-1-liquorix / Desktop: Cinnamon

Hors ligne

#98 Le 13/06/2012, à 22:51

raspouillas

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

Qui est le plus vieux dans le forum Ubuntu ?

#99 Le 14/06/2012, à 04:01

Ras&#039;

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

Y'avait un topic là dessus j'crois...


Va t'faire shampouiner par le compteur_V2 en timezone[Canada/Eastern] !
 
Les types awesome n'ont rien à prouver. À personne.
'k bye là

Hors ligne

#100 Le 14/06/2012, à 04:17

raspouillas

Re : Topic des lève-tôt… Faisons manger leurs caleçons aux couche-tard! [4]

boujour ...