Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

#1 Le 28/10/2012, à 12:28

lukophron

[python]Monsieur Cinéscript

Salut,

Suite à une demande, j'ai pondu un script python pour mettre à jour la liste des films trouvés sur le topic-jeu Quel film c'est ?

Ça tourne, ça remplit son objectif (et son deuxième objectif qui était de me remettre à apprendre Python ^^)
Maintenant, il y aurait mieux.
Je poste ici pour avoir quelques retours de codeurs, et fixer certains des objectifs d'amélioration.

questionnement actuel :
- algo à revoir ? tu m'étonnes...

- pourquoi  tt0080684 ne renvoie pas la date ?


Vos idées, conseils, pistes, remarques, sont les bienvenus !


120311 : modif unicode
130123 : modif trialpha (clarification), balise [imdb] insensible à la casse
130401 : modif balise *]
130610 : v0.9.6 unicode mon amour, le GMT c'est le pied
130713 : v0.9.7 python2.7, correction parse imdb, addons log + envoi topic dédié + détails
140201 : v0.9.9 bordel
140614 : v1.0.0 message dans le topic pour signalement
140622 : v1.1.1 tests
140911 : v1.1.2 (?)

Dernière modification par lukophron (Le 11/09/2014, à 19:58)


Le danger avec les glands est qu'ils prennent racines.
Corneille

Hors ligne

#2 Le 28/10/2012, à 12:28

lukophron

Re : [python]Monsieur Cinéscript

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
### mise à jour de la liste des films du jeu Monsieur Cinéma sur forum.ubuntu-fr ###
#
# misajourv1.py
#
# python2.7
#    dep : mechanize
#
# un fichier joint pour accéder au compte
# un fichier créé si besoin pour sauvegarder la liste
#
# licence internationale DTFWYW
# licence fr SCVSVPTPUB

import urllib2
import locale
import re
import time
import mechanize
import htmlentitydefs
import unicodedata


from random import choice

version = 'v1.1.2'

locale.setlocale(locale.LC_ALL,'fr_FR.utf8')

def cleanString(s):
    if isinstance(s,str):
        s = unicode(s,"utf-8","replace")
    s=unicodedata.normalize('NFD',s)
    return s

def compare (a, b):
    # pour épurer et trier les titres
    a = a.lstrip()
    b = b.lstrip()
    if a[0] == '(':
        a = a.split(')')[1]
    if b[0] == '(':
        b = b.split(')')[1]
    a = a.lstrip()
    b = b.lstrip()
    return locale.strcoll(a, b)


def unescape(text):
    #    code html -> unicode   fonction trouvée sur le net
    def fixup(m):
        text = m.group(0)
        if text[:2] == "&#":
            # character reference
            try:
                if text[:3] == "&#x":
                    return unichr(int(text[3:-1], 16))
                else:
                    return unichr(int(text[2:-1]))
            except ValueError:
                pass
        else:
            # named entity
            try:
                text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
            except KeyError:
                pass
        return text # leave as is
    return re.sub("&#?\w+;", fixup, text)

def trialpha(liste) :
    # tri par ordre alphabétique la liste brute
    dicfilm = {}
    trukipasspa = {ord(u'\u0152'):u'oe' , ord(u'\u0153'):u'oe'}
    
    for i in liste:
        i = i.lstrip().rstrip()
        if i[0] == '(':
            a = i.split(')')[1]
            a = cleanString(a.lstrip())
        else : 
            a = cleanString(i)
        a = a.translate(trukipasspa)
        dicfilm[i]= a[0].lower()

    liste_alpha = []
    for i in range(28) :
            liste_alpha.append([])
            
    alfab = 'abcdefghijklmnopqrstuvwxyz'
    for i in dicfilm.items():
        if i[1] in alfab :
            liste_alpha[alfab.index(i[1])+1].append(i[0])
        elif i[1].isdigit() :
            liste_alpha[0].append(i[0])
        else :
            liste_alpha[27].append(i[0])

    #liste_globale = [j for i in liste_alpha for j in i]
    for i in range(28):
        liste_alpha[i].sort(cmp=compare)
        
    liste_imprim = u'[center][b]N°[/b][/center]\n[code]'+(u' | ').join(liste_alpha[0])+u'''[/code]\n\n'''
    nbr = 1
    for i in 'abcdefghijklmnopqrstuvwxyz?'.upper():
        liste_imprim += u'[center][b]'+i+u'[/b][/center]\n[code]'+(u' | ').join(liste_alpha[nbr])+u'''[/code]\n\n'''
        nbr+=1

    return liste_imprim.encode('utf8')

def recupost(urltopic) :
    # récupère le deuxième message du topique et en extrait
    #   la liste actuelle, les codes imdb déjà utilisés, l'id du post, la dernière page parcourue
    print 'récupération du message-liste'
    print urltopic
    for i in range(5):
        try:
            pageraw = urllib2.urlopen(urltopic)
            print 'première page récupérée '+urltopic
            break
        except:
            print 'récupération échouée, nouvelle tentative dans 3 secondes'
            if i==4:
                print 'échec de la récupération - sortie'
                raise
            time.sleep(3)
    
    page = pageraw.read()

    pageraw.close()
    
    #print page
    imdrex = re.compile('\<code>\[imdb\sliste\](.*?)\[/imdb\]</code>')
    listrex = re.compile('<p style="text-align: center"><strong>.*?</strong></p><div class="codebox"><pre><code>(.*?)</code></pre></div>')
    numprex = re.compile('la page #([\d]+)')
    postex = re.compile('<div id="p(\d+)"\sclass=')
    
    if imdrex.search(page):
        liste_imdb = imdrex.search(page).group(1)
        liste_imdb = liste_imdb.split()
    else :
        print 'liste imdb absente ?'
        liste_imdb = []
   
    liste_titres = []
    if listrex.search(page) :
        for i in listrex.findall(page) :
            liste_titres += unescape(i.decode('utf8')).split(' | ')
    else :
        print 'liste de titres absente ?'
    
    if postex.search(page) :
        postid = postex.findall(page)[1]
    else :
        print 'ID du post introuvable'
        postid = 0
        #raise

    if numprex.search(page) :
        numpage = numprex.search(page).group(1)
    else :
        print 'n° de dernière page mise à jour non trouvée, placé à 1 par défaut'
        numpage = 1
            
    print '\n message récupéré pour mise à jour\n'  
    return liste_imdb, liste_titres, postid, numpage


