#!/usr/bin/python2.2
"""Publicación de historias en blogalia
Autor: Fernando Tricas
Fecha: 14/V/2002
Versión: 0.3
Contacto: fernand0 (en) hotpop.com
La historia que se ha de enviar es un fichero de texto, que contiene en la
primera línea el título, y el resto de se considera el cuerpo de la
historia. Los saltos de línea serán tal cual aparezcan en el fichero,
se recomienda usar un editor que no inserte saltos de línea.
Seguramente fuera conveniente que se consideraran saltos de línea cuando
aparezca un espacio en blanco o algo así (como LaTeX).
TODO:
- Añadir opción para generar fichero ~/.blogalia
- Añadir opción para publicar en la primera bitácora
- ...
borrarHistoria()
traerPlantilla()
actualizarPlantilla()
Cambios entre la 0.2 y la 0.3:
Ahora el programa comprueba la existencia de un fichero llamado
~/.blogalia y trata de leer el usuario y la clave allí
Formato del fichero
----------------------- Empieza a partir de aquí
[DEFAULT]
usuario = elUsuario
clave = laClave
----------------------- Fin
Si el fichero no existe pregunta el usuario y la clave por teclado.
Comprueba cuántas bitácoras tiene el usuario, y permite elegir en
cuál de ellas se escribirá la historia.
Busca y guarda el identificador de la historia.
Guarda la historia en un fichero cuyo nombre es historia-aaaammddhhmmss
que contendrá, además de la historia, la url donde salió (con el
identificador generado por globalia.
"""
import urllib,urllib2,re,sys
baseURL='http://www.blogalia.com/'
def usuario():
# Usuario y Clave. Modificar el escrí.
# Fichero de configuración /home/ftricas/.blogalia
import os
path = os.path.join(os.path.expanduser('~') , '.blogalia')
# .blogalia en el 'home' del usuario, sea lo que sea eso en Win
# en MacOS anteriores al X, nada.
print path
if (os.path.isfile(path)):
import ConfigParser
diccionarioConf = ConfigParser.ConfigParser()
diccionarioConf.read(path)
usuario = diccionarioConf.defaults()['usuario']
clave = diccionarioConf.defaults()['clave']
else:
usuario = raw_input ('Usuario>> ')
import getpass
clave = getpass.getpass('Clave>> ')
return usuario, clave
def seleccionarBitacora():
parametros = usuario()
datosPOST = 'iniciales='+parametros[0]+'&clave='+parametros[1]
# Cargamos la página inicial de blogalia
# Seguramente bastará coger el PHPSESSID de entrar.php
url=baseURL+'entrar.php'
f=urllib2.urlopen(url)
# En la info está la galletita, entre otras cosas la PHPSESSID
# Echar un ojo a ClientCookie,
# http://wwwsearch.sourceforge.net/ClientCookie/
#print f.info()
#print f.info()['Set-Cookie']
C = f.info()['Set-Cookie']
# Nos interesa sólo la primera parte, que es la que tiene el
# identificador de sesión. La añadimos a la lista de parámetros,
# eliminando lo que sobra.
datosPOST = re.sub(r';.*',r'',C)+ "&"+datosPOST
# La url sigue siendo entrar.php con los datos del POST
f=urllib2.urlopen(url, datosPOST)
# Voilà, tenemos la página de edición de historias.
doc = f.read()
res = re.findall(r'(bitacora\.historias\.php\?id=[0-9]*)([^>]*>)([^<]*)', doc)
#print res
print "Bitácoras de las que es propietario"
i = 1
for titulo in res:
print i,')', titulo[2]
i = i + 1
if (int(i)>1):
i = raw_input ('Seleccione una: ')
else:
i = 1
aDonde = res[int(i)-1][2]
aURL = res[int(i)-1][0]
return aDonde, aURL, C
def enviarHistoria(aDonde, aURL, galletita):
print 'Página leida. Enviando historia a ', aDonde
url = baseURL + aURL
# Primero el título (primera línea del fichero historia)
f = open('historia', "r")
# Conviene usar el urlencode para todo el lío del html, espacios,
# saltos, etc...
titular = f.readline().strip()
cuerpo = f.read()
cuerpo = cuerpo + '\n<!-- Publicado mediante blogalia.py -->\n'
cuerpo = cuerpo + '<!--¿Interesado en conseguirlo? Deje un mensaje en la última historia.-->\n'
cuerpo = cuerpo + '<!--Contacto: fernand0 (en) hotpop.com-->\n'
datosPOST = urllib.urlencode({"registro[titulo]":titular,
# Acción
"accion":"Publicar",
# Contenido (las demás líneas del fichero historia)
"registro[contenido]=":cuerpo
})
# Ahora la sesión
# La cookie ya la tenemos en el formato adecuado. Mucho lío pasarla al
# diccionario y luego codificarla.
datosPOST = re.sub(r';.*',r'',galletita) + "&" + datosPOST
#Vamos allá
f=urllib2.urlopen(url, datosPOST)
print 'Historia enviada ...'
doc=f.read()
# Buscamos el identificador de la historia
res = re.search('(id_historia=)([0-9]*)',doc)
import time # Para el nombre del fichero donde se guarda
fArchivo = open('historia'+time.strftime("-%Y%m%d%H%M%S",time.localtime(time.time())),'w')
fArchivo.write(titular)
fArchivo.write(cuerpo)
fArchivo.write('\n URL:')
fArchivo.write(aDonde)
fArchivo.write(' '+res.group(2))
fArchivo.write('\n')
fArchivo.close()
def borrarHistoria(aDonde, aURL, galletita):
print 'Página leida. Borrando en ', aDonde
url = baseURL + aURL
print url
datosPOST = re.sub(r';.*',r'',galletita)
f=urllib2.urlopen(url, datosPOST)
doc = f.read()
bitacoraURL = re.search('(titular[^>]*>[^>]*>[^"]*")(http[^"]*)',doc)
xmlURL = doc[bitacoraURL.start(2):bitacoraURL.end(2)]+'rdf.xml'
bitacoraXML = urllib2.urlopen(xmlURL)
# Tengo el xml, no lo voy a analizar, porque creo que será
# suficiente con utilizar búsquedas de lo que necesitamos.
# Naturalmente, sería más elegante usar XML.py y todo eso...
contenidoXML = bitacoraXML.read()
res = re.findall(r'(<title>)([^<]*)(</title>)([^<]*)(<link>)([^<]*)(</link>)', contenidoXML)
i = 1
for titulo in res:
if (i > 1):
print i-1,')', titulo[1], titulo[5]
i = i + 1
i = raw_input ('Seleccione una: ')
print 'Borraremos ... ', res[int(i)][1], res[int(i)][5]
#http://aeiou.blogalia.com/?/historias/1106
pos = re.search(r'/[0-9]+',res[int(i)][5])
numerito = res[int(i)][5][pos.start()+1:pos.end()]
print "El numerito -> ", numerito
url = baseURL + '/bitacora.historias.php'
datosPOST = urllib.urlencode({
"registro[id_librinho]":numerito,
"accion":"Borrar",
"id_historia":numerito})
# Ahora la sesión
# La cookie ya la tenemos en el formato adecuado. Mucho lío pasarla al
# diccionario y luego codificarla.
datosPOST = re.sub(r';.*',r'',galletita) + "&" + datosPOST
#Vamos allá
f=urllib2.urlopen(url, datosPOST)
print 'Historia borrada, espero no haber roto nada...'
#/bitacora.historias.php?accion=Editar&id_historia=1106&PHPSESSID=a9fcaf6af1bdfec4020aa479fc73d72c
if (__name__ == '__main__'):
sel = raw_input ("""
Seleccione una:
n)ueva historia
b)orrar historia
-> """)
print 'Ha elegido ', sel
aDonde, aURL, galletita = seleccionarBitacora()
if (sel == 'n'):
enviarHistoria(aDonde, aURL, galletita)
if (sel == 'b'):
borrarHistoria(aDonde, aURL, galletita)