#126 Le 20/07/2013, à 10:09
- Henry de Monfreid
Re : [python]Monsieur Cinéscript
Je viens de trouver ce petit script. Je n'ai pas trop compris a quoi il sert. Je le colle ici au cas ou.
import urllib.request
import re
from time import sleep
import lxml.html
URL = 'http://www.imdb.com/search/title?count=100&sort=num_votes,desc&start=%s&title_type=feature'
RE_TITLE = re.compile("""<a href="/title/([^"]+)/">([^<]+)</a>""")
SLEEP_TIME = 1
LANGUAGE = 'es,en;q=0.5'
UA = 'Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0.1'
f = open('movies.txt', 'w+')
for page in range(0,1000):
req = urllib.request.urlopen(urllib.request.Request(URL % (page * 100 + 1), headers={'Accept-Language': LANGUAGE, 'User-Agent': UA}))
res = req.read().decode('utf-8')
for _id, title in RE_TITLE.findall(res):
title = lxml.html.fromstring(title).text_content()
f.write(_id + '\t' + title + '\n')
sleep(1)
f.close()
« Je te hais plus qu'aucun des dieux qui vivent sur l'Olympe
Car tu ne rêves que discordes, guerres et combats. »
Trouble obsessionnelcompulsif
Le TdCT est revenu (ils reviennent tous), pour y accéder, demandez à nany ou moi.
Hors ligne
#127 Le 21/07/2013, à 13:53
- Henry de Monfreid
Re : [python]Monsieur Cinéscript
@ Lukophron : Est-il possible de modifier les script pour qu'il fonctionne sur un autre topic ?
Je pense qu'on pourra bientôt le faire tourner sur un serveur. Et je pense que des essais seront nécessaires.
L’idéal serait qu'il "travaille" une fois par jour.
Je propose a 01:00, en hommage a La Vingt-cinquième Heure
wikipwdia de Henry Verneuil.
Si quelqu'un a un film plus important/évident/culte avec un horaire dans le titre, on peut en débattre.
Dernière modification par S.O.D. (Le 21/07/2013, à 13:55)
« Je te hais plus qu'aucun des dieux qui vivent sur l'Olympe
Car tu ne rêves que discordes, guerres et combats. »
Trouble obsessionnelcompulsif
Le TdCT est revenu (ils reviennent tous), pour y accéder, demandez à nany ou moi.
Hors ligne
#128 Le 21/07/2013, à 17:35
- GR 34
Re : [python]Monsieur Cinéscript
A 3h 10 pour:
Dernière modification par 6steme1 (Le 21/07/2013, à 17:39)
Karantez-vro... Breizhad on ha lorc'h ennon !
«Les animaux sont mes amis. Et je ne mange pas mes amis.» George Bernard Shaw
https://www.l214.com/
Hors ligne
#129 Le 21/07/2013, à 17:50
- lukophron
Re : [python]Monsieur Cinéscript
@ Lukophron : Est-il possible de modifier les script pour qu'il fonctionne sur un autre topic ?
pas de soucis
Et pour le titre, j'ai "2 heure moins le quart", mais jmef un peu
Le danger avec les glands est qu'ils prennent racines.
Corneille
Hors ligne
#130 Le 22/07/2013, à 08:45
- monsieur cinéma
Re : [python]Monsieur Cinéscript
Le script a débuté sur lun. 22 juil. 2013 07:44:52 UTC
mise à jour en cours... v0.9.8
url du topic = http://forum.ubuntu-fr.org/viewtopic.php?id=1299441
id du topic = 1299441
récupération du message-liste
première page récupérée http://forum.ubuntu-fr.org/viewtopic.php?id=1299441
message récupéré pour mise à jour
page en cours = 24
recherche des codes imdb sur la page 24
http://forum.ubuntu-fr.org/viewtopic.php?id=1299441&p=24
['tt0084868', 'tt0399201', 'tt0056119']
recherche des codes imdb sur la page 25
http://forum.ubuntu-fr.org/viewtopic.php?id=1299441&p=25
['tt1663662', 'tt1318514']
page atteinte : 25
recherche des titres des nouveaux films sur imdb
['tt0399201', 'tt1318514', 'tt1663662', 'tt0056119', 'tt0084868']
Balise : tt0399201
Balise : tt1318514
Balise : tt1663662
Balise : tt0056119
Balise : tt0084868
recherche imdb terminée
titres ajoutés :
(The) Island (2005) ; Rise of the Planet of the Apes (2011) ; Pacific Rim (2013) ; (La) jetée (1962) ; Vincent (1982)
nouvelle liste créée
modification de la liste locale
ok, liste.bak mis à jour
modification du post en cours...
opening http://forum.ubuntu-fr.org/edit.php?id=13804791
modification faite
... mise à jour terminée
Script terminé sur lun. 22 juil. 2013 07:45:39 UTC
Vous êtes écrivain, moi j'suis facteur. Nous sommes tous les deux des hommes de lettres
- Vous voulez un whisky ? - Juste un doigt ! - Vous ne voulez pas un whisky d'abord ?
Hors ligne
#131 Le 22/07/2013, à 09:07
- lukophron
Re : [python]Monsieur Cinéscript
ok les jeunes
ça roule pour moi (liste et messages de mise à jour dans un topic dédié)
autre chose, tant que j'ai le nez dedans ?
Le danger avec les glands est qu'ils prennent racines.
Corneille
Hors ligne
#132 Le 04/08/2013, à 02:56
- lukophron
Re : [python]Monsieur Cinéscript
ok
je relance de deux :
# liste des films trouvés : tout commentaire bienvenu (mise en page, info manquante, etc)
# on ne pourrait pas utiliser le serveur tdct.org (ou n'importe lequel déjà en place)? le script c'est ~180Ko en mémoire, 30 secondes de processeur et de bande-passante par jour...
Le danger avec les glands est qu'ils prennent racines.
Corneille
Hors ligne
#133 Le 04/08/2013, à 07:01
- GR 34
Re : [python]Monsieur Cinéscript
ok
je relance de deux :
# liste des films trouvés : tout commentaire bienvenu (mise en page, info manquante, etc)
# on ne pourrait pas utiliser le serveur tdct.org (ou n'importe lequel déjà en place)? le script c'est ~180Ko en mémoire, 30 secondes de processeur et de bande-passante par jour...
Ok pour moi...
Une chose que je remarque c'est le classement non ordonné du premier groupe, films comportant un nombre dans le titre...
Mais, bon, ce n'est pas important.
Karantez-vro... Breizhad on ha lorc'h ennon !
«Les animaux sont mes amis. Et je ne mange pas mes amis.» George Bernard Shaw
https://www.l214.com/
Hors ligne
#134 Le 04/08/2013, à 08:32
- lukophron
Re : [python]Monsieur Cinéscript
Une chose que je remarque c'est le classement non ordonné du premier groupe, films comportant un nombre dans le titre...
C'est ordonné, mais c'est ordonné sans tenir compte des espaces (tu peux le vérifier dans le reste de la liste aussi).
Ce n'est pas le classement "naturel" pour moi non plus, apparemment c'est une norme.
Quand je demande à M. Python de classer un truc en français
return locale.strcoll(a, b)
, il fait comme ça. J'avoue que je n'ai pas recherché si je pouvais changer.
Le danger avec les glands est qu'ils prennent racines.
Corneille
Hors ligne
#135 Le 04/08/2013, à 08:34
- GR 34
Re : [python]Monsieur Cinéscript
6steme1 a écrit :Une chose que je remarque c'est le classement non ordonné du premier groupe, films comportant un nombre dans le titre...
C'est ordonné, mais c'est ordonné sans tenir compte des espaces (tu peux le vérifier dans le reste de la liste aussi).
Ce n'est pas le classement "naturel" pour moi non plus, apparemment c'est une norme.Quand je demande à M. Python de classer un truc en français
return locale.strcoll(a, b)
, il fait comme ça. J'avoue que je n'ai pas recherché si je pouvais changer.
Oui, j'avais bien vu le coup des espaces dans les nombres écrits en français qui est généralement un pb pour tout langage de programmation.
Ce n'est pas rédhibitoire vu le peu de films...
Dernière modification par 6steme1 (Le 04/08/2013, à 08:35)
Karantez-vro... Breizhad on ha lorc'h ennon !
«Les animaux sont mes amis. Et je ne mange pas mes amis.» George Bernard Shaw
https://www.l214.com/
Hors ligne
#136 Le 10/08/2013, à 08:11
- lukophron
Re : [python]Monsieur Cinéscript
pendant ce temps, à Vera-Crus, j'implante des trucs inutiles mais rigolo
enfin...
moi j'trouve ça rigolo
le compte-à-rebours des 2001 films est lancé !
(je vire, si je suis le seul que ça amuse)
Le danger avec les glands est qu'ils prennent racines.
Corneille
Hors ligne
#137 Le 10/08/2013, à 08:14
- GR 34
Re : [python]Monsieur Cinéscript
pendant ce temps, à Vera-Crus, j'implante des trucs inutiles mais rigolo
enfin...
moi j'trouve ça rigolole compte-à-rebours des 2001 films est lancé !
(je vire, si je suis le seul que ça amuse)
?
Karantez-vro... Breizhad on ha lorc'h ennon !
«Les animaux sont mes amis. Et je ne mange pas mes amis.» George Bernard Shaw
https://www.l214.com/
Hors ligne
#138 Le 22/08/2013, à 12:49
- lukophron
Re : [python]Monsieur Cinéscript
pour la postérité
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
### mise à jour de la liste des films du jeu Monsieur Cinéma sur forum.ubuntu-fr ###
#
# misarebours.py
#
# python2.7
# dep : mechanize
#
# un fichier joint pour accéder au compte
# deux fichiers créés pour sauvegarder la liste et le log
#
# licence internationale DTFWYW
# licence fr SCVSVPTPUB
import urllib2
import locale
import re
import time
import mechanize
import htmlentitydefs
import unicodedata
import comptarebours
version = 'v0.9.8 nimportnaouak'
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'[b]N°[/b]\n'+(u' | ').join(liste_alpha[0])+u'\n\n'
nbr = 1
for i in 'abcdefghijklmnopqrstuvwxyz?'.upper():
liste_imprim += u'[b]'+i+u'[/b]\n'+(u' | ').join(liste_alpha[nbr])+u'\n\n'
nbr+=1
return cleanString(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().decode('utf-8')
pageraw.close()
imdrex = re.compile('<code>\[imdb\sliste\](.*?)\[/imdb\]</code>')
listrex = re.compile('<code>\[liste\sfilms\](.*?)\[/liste\]</code>')
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 = []
if listrex.search(page) :
liste_titres = unescape(listrex.search(page).group(1))
else :
print 'liste de titres absente ?'
liste_titres = ''
if postex.search(page) :
postid = postex.findall(page)[1]
else :
print 'ID du post introuvable'
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 recuptitre(numpage, url) :
# 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)
if titre :
dernier[1] = titre[-1]
dernier[2] = numpage
print titre
listall = listall + titre
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
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 = ''
if page == '':
continue
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() :
original = unescape(tableau[tableau.index(k)+1])
date = titre.split().pop()
break
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)
nouvfilm.append(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 ' ; '.join(nouvfilm)
return nouvfilm, dernier
def message(liste_imdb, liste_titres, nbr_titres, numpage, dernier):
# façonne le nouveau message
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 brute
[code][liste films]"""
texte += (' | ').join(liste_titres).encode('utf8')
texte += """[/liste][/code]
Liste des balises utilisées[code][imdb liste]"""
texte += liste_imdb.encode('utf8')
texte += """[/imdb][/code]"""
return texte
def modifpost(msg, login, password, postid):
# envoie le message des titres à jour
print 'modification du post en cours...'
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'
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 main():
# on y arrive...
print "mise à jour en cours... "+version
with open('tchernia','r') as f :
url_qfc = f.readline().rstrip('\n\r')
url_liste = 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
print 'id de la liste = '+url_liste.split('=')[1].rstrip('&p')
old_imdb, old_titres, postid, numpage = recupost(url_liste)
print 'page en cours = '+str(numpage)
old_titres = old_titres.split(' | ')
new_numpage, new_imdb, newurl, dernier = recuptitre(numpage, url_qfc)
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_film = new_film + old_titres
new_film = list(set(new_film))
new_film.sort(cmp=compare)
new_imdb.sort()
if new_imdb :
imdb_str = ' '.join(new_imdb)
else :
imdb_str = ''
#nbr_titres = len(new_film)
#modif comptarebour
nb = len(new_film)
search = str(nb)+" film"
ima = urllib2.unquote(comptarebours.getpic(search))
nbr_titres="[url="+ima+"][img="+str(nb)+"]"\
+comptarebours.sendimage('http://postimage.org/index.php?um=web', ima)\
+"[/img][/url]"
msg = message(imdb_str, new_film, nbr_titres, new_numpage, dernier) ### original ! keep it !
print '\nnouvelle liste créée \n'
print 'modification de la liste locale'
#fin de modif \compaterebours
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)
postidjeu = recupostID(urltopic)
for i in range (5) :
try :
modifpost(msg, login, password, postid)
modifpost(msg, login, password, postidjeu)
break
except :
if i == 4:
print 'abandon'
raise
print 'échec du post, nouvelle tentative dans 2 secondes'
time.sleep(1)
print '\n ... mise à jour terminée '
main()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
### bonus décompte vers le 2001ème film ###
#
# comptarebour.py
#
# python2.7
# dep : mechanize
#
#
import mechanize
import re
def sendimage(url_server, url_image):
# envoie l'image sur un serveur
imrex = re.compile('\[img\](.*?)\[/img\]', re.I)
print '\nenvoi 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 getfilm(number):
# va chercher un titre!
picrex = re.compile('fn_ft_tt_1" ><img src="(.*?)" /></a>', re.I)
titrex = re.compile('<td class="result_text"> <a href="(.*?)ref_=fn_ft_tt_1" >(.*?)</a>')
nopex = re.compile('nopicture')
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://www.imdb.com/find?q="+str(number)+"&s=tt&ttype=ft")
#~ response = fp.read()
#~ fp.close()
browser = mechanize.Browser(factory=mechanize.RobustFactory())
browser.open("http://www.imdb.com/find?q="+str(number)+"&s=tt&ttype=ft")
response = browser.response().get_data()
#print response
url_image = picrex.search(response).group(1)
titre = titrex.search(response).group(2)
print url_image
if nopex.search(url_image) :
return (0, titre)
else :
return (1, url_image)
def getpic(titre):
# va chercher une pic !
print "\nrecherche d'une image..."
imrex = re.compile('imgres\?imgurl=(.*?)&', re.I)
jeveurex = re.compile('gif|png|nopicture')
cookieJar = mechanize.CookieJar()
opener = mechanize.build_opener(mechanize.HTTPCookieProcessor(cookieJar))
opener.addheaders = [("User-agent","Mozilla/5.0")]
mechanize.install_opener(opener)
cherche = "https://www.google.com/search?hl=en&site=imghp&tbm=isch&oq="+'+'.join(titre.split())+"+&q="+'%20'.join(titre.split())+"&sout=1"
#print cherche
fp = mechanize.urlopen(cherche)
response = fp.read()
fp.close()
#print response
listall = imrex.findall(response)
for i in range(len(listall)):
if jeveurex.search(listall[i]):
continue
else :
print listall[i]
return listall[i]
break
def main(number) :
imdb = getfilm(number)
if imdb[0] :
return imdb[1]
else :
return sendimage('http://postimage.org/index.php?um=web', getpic(imdb[1]))
#!bin/sh
export TZ=UTC
LOCATION=$(dirname "$0")
cd "$LOCATION"
script -c 'python misarebours.py' logfile
python envoyajour.py
exit 0
ou accessoirement pour moi, si je paume ma clé...
Le danger avec les glands est qu'ils prennent racines.
Corneille
Hors ligne
#139 Le 22/08/2013, à 13:44
- GR 34
Re : [python]Monsieur Cinéscript
pour la postérité
#!/usr/bin/env python # -*- coding: utf-8 -*- # ### mise à jour de la liste des films du jeu Monsieur Cinéma sur forum.ubuntu-fr ### # # misarebours.py # # python2.7 # dep : mechanize # # un fichier joint pour accéder au compte # deux fichiers créés pour sauvegarder la liste et le log # # licence internationale DTFWYW # licence fr SCVSVPTPUB import urllib2 import locale import re import time import mechanize import htmlentitydefs import unicodedata import comptarebours version = 'v0.9.8 nimportnaouak' 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'[b]N°[/b]\n'+(u' | ').join(liste_alpha[0])+u'\n\n' nbr = 1 for i in 'abcdefghijklmnopqrstuvwxyz?'.upper(): liste_imprim += u'[b]'+i+u'[/b]\n'+(u' | ').join(liste_alpha[nbr])+u'\n\n' nbr+=1 return cleanString(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().decode('utf-8') pageraw.close() imdrex = re.compile('<code>\[imdb\sliste\](.*?)\[/imdb\]</code>') listrex = re.compile('<code>\[liste\sfilms\](.*?)\[/liste\]</code>') 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 = [] if listrex.search(page) : liste_titres = unescape(listrex.search(page).group(1)) else : print 'liste de titres absente ?' liste_titres = '' if postex.search(page) : postid = postex.findall(page)[1] else : print 'ID du post introuvable' 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 recuptitre(numpage, url) : # 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) if titre : dernier[1] = titre[-1] dernier[2] = numpage print titre listall = listall + titre 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 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 = '' if page == '': continue 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() : original = unescape(tableau[tableau.index(k)+1]) date = titre.split().pop() break 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) nouvfilm.append(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 ' ; '.join(nouvfilm) return nouvfilm, dernier def message(liste_imdb, liste_titres, nbr_titres, numpage, dernier): # façonne le nouveau message 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 brute [code][liste films]""" texte += (' | ').join(liste_titres).encode('utf8') texte += """[/liste][/code] Liste des balises utilisées[code][imdb liste]""" texte += liste_imdb.encode('utf8') texte += """[/imdb][/code]""" return texte def modifpost(msg, login, password, postid): # envoie le message des titres à jour print 'modification du post en cours...' 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' 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 main(): # on y arrive... print "mise à jour en cours... "+version with open('tchernia','r') as f : url_qfc = f.readline().rstrip('\n\r') url_liste = 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 print 'id de la liste = '+url_liste.split('=')[1].rstrip('&p') old_imdb, old_titres, postid, numpage = recupost(url_liste) print 'page en cours = '+str(numpage) old_titres = old_titres.split(' | ') new_numpage, new_imdb, newurl, dernier = recuptitre(numpage, url_qfc) 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_film = new_film + old_titres new_film = list(set(new_film)) new_film.sort(cmp=compare) new_imdb.sort() if new_imdb : imdb_str = ' '.join(new_imdb) else : imdb_str = '' #nbr_titres = len(new_film) #modif comptarebour nb = len(new_film) search = str(nb)+" film" ima = urllib2.unquote(comptarebours.getpic(search)) nbr_titres="[url="+ima+"][img="+str(nb)+"]"\ +comptarebours.sendimage('http://postimage.org/index.php?um=web', ima)\ +"[/img][/url]" msg = message(imdb_str, new_film, nbr_titres, new_numpage, dernier) ### original ! keep it ! print '\nnouvelle liste créée \n' print 'modification de la liste locale' #fin de modif \compaterebours 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) postidjeu = recupostID(urltopic) for i in range (5) : try : modifpost(msg, login, password, postid) modifpost(msg, login, password, postidjeu) break except : if i == 4: print 'abandon' raise print 'échec du post, nouvelle tentative dans 2 secondes' time.sleep(1) print '\n ... mise à jour terminée ' main()
#!/usr/bin/env python # -*- coding: utf-8 -*- # ### bonus décompte vers le 2001ème film ### # # comptarebour.py # # python2.7 # dep : mechanize # # import mechanize import re def sendimage(url_server, url_image): # envoie l'image sur un serveur imrex = re.compile('\[img\](.*?)\[/img\]', re.I) print '\nenvoi 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 getfilm(number): # va chercher un titre! picrex = re.compile('fn_ft_tt_1" ><img src="(.*?)" /></a>', re.I) titrex = re.compile('<td class="result_text"> <a href="(.*?)ref_=fn_ft_tt_1" >(.*?)</a>') nopex = re.compile('nopicture') 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://www.imdb.com/find?q="+str(number)+"&s=tt&ttype=ft") #~ response = fp.read() #~ fp.close() browser = mechanize.Browser(factory=mechanize.RobustFactory()) browser.open("http://www.imdb.com/find?q="+str(number)+"&s=tt&ttype=ft") response = browser.response().get_data() #print response url_image = picrex.search(response).group(1) titre = titrex.search(response).group(2) print url_image if nopex.search(url_image) : return (0, titre) else : return (1, url_image) def getpic(titre): # va chercher une pic ! print "\nrecherche d'une image..." imrex = re.compile('imgres\?imgurl=(.*?)&', re.I) jeveurex = re.compile('gif|png|nopicture') cookieJar = mechanize.CookieJar() opener = mechanize.build_opener(mechanize.HTTPCookieProcessor(cookieJar)) opener.addheaders = [("User-agent","Mozilla/5.0")] mechanize.install_opener(opener) cherche = "https://www.google.com/search?hl=en&site=imghp&tbm=isch&oq="+'+'.join(titre.split())+"+&q="+'%20'.join(titre.split())+"&sout=1" #print cherche fp = mechanize.urlopen(cherche) response = fp.read() fp.close() #print response listall = imrex.findall(response) for i in range(len(listall)): if jeveurex.search(listall[i]): continue else : print listall[i] return listall[i] break def main(number) : imdb = getfilm(number) if imdb[0] : return imdb[1] else : return sendimage('http://postimage.org/index.php?um=web', getpic(imdb[1]))
#!bin/sh export TZ=UTC LOCATION=$(dirname "$0") cd "$LOCATION" script -c 'python misarebours.py' logfile python envoyajour.py exit 0
ou accessoirement pour moi, si je paume ma clé...
Karantez-vro... Breizhad on ha lorc'h ennon !
«Les animaux sont mes amis. Et je ne mange pas mes amis.» George Bernard Shaw
https://www.l214.com/
Hors ligne
#140 Le 02/09/2013, à 17:00
- spinoziste
Re : [python]Monsieur Cinéscript
J'ai une idée pour la prochaine vidéo de Môssieu Cinéma .
Nous mourrons tous .
Hors ligne
#141 Le 05/09/2013, à 01:16
- lukophron
Re : [python]Monsieur Cinéscript
je crois que tu peux MP à SOD, c'est son dada
Le danger avec les glands est qu'ils prennent racines.
Corneille
Hors ligne
#142 Le 05/09/2013, à 09:50
- spinoziste
Re : [python]Monsieur Cinéscript
Ok ça marche merci .
Nous mourrons tous .
Hors ligne
#143 Le 20/10/2013, à 06:29
- lukophron
Re : [python]Monsieur Cinéscript
NB : déconnexion prévue vers fin décembre, faudra prévoir un relai
m'en fous de la mise en page, j'ai fait un test ce matin, pour le foune. Faites vos commentaires !
Le danger avec les glands est qu'ils prennent racines.
Corneille
Hors ligne
#144 Le 20/10/2013, à 08:09
- GR 34
Re : [python]Monsieur Cinéscript
Salut,
J'aimais mieux avant.
Karantez-vro... Breizhad on ha lorc'h ennon !
«Les animaux sont mes amis. Et je ne mange pas mes amis.» George Bernard Shaw
https://www.l214.com/
Hors ligne
#145 Le 10/02/2014, à 21:20
- lukophron
Re : [python]Monsieur Cinéscript
bon, en fait j'ai déjà envoyé sur ce topic une version fonctionnelle, pas de changement. J'ai fourni la boite mail de Monsieur Cinéma aussi, pour faciliter la chose.
Le danger avec les glands est qu'ils prennent racines.
Corneille
Hors ligne
#146 Le 08/03/2014, à 02:20
- xabilon
Re : [python]Monsieur Cinéscript
Salut
À part les login et mdp de Mr Cinéma, que faut-il mettre dans le fichier tchernia ?
La première ligne est l'id du topic, mais la 2e ? L'id du message contenant la liste ?
Pour passer un sujet en résolu : modifiez le premier message et ajoutez [Résolu] au titre.
Hors ligne
#147 Le 08/03/2014, à 02:36
- xabilon
Re : [python]Monsieur Cinéscript
Bon ok, c'ets bon j'ai trouvé.
J'ai réussi à le lancer, tout s'est déroulé sans erreur (j'ai mis mon login et mon mdp, puisque j'ai les droits de modif sur tous les messages).
Mais la liste n'a pas bougé
J'ai bien eu pourtant, à la fin :
modifications de la liste topic du jeu
modification du post en cours...
opening http://forum.ubuntu-fr.org/edit.php?id=13804791
modification faite
... mise à jour terminée
Rem : j'ai pris le script de la page#1. C'est uniquement la modification du post qui ne se fait pas, tout le reste est bon, la liste mise à jour se retrouve bien dans liste.bak.
Dernière modification par xabilon (Le 08/03/2014, à 13:45)
Pour passer un sujet en résolu : modifiez le premier message et ajoutez [Résolu] au titre.
Hors ligne
#148 Le 08/03/2014, à 14:07
- xabilon
Re : [python]Monsieur Cinéscript
J'ai posté la liste manuellement...
Pour passer un sujet en résolu : modifiez le premier message et ajoutez [Résolu] au titre.
Hors ligne
#149 Le 08/03/2014, à 14:48
- GR 34
Re : [python]Monsieur Cinéscript
J'avais le script avant que lukophron ne le rende automatique mais faut que je le retrouve.
Karantez-vro... Breizhad on ha lorc'h ennon !
«Les animaux sont mes amis. Et je ne mange pas mes amis.» George Bernard Shaw
https://www.l214.com/
Hors ligne
#150 Le 08/03/2014, à 15:05
- xabilon
Re : [python]Monsieur Cinéscript
Envois-moi plutôt le mdp de Mr Cinéma pour lancer un nouveau topic (je n'y ai pas accès, les mots de passe sont cryptés dans la base de données).
Si je le crée avec mon compte xabilon, il n'y aura que moi qui pourra mettre la liste à jour.
Pour passer un sujet en résolu : modifiez le premier message et ajoutez [Résolu] au titre.
Hors ligne