Este verano me he dedicado en gran parte a escribir código. Principalmente he programado para el proyecto de Typosquatting que presentaré como mi TFG, pero también he tirado algunas líneas en forma de scripts (todos publicados en mi Github) que voy a comentar brevemente.

/índice:

trenca-TT

Un script para recoger los Trending Topics de Twitter. Lo empecé con la idea de poder usarlo para el proyecto de mi TFG, en la fase de monitorización de dominios de marcas comerciales en redes sociales.
En su versión actual, pide los TTs de las localizaciones indicadas en woeids.json a través de la API de Twitter, y los almacena en un fichero JSON o en una base de datos SQLite. Se puede ejecutar una vez o de manera continua (en principio, SLEEP_INTERVAL=15*60 segundos), y el número de TTs o el de localizaciones puede limitarse con los argumentos -n y -l.
Por primera vez, he usado la librería sqlite3 en Python.

tools.py

Una simple interfaz de línea de comandos para acceder a algunas herramientas y enlaces útiles que he recopilado. Se muestran ordenadas y clasificadas por categorías y subcategorías, de manera que con pulsar cuatro teclas se instala y ejecuta (#wip) la herramienta escogida, o bien se abre la aplicación online deseada.
Como quería poder seleccionar entre las opciones ofrecidas de forma ágil, organicé las URLs en un JSON con dos listas por subcategoría (enlaces a Github y enlaces externos) y cargué el fichero de la siguiente manera:

index = json.load(open("tools.json"),object_pairs_hook=OrderedDict)

Así, con tres for anidados podía imprimir todos los elementos enumerados y gracias a OrderedDict mantenía el orden de los elementos dentro del diccionario index.
También descubrí que se puede abrir un link en el navegador con webbrowser.open_new_tab('t.co'), e “instalar” (gracias a git clone) con subprocess.run(["git","clone",url+".git",tool]). Lo más difícil es definir una función run_tool() que ejecute cualquier herramienta, en el lenguaje y con el nombre que sea.

genBTC

Para entender algunos detalles de Bitcoin, empecé por sus fundamentos criptográficos. Primero leí sobre las direcciones de Bitcoin y busqué cómo implementar sin librerías el ECDSA, mediante el cual se obtiene una clave pública K a partir de una clave privada k1 y la operación K=k×G sobre una curva elíptica. Luego aprendí a convertir esa clave pública en una dirección de Bitcoin con codificación Base58Check. También quise probar a convertir la clave privada en formato WIF y este en un código QR que pudiera escanear con una app-cartera de BTCs.
@ekaitz_zarraga me indicó el libro Mastering Bitcoin, una referencia técnica muy útil si te interesa conocer en profundidad el funcionamiento de esta criptomoneda.


1.^ Una clave privada válida para Bitcoin es esencialmente un número aleatorio de 256 bits de entropía y menor que n≃1077<2256. Por comparar, se estima que el universo observable tiene 1080 átomos.

un poco de webdev con clojure

De tanto ver solo buenas palabras sobre Clojure, cuando me topé con este libro pensé que era la oportunidad de iniciarme en este lenguaje que es todo listas entre paréntesis 😂
Este es el repositorio menos desarrollado de los aquí presentes, pero como empecé sobre los ejemplos propios del libro es fácil que alguien que lo coja con más ganas qeu yo pueda aprovecharlo.

pinger&sender

Estos dos scripts, fruto de un par de ratos muy breves, fueron adaptaciones de algunas líneas de código que había visto por ahí.
Con pinger.py buscaba si se había producido algún cambio en una página de Moodle (lo que implicaba que se habían subido las notas), y en tal caso enviaba una alerta a través de un bot de Telegram. sender.py está extraído de email-osint-ripper (@Quantika14), con el fin de comprobar si alguno de los emails de una lista está registrado en Linkedin. En ambos casos usé BeautifulSoup. Aparte de usar la librería de telegram, en pinger.py hice peticiones con cookies mediante urllib, mientras que en sender.py tuve que usar mechanize y cookielib para hacer las peticiones, enviar el formulario de login con POST y a la vez evitar el posible bloqueo de Linkedin.
Cualquiera puede modificar rápidamente este código para su reutilización. Yo los escribí para solventar una necesidad puntual, pero sobre todo porque me daban pie para hacer un terrible juego de palabras 😉