def recupbalise(numpage, url, old_imdb) :
    # retourne  les balises des films trouvés à rajouter
    #           la dernière page farfouillée
    #           le nouvel url, si le topic est fermé
    #           le dernier film trouvé
    listall = []
    dernier = ['','',0]
    newurl = url
    numpage = int(numpage)
    suivex = re.compile('>Suiv.</a>')
    titrex = re.compile('[\[imdb\]|\[*\]](tt\d+)[\[/imdb\]|\[/*\]]', re.I)
    closerex = re.compile('<p class="postlink conr">Discussion fermée</p>')
    postmsrex = re.compile('<div class="postmsg">(.*?)</div>', re.DOTALL)
    linkrex = re.compile('<a href="(.*?)">')
    
    while numpage < 300 : # limite non-nécessaire si le code n'est pas beugué, mieux vaut prévenir...
        print 'recherche des codes imdb sur la page '+str(numpage)
        print url+'&p='+str(numpage)
        for i in range(5):
            try :
                pageraw = urllib2.urlopen(url+'&p='+str(numpage))
                break
            except :    
                if i==4:
                    print 'échec de connection avec le forum - sortie'
                    raise
                print 'page du forum inaccessible - nouvelle tentative dans 3 secondes'
                time.sleep(3)
                
        page = pageraw.read()
        pageraw.close()
        
        #titre = titrex.findall(page)
        titre = []
        [titre.append(x) for x in titrex.findall(page)\
         if (x not in old_imdb and x not in titre)]
        if titre :
            dernier[1] = titre[-1]
            dernier[2] = numpage
        print titre
        [listall.append(x) for x in titre if x not in listall]
        
        if suivex.search(page) :
            numpage +=1
        else:            
            if closerex.search(page) :
                print '\ntopic fermé, recherche du nouveau topic'
                posts = postmsrex.findall(page)
                lastpost = posts[-1]
                print lastpost
                if linkrex.search(lastpost) :
                    numpage = 1
                    newurl = linkrex.search(lastpost).group(1)
                    print 'Nouveau topic détecté: '+newurl
                else :
                    print "Topique détecté fermé, mais pas de nouveau url ?"                
                    break
            break
    #listall = list(set(listall))

    return numpage, listall, newurl, dernier


def titrimdb(films, dernier):
    # cherche les titres des films en fonction de leur numéro imdb
    print '\nrecherche des titres des nouveaux films sur imdb'
    print films
    nouvfilm = []

    title = re.compile('<title>(.*?)</title>')
    tab = re.compile('<td>(.*?)</td>')
    
    cookieJar = mechanize.CookieJar()
    handlers = [ 
        urllib2.HTTPHandler(),
        urllib2.HTTPCookieProcessor(cookieJar),
        ]   
    opener = urllib2.build_opener(*handlers)
    headers = {
   'Accept': 'text/html,application/xhtml+xml,'\
             'application/xml;q=0.9,*/*;q=0.8',
   'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
   'Accept-Language': 'en-US,en;q=0.8,fr;q=0.6',
   'Connection': 'keep-alive',
   'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.19 '\
                 '(KHTML, like Gecko) Ubuntu/12.04 '\
                 'Chromium/18.0.1025.151 Chrome/18.0.1025.151 '\
                 'Safari/535.19',
    }
    
    for i in films:
        page = ''
        url='http://www.imdb.com/title/'+i+'/releaseinfo'
        for j in range(5):
            print 'Balise '+i+' : ',
            try :   
                request = urllib2.Request(
                    url=url, 
                    headers=headers
                )
                connection = opener.open(request)
                if connection.geturl()==url:
                    page = connection.read()
                else :
                    print "\nATTENTION : vérifier la balise "+i+'\n'
                break
            except urllib2.HTTPError, exc:
                if exc.code == 404:
                    print "404 Page non trouvée !"
                    print "\nATTENTION : vérifier la balise "+i+'\n'
                    break
                else:           
                    print "La requête HTTP a échoué avec le code %d (%s)" % (exc.code, exc.msg)
                    print "\nATTENTION : vérifier la balise "+i+'\n'
                    break
            except urllib2.URLError, exc:
                print "Echec. Cause:", exc.reason
                print 'page imdb inaccessible, nouvelle tentative dans 3 secondes'
                if j==4:
                    print 'échec de connection avec IMDb - sortie'
                    raise
                time.sleep(3)
        
        original = ''
        
        titre = title.search(page).group(1)
        titre = unescape(titre)
        titre = titre.split(' - ')[0]
        
        tableau = tab.findall(page)

        for k in tableau :
            if 'original title' in k.lower() :
                if original and original != unescape(tableau[tableau.index(k)+1]):
                    original += ' ('+unescape(tableau[tableau.index(k)+1])+')'
                else :
                    original = unescape(tableau[tableau.index(k)+1])
                date = titre.split().pop()
        if original != '' :
            titre = original+' '+date
        if titre[:2].lower() in ["l'","d'"] :
            titre = titre[:2]+' '+titre[2:]
        titest = titre.split()
        if titest[0].lower() in ['le','la','les',"l'",'the','a']: # vérifier le formatage voulu (mon, ma, mes ?)
            titest[0]='('+titest[0]+')'
            titre = ' '.join(titest)
        
        titre = cleanString(titre)
        print titre
        nouvfilm.append((i, titre))
        if i == dernier[1] :
            dernier[0] = titre
        time.sleep(1)

    print 'recherche imdb terminée' 
    if nouvfilm == []:
        print 'pas de nouveau film, donc'
    else :
        print '\ntitres ajoutés :'
        print [t for (i, t) in nouvfilm]
    return nouvfilm, dernier


