Introduccion
En esta oportunidad voy a explicar como cree un script de Python que me ayuda a postear notas de Obsidian como contenido en mi blog WordPress.
Ultimamente estoy usando bastante Obsidian y me gusta mucho para anotar cosas de mi dia a dia ya sean notas de mi trabajo, guias propias, notas de reuniones, etc. Tengo bastantes notas las cuales me gustaria convertir en entradas de un blog, pero queria hacerlo sin salir de la interfaz de Obsidian… Busque alternativas pero ninguna me convencio del todo, asi que se me ocurrio crear un script en Python que convierta el markdown de un archivo creado en Obsidian a html y asi publicarlo en mi blog.
Desafios
El desafio principal fue subir las imagenes a WordPress. Eso lo pude resolver subiendo las imagenes mediante SFTP.
El segundo desafio fue convertir el markdown a html, por suerte ya existen muchas librerias para eso. Adapte un poco los estilos con css y quedo muy bien.
Funcionalidades
- Postear notas markdown de Obsidian como posts de WordPress, usando la API Rest de WordPress.
- Postear imagenes guardadas en el Vault de Obsidian en mi sitio de WordPress por medio de SFTP.
- Trabajar de manera local en mi blog, sin salir de Obsidian practicamente.
Como funciona el script
El script Python tiene dos componentes principales:
1. Postear contenido (notas de blog) a WordPress. Uso la WordPress REST API.
2. Subir imagenes a mi sitio WordPress. Uso SFTP.
1 WordPress REST API
Para poder hacer funcionar la WordPress REST API, tuve que generar una clave especial de WordPress mas info aqui para autenticarme contra mi sitio web. Usando requests puedo hacer envios HTTP hacia mi sitio web.
def sendPost(postData): url = mainurl + "/wp-json/wp/v2/posts" if postData["post_id"] > -1: url = mainurl + "/wp-json/wp/v2/posts/" + str(postData["post_id"]) headers = { "Content-Type": "application/json" } response = requests.post( url, auth=HTTPBasicAuth(username, password), headers=headers, json=postData ) return response
2 SFTP
Para poder subir las imagenes, tuve que:
1 Tomar todas las imagenes que estan en el archivo markdown, obtener los nombres de los archivos.
def getFilenames(md_file): with open(md_file, 'r') as file: filedata = file.read() pattern = r'!\[\[(.*?)\.png\]\]' # Find all image names in the file image_names = re.findall(pattern, filedata) arr = [] for image_name in image_names: full_image_name = image_name arr.append(full_image_name) return arr
2 Subir una por una por medio de SFTP a mi hosting.
def sftpupload(mdp): parsed_url = urlparse(SFTPTOGO_URL) sftp = Sftp( hostname=parsed_url.hostname, username=parsed_url.username, password=parsed_url.password, ) sftp.connect() arr = getFilenames(mdp) for image_name2 in arr: local_path = images_path + f"{image_name2}.png" remote_path_file = remote_path + f"{image_name2}.png" sftp.upload(local_path, remote_path_file) sftp.disconnect()
Como usar el script
Simplemente llamamos al script de la siguiente manera:
# --opt = u (subir post), i (subir imagenes), d (draft mode) # --mdp = path al archivo markdown # --cat = categorias de wordpress como (id) python3 main.py --opt='ui' --mdp='/home/MyMDFile.md'
Es posible tambien editar posts ya existentes, para eso hacemos uso de las properties de Obsidian, agregamos una propertie llamada post_id que el script va a leer correctamente.
Funcionalidades que me gustaria agregar
- Cuando aparece un nuevo archivo en mi Obsidian Vault automaticamente se publique en WordPress.
- Subir imagenes usando la WordPress REST API, en vez de SFTP.
- Otorgar los nombres en vez de ids de categorias a la hora de postear notas.
- Selector de atributos a la hora de actualizar un post.
Eso es todo, muchas gracias por leer!