Proxy Information
Original URL
gemini://elpamplina.duckdns.org/programacion/tutorial-bot-mastodon.gmi
Status Code
Success (20)
Meta
text/gemini # Creación de un bot simple para Mastodon por: @ElPamplina@masto.es API de Mastodon para Python: => https://github.com/halcy/Mastodon.py GitHub - halcy/Mastodon.py: Python wrapper for the Mastodon ( https://github.com/mastodon/mastodon/ ) API. Objeto del bot: Poesías completas de Antonio Machado => https://www.cervantesvirtual.com/obra-visor/poesias-completas-1158024/html/613eab1d-2c06-4d6f-bb4f-453605cb6d5c_2.html#I_0_ Poesías completas | Biblioteca Virtual Miguel de Cervantes # Preparar entorno ``` virtualenv env-machadobot . ./env-machadobot/bin/activate pip install Mastodon.py ``` # Pasar a JSON el texto original **(Si solo te interesa el acceso a la API de Mastodon, salta a la siguiente sección) Instalar librería de ayuda. ``` pip install html2text ``` Bajar el texto HTML y convertirlo ``` curl -o "poesias.html" https://www.cervantesvirtual.com/obra-visor/poesias-completas-1158024/html/613eab1d-2c06-4d6f-bb4f-453605cb6d5c_2.html html2text --ignore-links --ignore-images --ignore-emphasis --ignore-tables --unicode-snob poesias.html utf-8 >poesias.v1.txt ``` (Ojo, cuidadín, si no pones la opción --unicode-snob, el conversor te elimina todas las tildes). Eliminar líneas en blanco, cabeceras (líneas con todo mayúsculas) y líneas de marcadores (las que empiezan por asteriscos, barras y paréntesis). ``` grep -v '^\s*$' poesias.v1.txt |grep -v '^\s*[\*\\(]' |grep -v '^[ A-Z]*$' >poesias.v2.txt ``` Termino el trabajo editando manualmente. Quito la cabecera y pie de página para que solo haya texto de poemas. Dejo los signos # que me servirán para separar cada poema. Elimino los pasajes largos de prosa. Añado el comienzo y final para formar el array JSON: ``` [ ......TEXTO..... ] ``` Ahora sustituyo cada línea que empiece por # con unas comillas de cierre y apertura. Luego uso el venerable AWK para convertir los saltos de línea a "\n": ``` sed 's/^#.*$/","/' poesias.v2.txt >poesias.v3.txt awk '{printf "%s\\n", $0}' poesias.v3.txt >poesias.json ``` Voy a comprobar que el formato JSON ha quedado bien, cargándolo directamente en Python, por si salta algún error. ``` $ python Python 3.9.5 (default, May 11 2021, 08:20:37) [GCC 10.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import json >>> with open("poesias.json") as f: ... res=json.load(f) ... >>> len(res) 514 ``` Ya podemos empezar nuestro bot. # Registrar bot Necesitamos una cuenta de bot en algún servidor de Mastodon. Yo voy a usar masto.es porque es mi casa. En masto.es, las normas son las siguientes (en otros servidores podrían diferir): > Si queréis alojar una cuenta bot en masto.es, podéis esperar las siguientes condiciones: > * Que publiquen con visibilidad "no listada" para no saturar nuestra línea pública. > * Que activen la eliminación automática entre 1 y 3 meses para hacer un uso responsable de los recursos del servidor. > * (En caso de interactuar con el usuario) Que respeten la etiqueta #nobot en el perfil. > * Y por supuesto, que respeten las otras reglas. La cuenta bot se registra como cualquier otra, solo que en el perfil hay que marcar que se trata de un bot: => img/tutorial-bot-mastodon/img1.png Ahora vamos a "Desarrollo" y creamos una nueva aplicación. Eso nos proporcionará unos tokens que nuestra API usará para comunicarse con el servidor. Con usar las opciones por defecto nos vale para lo que vamos a hacer. # Iniciar la API Para acceder a la API de Mastodon vamos a usar la librería => https://github.com/halcy/Mastodon.py Mastondon.py para Python. Esta librería utiliza unos archivos con extensión .secret para guardar información de conexión con el servidor y de las credenciales de usuario. Solo tenemos que crearlos una vez. Iniciamos los secrets y hacemos una prueba simple de envío de un post: ``` from mastodon import Mastodon Mastodon.create_app('MachadoBot', api_base_url='https://masto.es', to_file='machadobot-app.secret') mastodon = Mastodon(client_id='machadobot-app.secret') mastodon.log_in('xxxxxxxUSUARIOxxxxxxx', 'xxxxxxPASSWORDxxxxxxx', to_file='machadobot-user.secret') status = mastodon.status_post(""" Desdeño las romanzas de los tenores huecos y el coro de los grillos que cantan a la luna. A distinguir me paro las voces de los ecos, y escucho solamente, entre las voces, una.""", visibility="unlisted") ``` Con esto ya deberíamos ver nuestro post en el timeline del bot: => img/tutorial-bot-mastodon/img2.png A partir de aquí usaremos los archivos machadobot-app.secret y machadobot-user.secret para que nuestro programa no tenga que autenticarse cada vez. Por supuesto, esos archivos hay que guardarlos bien protegidos: ``` chmod 600 machadobot-app.secret machadobot-user.secret ``` # Script del bot Preparo el script Python que hará el trabajo de hacer un post de nuestro bot. Debe: * Leer el archivo poesias.json en una lista. * Elegir aleatoriamente un poema. * Iniciar la API y hacer el post. ### Leer lista de poesías ``` with open(POESIAS, encoding='utf-8') as f: poesias = json.load(f) elegida = None cuenta = len(poesias) print(f"Cargado {POESIAS} con {cuenta} elementos.") while elegida is None and cuenta > 0: candidata = random.choice(poesias) if candidata.strip() != '' and len(candidata) < LIMITE: elegida = candidata cuenta -= 1 print(f"Poesía elegida: {elegida}") ``` He usado unas constantes para los elementos configurables, como la ruta del archivo de poesías y el límite de caracteres del servidor. También he puesto la salvaguarda por si se hubiera colado en el JSON alguna comilla vacía o un texto demasiado largo. ### Hacer post Utilizamos unas variables predefinidas para la ruta de los archivos secret que ya tenemos preparados. Utiizo la opción no listada para cumplir con la norma del servidor. ``` if elegida is not None: mastodon = Mastodon(client_secret=APP_SECRET, access_token=USER_SECRET) post = mastodon.status_post(elegida, visibility='unlisted') print(f"Posteado: {post.uri}") else: print("ERROR: NO ENCONTRADA.") ``` Con esto ya tenemos nuestro script completo. # Registrar cron Usaremos la utilidad => https://keepcoding.io/blog/como-usar-cron-y-crontab-en-linux/ cron del sistema para hacer un post automáticamente cada hora, concretamente en el minuto 26: ``` 26 * * * * /home/ubuntu/env-machadobot/bin/python /home/ubuntu/machadobot/machadobot.py ``` Con esto termina este tutorial. El resultado lo puedes ver en vivo en: => https://masto.es/@machadobot @ElPamplina@masto.es elpamplinadecai@gmail.com => .. Volver al índice
Capsule Response Time
705.111096 milliseconds
Gemini-to-HTML Time
0.010511 milliseconds

This content has been proxied by September (ba2dc).