def message(liste_imdb, liste_titres, nbr_titres, numpage, dernier, picfilm):
    # façonne le nouveau message-liste
    texte = """[b]LISTE DES FILMS DÉJÀ CITÉS :[/b]

~+~+~+~+~+~+~+~+~
Dernière mise à jour de la Liste : """
    texte += time.strftime('le %d/%m/%Y, à %H:%M:%S (GMT)',time.gmtime())
    texte += """, jusqu'à la page #"""
    texte += str(numpage)
    texte += """
Dernier film ajouté : """
    texte += dernier[0].encode('utf8')
    texte += """  [i]balise """
    texte += dernier[1] + ", page "
    texte += str(dernier[2])+"""[/i]
Nombre de films trouvés : """
    texte += str(nbr_titres)
    texte += """
~+~+~+~+~+~+~+~+~
     
"""
    texte += trialpha(liste_titres)
    texte += """

Liste des balises utilisées[code][imdb liste]"""
    texte += liste_imdb.encode('utf8')
    texte += """[/imdb][/code]"""
    texte += picfilm.encode('utf8')
    #texte.decode('utf8')
    return texte

def notification(numpage, new_numpage, new_film):
	#façonne le message de notification de mise à jour
    texte = """Bonjour,
mise à jour effectuée depuis la page """
    texte += str(numpage)
    texte += """ jusqu'à la page """
    texte += str(new_numpage)
    texte += """
    
    """
    texte += choice(["j'balise !", "Merci de signaler les erreurs",\
     "ça va sinon ?", "Winter is coming.", "Merci d'errer les signalements"])
    texte += """[code]"""
    for i in new_film :
        texte += """
    Balise """
        texte += i[0].encode('utf8')
        texte += """ : """
        texte += i[1].encode('utf8')
    texte += """[/code]"""
    
    return texte

def modifpost(msg, msg2, login, password, postid, tid):
    # envoie les messages - liste + notification
    print 'envoi des post en cours...'
    
    # modifie le post liste
    for i in range(5) :
        try :
			print 'modification du post-liste'
			cookieJar = mechanize.CookieJar()
			opener = mechanize.build_opener(mechanize.HTTPCookieProcessor(cookieJar))
			opener.addheaders = [("User-agent","Mozilla/5.0")]
			mechanize.install_opener(opener)
			
			fp = mechanize.urlopen("http://forum.ubuntu-fr.org/login.php")
			forms = mechanize.ParseResponse(fp)
			fp.close()
			
			#print forms[1]
			form = forms[1]
			form["req_username"] = login
			form["req_password"] = password
			fp = mechanize.urlopen(form.click())
			fp.close()
			
			print 'opening http://forum.ubuntu-fr.org/edit.php?id='+str(postid)
			fp = mechanize.urlopen('http://forum.ubuntu-fr.org/edit.php?id='+str(postid))
			forms = mechanize.ParseResponse(fp)
			fp.close()
			#print forms[0]
			form = forms[1]
			form["req_message"] = msg
			fp = mechanize.urlopen(form.click())
			fp.close()
			print 'modification faite'
			break
        except:
            print 'post échoué, nouvelle tentative dans 3 secondes'
            if i==4:
                print 'échec - sortie'
                raise
            time.sleep(3)
    
    #notifie la mise à jour
    for i in range(5) :
        try :
			print "envoi du post signalant les ajouts"
			print 'opening http://forum.ubuntu-fr.org/post.php?tid='+tid
			fp2 = mechanize.urlopen('http://forum.ubuntu-fr.org/post.php?tid='+tid)
			forms2 = mechanize.ParseResponse(fp2)
			fp2.close()
			#print forms2[0]
			form2 = forms2[1]
			form2["req_message"] = msg2
			fp2 = mechanize.urlopen(form2.click())
			fp2.close()
			print 'envoi réalisé'
			break
        except:
			print 'post échoué, nouvelle tentative dans 3 secondes'
			if i==4:
				print 'échec - sortie'
				raise
			time.sleep(3)  





def modiflocal(msg):
    # pour un test en local et la sauvegarde
    try :
        with open('liste.bak', 'w') as f :
            f.write(msg)
        print 'ok, liste.bak mis à jour'
    except :
        print 'sauvegarde locale impossible'
  
def recupostID(urltopic) :
    postex = re.compile('<div id="p(\d+)"\sclass=')
    for i in range(5):
        try:
            pageraw = urllib2.urlopen(urltopic)
            print 'page récupérée '+urltopic
            break
        except:
            print 'récupération échouée, nouvelle tentative dans 3 secondes'
            if i==4:
                print 'échec de la récupération - sortie'
                raise
            time.sleep(3)
    
    page = pageraw.read().decode('utf-8')
    pageraw.close()
    
    if postex.search(page) :
        postid = postex.findall(page)[1]
    else :
        print 'ID du post introuvable'
        raise
    return postid

def sendimage(url_server, url_image):
    # envoie l'image sur un serveur
    imrex = re.compile('\[img\](.*?)\[/img\]', re.I)
	
    print 'envoi de l\'image pour modif\' en ligne'
    cookieJar = mechanize.CookieJar()
	
    opener = mechanize.build_opener(mechanize.HTTPCookieProcessor(cookieJar))
    opener.addheaders = [("User-agent","Mozilla/5.0")]
    mechanize.install_opener(opener)
	
    fp = mechanize.urlopen(url_server)
    forms = mechanize.ParseResponse(fp)
    fp.close()
	    
    form = forms[0]
    print 'envoi du formulaire'
    form["url_list"] = url_image
    form["optsize"] = ['3']
    form["adult"] = ["no"]
    #print form
    fp = mechanize.urlopen(form.click())
    response = fp.read()
    fp.close()
    url_thumb = imrex.search(response).group(1)
    print 'image réduite accessible : ' +url_thumb
    return url_thumb
    
def getpic(titre):
    # va chercher une pic !
    print "recherche d'une image..."
    imrex = re.compile('imgurl:&quot;(.*?)&quot;', re.I)
    jeveurex = re.compile('gif|nopicture|youtube')
    cookieJar = mechanize.CookieJar()
    
    opener = mechanize.build_opener(mechanize.HTTPCookieProcessor(cookieJar))
    opener.addheaders = [("User-agent","Mozilla/5.0")]
    mechanize.install_opener(opener)
    
    cherche = "http://www.bing.com/images/search?q=movie+"+'+'.join(titre.split())+"&adlt=off"
    print cherche
    fp = mechanize.urlopen(cherche)
    response = fp.read()
    fp.close()
    
    listall = imrex.findall(response)
    
    for i in range(len(listall)):
        if jeveurex.search(listall[i]):
            continue
        else :
            print listall[i]
            ima = listall[i]
            break
    if ima :
        return ima
    else :
        ima = 'http://clzimages.com/movie/large/43/43_d_46984_0_Python.jpg'
        return ima

def main():
    # on y arrive... ###scinder en fonctions ? (cf picfilm)  ++options
    print "mise à jour en cours... "+version
    with open('tchernia','r') as f :
        url_qfc = f.readline().rstrip('\n\r')
        login = f.readline().rstrip('\n\r')
        password = f.readline().rstrip('\n\r')
    
    try :
        tid = url_qfc.split('=')[1].rstrip('&p')
    except :
        tid = 'ERROR : url invalide ?'
    try :
        urltopic = url_qfc.split('&')[0]
    except :
        urltopic = url_qfc
    
    print 'id du topic en cours = '+tid
    #`a changer si liste à part
    old_imdb, old_titres, postid, numpage = recupost(urltopic)
    
    print 'page en cours = '+str(numpage)    
    
    new_numpage, new_imdb, newurl, dernier = recupbalise(numpage, url_qfc, old_imdb)
    print 'page atteinte : '+str(new_numpage)+'\n'
    
    #s1 = set(new_imdb)
    #s2 = set(old_imdb)    
    #new_imdb = list(s1-s2)
    
    if new_imdb != []:
        new_film, dernier = titrimdb(new_imdb, dernier)
    else :
        print 'pas de nouveau film, sortie sans modification de la liste'
        quit()
    
    new_imdb = old_imdb + new_imdb # ! modification après avoir récupéré les titres
    new_liste = [t for (i, t) in new_film] + old_titres
    new_liste = list(set(new_liste))
    new_liste.sort(cmp=compare)
    new_imdb.sort()
    
    if new_imdb :
        imdb_str = ' '.join(new_imdb)
    else :
        imdb_str = ''
    
    nbr_titres = len(new_liste)
    
    #cherchpic = choice(new_liste)
    try :
        cherchpic = choice(new_liste)
    except :
        print "bug python, choix annulé"
        cherchpic = "python"
    print "\nle choix du jour : "+cherchpic
    try :
        ima = urllib2.unquote(getpic(cleanString(cherchpic).encode("utf-8")))
        thumb = sendimage('http://postimage.org/index.php?um=web', ima)
        picfilm ="""
    [center]un (quel)film(c) au hasard
    [url="""+ima+"][img="+cherchpic+"]"+thumb+"[/img][/url][/center]"
    except :
        print "bug envoi image"
        picfilm = " "
    
    
    msg = message(imdb_str, new_liste, nbr_titres, new_numpage, dernier, picfilm)	
    msg2 = notification(numpage, new_numpage, new_film)
    
    print '\nnouvelle liste créée \n'
    print 'modification de la liste locale'
    modiflocal(msg)
    
    if urltopic != newurl :
        try :
            tid = newurl.split('=')[1].rstrip('&p')
        except :
            print 'ERROR : nouvel url invalide ? '+newurl
        print '\nTopic changé, recherche du nouveau post sur le topic '+tid
        postid = recupost('http://forum.ubuntu-fr.org/viewtopic.php?id='+tid)[2]
        print 'modification du fichier local avec la nouvelle url'
        print newurl
        with open('tchernia', 'r') as file :
            tchernia = file.readlines()
    
        tchernia[0] = 'http://forum.ubuntu-fr.org/viewtopic.php?id='+tid+'\n'
        with open('tchernia', 'w') as file :
            file.writelines(tchernia)
    
    print '\nmessage à envoyer sur le fil'        
    try :
        if raw_input(msg2):
            print "go go go"

        modifpost(msg, msg2, login, password, postid, tid)
    except :
        print '\néchec des posts'
    
    print '\n ... mise à jour terminée '


if __name__ == "__main__":
    main()

Dernière modification par lukophron (Le 11/09/2014, à 20:02)


Le danger avec les glands est qu'ils prennent racines.
Corneille

Hors ligne

#3 Le 04/11/2012, à 12:08

SystemeD

Re : [python]Monsieur Cinéscript

Je copie toujours le code que tu donnes en page 1 comme tu me l'avais dit !

Sinon j'ai copié celui-là et :

./misajour.py
  File "./misajour.py", line 457
    print 'opening [url=http://forum.ubuntu-fr.org/edit.php?id=+str(postid)]http://forum.ubuntu-fr.org/edit.php?id='+str(postid)[/url]
                                                                                                                                 ^
SyntaxError: invalid syntax

Cœur de Breizh...  Breizhad on ha lorc'h ennon !

Les belles photos de quelques membres du forum : http://autogalerie_u-fr.tdct.org/

Hors ligne

#4 Le 04/11/2012, à 12:42

lukophron

Re : [python]Monsieur Cinéscript

ok, on va rester ici histoire de ne pas s'embrouiller plus avant wink
j'ai mal posté et le forum a rajouté des balises automatiquement, je modifie ça, tu peux y aller, ça va passer...


Le danger avec les glands est qu'ils prennent racines.
Corneille

Hors ligne

#5 Le 04/11/2012, à 13:15

SystemeD

Re : [python]Monsieur Cinéscript

Voila :

./misajour.py
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
from: can't read /var/mail/BeautifulSoup
./misajour.py: ligne 26: version : commande introuvable
./misajour.py: ligne 28: Erreur de syntaxe près du symbole inattendu « locale.LC_ALL,'fr_FR.utf8' »
./misajour.py: ligne 28: `locale.setlocale(locale.LC_ALL,'fr_FR.utf8')'

Cœur de Breizh...  Breizhad on ha lorc'h ennon !

Les belles photos de quelques membres du forum : http://autogalerie_u-fr.tdct.org/

Hors ligne

#6 Le 04/11/2012, à 13:28

lukophron

Re : [python]Monsieur Cinéscript

je te confirme que ça tourne chez moi, avec le code posté en #2

il manque peut-être les premières lignes chez toi (#!/usr/bin/env python, etc)
vérifie/refais ton copier-coller


Le danger avec les glands est qu'ils prennent racines.
Corneille

Hors ligne

#7 Le 04/11/2012, à 14:08

grim7reaper

Re : [python]Monsieur Cinéscript

Je confirme, ça c’est la sortie d’un script python lu par un shell…

Hors ligne

#8 Le 04/11/2012, à 16:37

SystemeD

Re : [python]Monsieur Cinéscript

Je lance ton script dans une console et j'obtiens ça :

./misajour.py
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
import: unable to grab mouse `': Ressource temporairement non disponible @ error/xwindow.c/XSelectWindow/9012.
from: can't read /var/mail/BeautifulSoup
./misajour.py: ligne 26: version : commande introuvable
./misajour.py: ligne 28: Erreur de syntaxe près du symbole inattendu « locale.LC_ALL,'fr_FR.utf8' »
./misajour.py: ligne 28: `locale.setlocale(locale.LC_ALL,'fr_FR.utf8')'

Vous dites que ça marche mais alors pourquoi les deux derniers films : Friday et Trois Enfants Dans Le Désordre ne sont pas ajoutés à la liste ?


Cœur de Breizh...  Breizhad on ha lorc'h ennon !

Les belles photos de quelques membres du forum : http://autogalerie_u-fr.tdct.org/

Hors ligne

#9 Le 04/11/2012, à 16:58

grim7reaper

Re : [python]Monsieur Cinéscript

Le script a peut-être des bugs, mais le fait de lancer du Python avec un interpréteur Shell ça va pas aider hein roll

Essaye :

python misajour.py

Au moins tu seras sûr de lance le bon truc (et là, lukophron pourra commencer à débugger si nécessaire…).

Hors ligne

#10 Le 04/11/2012, à 17:28

lukophron

Re : [python]Monsieur Cinéscript

refais ton copier-coller à partir de là!

si je le lance chez moi, je n'ai pas de soucis. Peut-être qu'il y a un soucis dans le script, mais pour l'instant c'est dans ta façon de l'utiliser, le problème. Et s'il y a un bug dans le script, il n'enverra pas le nouveau post, donc ne t'embête pas à chercher wink
Les nouveaux films ne sont pas ajoutés, parce j'ai fait exprès de ne pas envoyer le post, pour qu'on puisse être sûrs que tout va bien chez toi.
Comme tu peux voir, tout va bien, mais il n'envoie pas le post

mise à jour en cours... v0.9.1a
url du topic = http://forum.ubuntu-fr.org/viewtopic.php?id=831321
id du topic = 831321
récupération du message-liste
première page récupérée http://forum.ubuntu-fr.org/viewtopic.php?id=831321

 message récupéré pour mise à jour

page en cours = 94
recherche des codes imdb sur la page 94
http://forum.ubuntu-fr.org/viewtopic.php?id=831321&p=94
['tt1302555', 'tt0188321']
recherche des codes imdb sur la page 95
http://forum.ubuntu-fr.org/viewtopic.php?id=831321&p=95
['tt0113118']
recherche des codes imdb sur la page 96
http://forum.ubuntu-fr.org/viewtopic.php?id=831321&p=96
['tt0187557', 'tt0084855']
page atteinte : 96


recherche des titres des nouveaux films sur imdb
appuyer sur 'o' ou 'n' pour accepter ou refuser un film
['tt0113118', 'tt0187557', 'tt0188321', 'tt0084855']

Balise : tt0113118
--- Accepter le titre : Friday (1995) ?o
titre ajouté

Balise : tt0187557
--- Accepter le titre : Trois enfants... dans le désordre (1966) ?o
titre ajouté

Balise : tt0188321
--- Accepter le titre : (Les) brûlés (1959) ?o
titre ajouté

Balise : tt0084855
--- Accepter le titre : (The) Verdict (1982) ?o
titre ajouté
recherche imdb terminée
nouveaux films :
['Friday (1995)', u'Trois enfants... dans le d\xe9sordre (1966)', u'(Les) br\xfbl\xe9s (1959)', '(The) Verdict (1982)']

message modifié, à envoyer 


sauvegarde locale
ok, liste.bak mis à jour

 ... mise à jour terminée 

Le danger avec les glands est qu'ils prennent racines.
Corneille

Hors ligne

#11 Le 04/11/2012, à 18:15

SystemeD

Re : [python]Monsieur Cinéscript

Là, ça a l'air de gazer impec !

~/Bureau/monsieur cinema$ python misajour.py
mise à jour en cours... v0.9.1a
url du topic = http://forum.ubuntu-fr.org/viewtopic.php?id=831321
id du topic = 831321
récupération du message-liste
première page récupérée http://forum.ubuntu-fr.org/viewtopic.php?id=831321

 message récupéré pour mise à jour

page en cours = 94
recherche des codes imdb sur la page 94
http://forum.ubuntu-fr.org/viewtopic.php?id=831321&p=94
['tt1302555', 'tt0188321']
recherche des codes imdb sur la page 95
http://forum.ubuntu-fr.org/viewtopic.php?id=831321&p=95
['tt0113118']
recherche des codes imdb sur la page 96
http://forum.ubuntu-fr.org/viewtopic.php?id=831321&p=96
['tt0187557', 'tt0084855']
page atteinte : 96


recherche des titres des nouveaux films sur imdb
appuyer sur 'o' ou 'n' pour accepter ou refuser un film
['tt0113118', 'tt0187557', 'tt0188321', 'tt0084855']

Balise : tt0113118
--- Accepter le titre : Friday (1995) ?o
titre ajouté

Balise : tt0187557
--- Accepter le titre : Trois enfants... dans le désordre (1966) ?o
titre ajouté

Balise : tt0188321
--- Accepter le titre : (Les) brûlés (1959) ?o
titre ajouté

Balise : tt0084855
--- Accepter le titre : (The) Verdict (1982) ?o
titre ajouté
recherche imdb terminée
nouveaux films :
['Friday (1995)', u'Trois enfants... dans le d\xe9sordre (1966)', u'(Les) br\xfbl\xe9s (1959)', '(The) Verdict (1982)']

message modifié, à envoyer 


sauvegarde locale
ok, liste.bak mis à jour
modification du post en cours...
misajour.py:447: DeprecationWarning: operating in backwards-compatibility mode
  forms = ClientForm.ParseResponse(fp)
<POST http://forum.ubuntu-fr.org/login.php?action=in application/x-www-form-urlencoded
  <HiddenControl(form_sent=1) (readonly)>
  <HiddenControl(redirect_url=/login.php) (readonly)>
  <TextControl(req_username=)>
  <PasswordControl(req_password=)>
  <SubmitControl(<None>=connexion) (readonly)>>
opening http://forum.ubuntu-fr.org/edit.php?id=8252041
misajour.py:459: DeprecationWarning: operating in backwards-compatibility mode
  forms = ClientForm.ParseResponse(fp)
<GET http://forum.ubuntu-fr.org/search_ubuntufr.php application/x-www-form-urlencoded
  <TextControl(q=Recherche rapide....)>
  <SelectControl(tsearch=[wiki, *forum, planet])>
  <SubmitControl(<None>=ok) (readonly)>>
modification faite

 ... mise à jour terminée 

smile


Cœur de Breizh...  Breizhad on ha lorc'h ennon !

Les belles photos de quelques membres du forum : http://autogalerie_u-fr.tdct.org/

Hors ligne

#12 Le 04/11/2012, à 18:26

lukophron

Re : [python]Monsieur Cinéscript

Dernière modification par monsieur cinéma (Aujourd'hui à 18:11)

ok cool

Je réfléchis à l'interface graphique, qui comportera aussi des améliorations au sujet de la recherche. Mais je ne sais pas si j'aurais le temps avant de repartir en vadrouilles (je peux en avoir plein comme pas du tout).
Du coup ça te va pour l'instant ? c'est fonctionnel comme script (intérêt/utilisation/rendu) ?


Le danger avec les glands est qu'ils prennent racines.
Corneille

Hors ligne

#13 Le 04/11/2012, à 18:29

SystemeD

Re : [python]Monsieur Cinéscript

Ça me semble bien, il reste à le préserver des malfaisants.... smile


Cœur de Breizh...  Breizhad on ha lorc'h ennon !

Les belles photos de quelques membres du forum : http://autogalerie_u-fr.tdct.org/

Hors ligne

#14 Le 04/11/2012, à 18:31

SystemeD

Re : [python]Monsieur Cinéscript

La mise à jour avec ton bébé est hyper agréable comparé à ce qu'il fallait faire avant tout à la mano....


Cœur de Breizh...  Breizhad on ha lorc'h ennon !

Les belles photos de quelques membres du forum : http://autogalerie_u-fr.tdct.org/

Hors ligne

#15 Le 04/11/2012, à 18:42

lukophron

Re : [python]Monsieur Cinéscript

Ok, tant mieux, on en reste là pour l'instant du coup.
Je garde un oeil pour le changement après 100 pages de topic.

6steme1 a écrit :

Ça me semble bien, il reste à le préserver des malfaisants.... smile

c'est-à-dire ?
Si tu parles de gars qui postent des fausses balises, oui faut être vigilants. Du coup, c'était bien vu de demander de passer par une validation pendant la mise à jour. Après si c'est fait exprès, ça ne devrait pas durer longtemps après signalement... wink


Le danger avec les glands est qu'ils prennent racines.
Corneille

Hors ligne

#16 Le 04/11/2012, à 18:44

SystemeD

Re : [python]Monsieur Cinéscript

lukophron a écrit :

Ok, tant mieux, on en reste là pour l'instant du coup.
Je garde un oeil pour le changement après 100 pages de topic.

6steme1 a écrit :

Ça me semble bien, il reste à le préserver des malfaisants.... smile

c'est-à-dire ?
Si tu parles de gars qui postent des fausses balises, oui faut être vigilants. Du coup, c'était bien vu de demander de passer par une validation pendant la mise à jour. Après si c'est fait exprès, ça ne devrait pas durer longtemps après signalement... wink

Je pense que tu devrais effacer toutes les traces du script sur les topics et ne le poster que dans le mail de Monsieur cinéma comme ça seuls les détenteurs du code pourront mettre à jour comme cela se faisait à la main.

Dernière modification par 6steme1 (Le 04/11/2012, à 18:44)


Cœur de Breizh...  Breizhad on ha lorc'h ennon !

Les belles photos de quelques membres du forum : http://autogalerie_u-fr.tdct.org/

Hors ligne

#17 Le 04/11/2012, à 19:07

lukophron

Re : [python]Monsieur Cinéscript

6steme1 a écrit :

Je pense que tu devrais effacer toutes les traces du script sur les topics et ne le poster que dans le mail de Monsieur cinéma comme ça seuls les détenteurs du code pourront mettre à jour comme cela se faisait à la main.

On en a déjà parlé :
Tu ne peux pas faire la mise à jour sans les codes de connexion de Monsieur Cinéma. Ils ne sont pas dans le script, mais dans un des deux fichiers joints. Ces fichiers joints (tchernia et liste.bak) sont effectivement envoyés sur le mail, donc et uniquement aux Messieurs Ciné.
Pas de soucis, on peut laisser le script.



Pour aller plus loin et t'expliquer avec le code (pas de panique ! on va faire simple ! euh, enfin essayer... tongue) :

Une fonction en prog c'est comme une fonction en math, elle prend une ou plusieurs valeurs et te renvoie une ou plusieurs valeurs.
Ca, c'est la fonction qui modifie la liste sur le forum :
def = fonction
modifpost = nom de la fonction
entre parenthèse, les variables

def modifpost(msg, login, password, postid):
[...]

tu vois 'login' et 'password' ?
bon, ce sont des variables, j'aurais pu les appeler x et y mais c'est moins clair ^^.
Elles ont une valeur. Cette valeur est définie là :

def main():
   [...]
    f = open('tchernia','r')
    url = f.readline().rstrip('\n\r')
    login = f.readline().rstrip('\n\r')
    password = f.readline().rstrip('\n\r')
    f.close()
[...]

la fonction principale ouvre le ficher 'tchernia' (open('tchernia')), lit les lignes (readline), et y trouve l'adresse web du topic cinéma, le login et mot de passe de Monsieur Cinéma. Donc ces codes d'accès ne sont pas directement dans le script.


Le danger avec les glands est qu'ils prennent racines.
Corneille

Hors ligne

#18 Le 04/11/2012, à 19:14

SystemeD

Re : [python]Monsieur Cinéscript

Ok, vu ! J'avais zappé les deux fichiers.
Sinon, les fonctions dans le Pascal, c'est pareil et je connais ! wink


Cœur de Breizh...  Breizhad on ha lorc'h ennon !

Les belles photos de quelques membres du forum : http://autogalerie_u-fr.tdct.org/

Hors ligne

#19 Le 04/11/2012, à 20:11

lukophron

Re : [python]Monsieur Cinéscript

ok, ok !


Le danger avec les glands est qu'ils prennent racines.
Corneille

Hors ligne

#20 Le 23/11/2012, à 16:11

lukophron

Re : [python]Monsieur Cinéscript

6steme1 tu peux faire la mise à jour stp ? (tant que je suis dispo)
normalement en deux fois : une pour l'ancien topique et passer au nouveau, la deuxième pour le nouveau topique.
avec les retours ici stp !


Le danger avec les glands est qu'ils prennent racines.
Corneille

Hors ligne

#21 Le 23/11/2012, à 17:26

SystemeD

Re : [python]Monsieur Cinéscript

Aïe ! (3eme essai)

~/Bureau/monsieur cinema$ ./misajour.py
mise à jour en cours... v0.9.1a
url du topic = http://forum.ubuntu-fr.org/viewtopic.php?id=831321
id du topic = 831321
récupération du message-liste
première page récupérée http://forum.ubuntu-fr.org/viewtopic.php?id=831321

 message récupéré pour mise à jour

page en cours = 104
recherche des codes imdb sur la page 104
http://forum.ubuntu-fr.org/viewtopic.php?id=831321&p=104
['tt0330229', 'tt0084516', 'tt0217869']

topic fermé, recherche du nouveau topic

						<p>Messieurs dames, <a href="http://forum.ubuntu-fr.org/viewtopic.php?pid=11591061#p11591061">on ferme</a>.</p>
					
Nouveau topic détecté: http://forum.ubuntu-fr.org/viewtopic.php?pid=11591061#p11591061
page atteinte : 1


recherche des titres des nouveaux films sur imdb
appuyer sur 'o' ou 'n' pour accepter ou refuser un film
[]
recherche imdb terminée
pas de nouveau film, donc

message modifié, à envoyer 


sauvegarde locale
ok, liste.bak mis à jour

Topic changé, recherche du nouveau post
récupération du message-liste
première page récupérée http://forum.ubuntu-fr.org/viewtopic.php?id=11591061#p11591061
liste imdb absente ?
liste de titres absente ?
ID du post introuvable
Traceback (most recent call last):
  File "./misajour.py", line 572, in <module>
    main()
  File "./misajour.py", line 547, in main
    postid = recupost('http://forum.ubuntu-fr.org/viewtopic.php?id='+tid)[2]
  File "./misajour.py", line 226, in recupost
    raise
TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType

Cœur de Breizh...  Breizhad on ha lorc'h ennon !

Les belles photos de quelques membres du forum : http://autogalerie_u-fr.tdct.org/

Hors ligne

#22 Le 23/11/2012, à 18:35

lukophron

Re : [python]Monsieur Cinéscript

ha, bah j'm'a trompé d'un caractère !
change ça, et roule ! (je crois...)

sed -i '/newurl/ s/&p/#p/' /CHEMIN/VERS/FICHIER/misajour.py
misajour.py

edit explicative :
première ligne "sed..." pour changer '&p' en '#p'

Dernière modification par lukophron (Le 23/11/2012, à 18:36)


Le danger avec les glands est qu'ils prennent racines.
Corneille

Hors ligne

#23 Le 23/11/2012, à 18:49

SystemeD

Re : [python]Monsieur Cinéscript

Retour :

~/Bureau/monsieur cinema$ ./misajour.py
mise à jour en cours... v0.9.1a
url du topic = http://forum.ubuntu-fr.org/viewtopic.php?id=831321
id du topic = 831321
récupération du message-liste
première page récupérée http://forum.ubuntu-fr.org/viewtopic.php?id=831321

 message récupéré pour mise à jour

page en cours = 104
recherche des codes imdb sur la page 104
http://forum.ubuntu-fr.org/viewtopic.php?id=831321&p=104
['tt0330229', 'tt0084516', 'tt0217869']

topic fermé, recherche du nouveau topic

						<p>Messieurs dames, <a href="http://forum.ubuntu-fr.org/viewtopic.php?pid=11591061#p11591061">on ferme</a>.</p>
					
Nouveau topic détecté: http://forum.ubuntu-fr.org/viewtopic.php?pid=11591061#p11591061
page atteinte : 1


recherche des titres des nouveaux films sur imdb
appuyer sur 'o' ou 'n' pour accepter ou refuser un film
[]
recherche imdb terminée
pas de nouveau film, donc

message modifié, à envoyer 


sauvegarde locale
ok, liste.bak mis à jour

Topic changé, recherche du nouveau post
récupération du message-liste
première page récupérée http://forum.ubuntu-fr.org/viewtopic.php?id=11591061#p11591061
liste imdb absente ?
liste de titres absente ?
ID du post introuvable
Traceback (most recent call last):
  File "./misajour.py", line 572, in <module>
    main()
  File "./misajour.py", line 547, in main
    postid = recupost('http://forum.ubuntu-fr.org/viewtopic.php?id='+tid)[2]
  File "./misajour.py", line 226, in recupost
    raise
TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType

Cœur de Breizh...  Breizhad on ha lorc'h ennon !

Les belles photos de quelques membres du forum : http://autogalerie_u-fr.tdct.org/

Hors ligne

#24 Le 23/11/2012, à 19:27

lukophron

Re : [python]Monsieur Cinéscript

bon, pas sûr que tu ais fait le 'sed'... mais c'est ma faute, j'aurais dû tester avant d'inclure ces modif' la dernière fois.
J'ai pas le temps là, je verrai ça ce we

tu peux faire la mise à jour en changeant la première ligne du fichier tchernia
remplace
http://forum.ubuntu-fr.org/viewtopic.php?id=831321
par
http://forum.ubuntu-fr.org/viewtopic.php?id=1112581

en ne modifiant rien d'autre (pas de nouvelle ligne, espace, etc)


Le danger avec les glands est qu'ils prennent racines.
Corneille

Hors ligne

#25 Le 23/11/2012, à 20:10

SystemeD

Re : [python]Monsieur Cinéscript

J'avais bien fait le 'sed' !
Bon, je remplace...
Now, everything is allright smile


Cœur de Breizh...  Breizhad on ha lorc'h ennon !

Les belles photos de quelques membres du forum : http://autogalerie_u-fr.tdct.org/

Hors ligne

Haut de page ↑