Sigo en mi travesía por aprender Python y que mejor forma que solucionar problemas en funciona a la privacidad.

Varias personas me comentaron lo tedioso que es eliminar mensajes privados en Twitter así que decidi hacer una herramienta que me permita automatizar todo esto.

Lo primero es crear una app en twitter visitando apps.twitter.com y otorgarle permisos de lectura, escritura y DMs. Allí mismo pueden generar el consumer_key, consumer_secret, access_token_key y el access_token_secret.

El script no es nada complejo y de hecho hay oportunidades para mejorarlo, aqui se los dejo:

# https://github.com/orvtech/Python-tools-for-twitter
import json
import requests
from requests_oauthlib import OAuth1


consumer_key='<YOUR CONSUMER KEY HERE>'
consumer_secret='<YOUR CONSUMER SECRET HERE>'
access_token_key='<YOUR ACCESS TOKEN HERE>'
access_token_secret='<YOUR ACCESS TOKEN SECRET HERE>'


def get_messages_ids():
  api_url='https://api.twitter.com/1.1/direct_messages.json'
  payload = {'count':'200', 'cursor':'-1', 'skip_status':'1'}
  auth = OAuth1(consumer_key, consumer_secret, access_token_key, access_token_secret)
  r = requests.get(api_url, stream=False, auth=auth, params=payload)
  if r.headers['x-rate-limit-remaining'] and r.headers['x-rate-limit-remaining'] == "0":
    print("We reached rate limit for ", api_url)
    print("Try again at", r.headers["x-rate-limit-reset"])
    quit()
  DMs = json.loads(r.content)
  message_ids=[]
  for x in range(len(DMs)):
    current_ids=DMs[x]['id']
    message_ids.append(current_ids)
  api_url='https://api.twitter.com/1.1/direct_messages/sent.json'
  payload = {'count':'200'}
  r = requests.get(api_url, stream=False, auth=auth, params=payload)
  if r.headers['x-rate-limit-remaining'] and r.headers['x-rate-limit-remaining'] == "0":
    print("We reached rate limit for ", api_url)
    print("Try again at", r.headers["x-rate-limit-reset"])
    quit()
  DMs = json.loads(r.content)
  for x in range(len(DMs)):
    current_ids=DMs[x]['id']
    message_ids.append(current_ids)
  return message_ids


def nuke_messages(DMs):
  for x in DMs:
    api_url='https://api.twitter.com/1.1/direct_messages/destroy.json'
    payload = {'id':x}
    auth = OAuth1(consumer_key, consumer_secret, access_token_key, access_token_secret)
    r = requests.post(api_url, stream=False, auth=auth, params=payload)


while True:
  DMs = get_messages_ids()
  if DMs and len(DMs) > 0:
    print('Deleting:', DMs)
    nuke_messages(DMs)
  else:
    print('There appears that there are no more DMs', DMs)
    break

Usa solo 2 funciones, una en la que invoca primero los primeros 200 mensajes recibidos y luego los primeros 200 mensajes enviados. Tras evaluar si en realidad existen mensajes, se le pasan los IDs de los mensajes a eliminar a la segunda función y se repite este proceso hasta que no existan mas IDs a eliminar.

Tanto las llamadas de al API para saber los IDs de los mensajes enviados como las de los mensajes enviados tiene un limite así que implemente mecanismos para monitorear si se llego al limite leyendo las cabeceras de las peticiones HTTP.

Por lo pronto pueden hacer un fork de este repositorio de github En un futuro me gustaría convertirlo en una aplicación web usando flask o algo por ese estilo.


Leer más

Hace un par de semanas de forma "misteriosa" no podia ingresar al blog y varias personas me habian notificado este inconveniente y me puse a investigar que pasaba...

Lo que más me llamo la atencion a esto es que si hubieran bloqueado la ip del servidor donde estoy alojado TODOS los dominios no serian accesibles pero no era el caso, solamente mi dominio era el problema. TT__TT

Ping

``` $ ping abr4xas.org ping: unknown host abr4xas.org ```
### dig
``` $ dig abr4xas.org ; <<>> DiG 9.9.5-3-Ubuntu <<>> abr4xas.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 46967 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;abr4xas.org. IN A ;; Query time: 632 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Tue Aug 19 14:00:52 VET 2014 ;; MSG SIZE rcvd: 40 ```
### El problema: Despues de mucho leer, preguntar (gracias a todos los que me dieron una respuesta) llegue a: Las DNS de Google - 8.8.8.8 - 8.8.4.4 Como pueden ver al ejecutar: `$ host abr4xas.org 8.8.8.8` esto es lo que obtengo:
``` $ host abr4xas.org 8.8.8.8 Using domain server: Name: 8.8.8.8 Address: 8.8.8.8#53 Aliases: Host abr4xas.org not found: 2(SERVFAIL) ```
### Solución: Instale TOR en mi pc, para verificar que pasaba con mi dominio y podia entrar sin ningun problema entonces, debido a eso tome la siguiente decision: Cambiar las DNS por las de Open DNS: - 208.67.222.222 - 208.67.220.220 Y problema resuelto :D ya las personas que tenian las DNS de google cambiaron y pueden entrar sin problemas.

Leer más

El pasado fin de semana he realizado varios cambios al blog en lo que destacan:

  • Lista de correos:

MailChimp

Más de 6 millones de personas utilizan MailChimp para crear, enviar y realizar un seguimiento de boletines por correo electrónico. Si usted trabaja por cuenta propia, a gestionar proyectos para clientes, o usted trabaja para una compañía Fortune 500, MailChimp tiene características y las integraciones que se adapte a sus necesidades de marketing de correo electrónico.

Fuente: http://mailchimp.com/about/

Justificación

Porque quiero y puedo PROBLEM? xD no, en serio... Esta lista es para notificar las nuevas publicaciones que se hagan en el blog.

De seguro piensan que los lectores de feed hacen esto y si, ciertamente pero he monitoreado algunos lectores de feed y me he percatado que no son tan rapidos en actualizar y mostrar las nuevas publicaciones.

Quieres suscribirte a la lista?

Pues, en la barra lateral y al final del post hay un pequeño formulario "Subscribe to our mailing list" "Join our awesome newsletter!" coloca tu correo electronico y espera el correo de confirmación.

¡Gracias por unirte!

Sobre el feed

Otros de los cambios que hice en el blog fue relacionado con el feed, anteriormente habia hecho un post donde indicaba que habia cambiado la url del feed a feedburner pero me percate de unos problemas que no pude solventar y por eso les pido disculpas y los invito a que me agreguen a sus lectores de feed usando este enlace: http://blog.abr4xas.org/feeds/all.atom.xml o si usan feedly haciendo clic aquí.

UPDATE

Ya la url del feedburner esta funcional, realmente nunca pude descubrir que pasaba pero en fin, si es de su preferencia sigan este enlace para saber mas.

Contribuir

Si desean realizar alguna publicación en el blog los invito a leer este post. Ahí se indica claramente los pasos a realizar para contribuir :)

Gracias por leer y por la visita.

Leer más

Alt Text

Froala WYSIWYG Editor se basa en las últimas tecnologías y de acuerdo a las últimas tendencias.

Caracteristicas:

  • Cross-browser
  • Cross-platform
  • Complete Functionality
  • Autosave
  • Retina Ready
  • High Performance

Integrando Froala

Version actual: 1.1.7

Requerimientos:

  • jQuery 1.10.2 o superiror.
  • Font Awesome 4.1.0.

Con el fin de integrar froala es necesario incluir:

  • froala_editor.min.js
  • froala_editor.min.css

Eso dentro de <head> </ head>.

Un ejemplo practico de lo que debemos incluir:

``` // Include Font Awesome <link href="../css/font-awesome.min.css" rel="stylesheet" type="text/css"> // Include editor style file <link href="../css/froala_editor.min.css" rel="stylesheet" type="text/css"> // Include jQuery library <script src="http://code.jquery.com/jquery-1.10.2.js">script> // Include editor javascript file <script src="../js/froala_editor.min.js">script> ```
Y lo más importante:
``` <script> $(function(){ $('#edit').editable({inlineMode: false}) }); </script> ```
Donde va el editor? ------------------- Pues, sencillo va dentro de:
``` <section id="editor"> section> ```
Veamos este ejemplo: imaginando que tenemos un formulario para realizar una publicación y si ese form usa frolala el mismo quedaria de la siguiente forma:
``` <section id="editor"> <form action="" method="post" role="form"> <div class="form-group"> <input class="form-control" type="text" id="title" name="title" placeholder="Title..." value="Titulo"> div> <div class="form-group"> <textarea class="form-control" rows="10" placeholder="Enter text ..." id="edit" name="content"> textarea> div> <br> <button type="submit" class="btn btn-primary">Postbutton> form> section> ```
Resultado final --------------- ![Alt Text](https://raw.githubusercontent.com/abr4xas/post/master/images/ejemplofroala.png) Enlaces de interes: ------------------- - . - . Gracias a @echevemaster por recomendarme este editor :D

Leer más

Alt Text

Los submódulos en git permiten insertar uno o más repositorios externos dentro de otro repositorio. Es decir, permiten manejar uno o varios subproyectos dentro de un gran proyecto versionado con git. Esta característica puede ser útil, por ejemplo, para referenciar archivos que estén en proyectos complementarios, pero administrados por diferentes grupos o personas.

Para resumir, los submódulos en git permiten dividir o combinar un proyecto en varios repositorios separados.

Entremos a la razón de ser de este post:

Que pasa cuando estamos agregando un submodulo y obtenemos:

``` 'NombreCarpeta' already exists in the index ```
Eso nos indica que `NombreCarpeta` ya se encuentra en nuestro directorio de trabajo. Como podemos solucionar: ------------------------ Podemos hacer lo siguiente:
``` git ls-files --stage NombreCarpeta ```
Y vamos a tener una salida más o menos a esta:
``` 160000 d023657a21c1bf05d0eeaac6218eb5cca8520d16 0 NombreCarpeta ```
Entonces, para eliminar la carpeta del index hacemos:
``` git rm -r --cached NombreCarpeta ```
Y ya con esto podemos agregar nuevamente el submodulo sin problemas :D Espero les sea de ayuda :D

Leer más

Se que suena ilógico, pero si vives en Venezuela, Cuba, Iran, Argentina, China, o cualquier otro país donde sospechas que el gobierno no le agrada mucho tu libertad de expresión debes deshabilitar la verificación de dos factores y desvincular tu celular inmediatamente.

Si tienes duda de como hacerlo, aqui te dejo un video:


El problema es que pocas empresas se imaginan que van a ser de vital importancia en países donde sus ciudadanos son oprimidos y donde el estado tiene acceso a sistemas de mensajería mobil sin orden judicial ni debido proceso como el caso de Venezuela donde Mario Silva en conjunto con Juan Almeida pinchaban teléfonos a diestra y siniestra en vivo en television.

Actualmente son los mismos personajes los que están detrás de la reciente ola de robos de cuentas y lo hacen forzando el mecanismo de verificación de dos factores a que envié un código de 6 dígitos de emergencia (en caso de que pierdas tu dispositivo) al numero de celular apoderándose de tu cuenta en cuestión de segundos.

Por ultimo, recomiendo periódicamente revisar que aplicaciones haz autorizado y revocar cualquiera que ya no uses, que no reconozcas o que sospeches que tiene un comportamiento abusivo.


Modus operandi

Para propagar su ataque dependían un poco de ingeniería social, se hacían pasar por su actual víctima para afectar mas usuarios y de esta forma silenciar sus cuentas.Así operan los robacuentas del gobierno:

  1. Se apoderan de una cuenta importante de la que saben el teléfono asociado vía SMS.
  2. Desde esa cuenta envían un mensaje privado a sus próximas víctimas diciendo que tienen un notición pero prefieren compartirlo via whatsapp para lo que piden "cuenta de de whatsapp" (numero telefónico).
  3. Se mueven a la próxima cuenta y repiten el proceso.

Si tienes alguna otra sugerencia puedes dejarla en los comentarios para irla agregando a este articulo y terminar con una lista solida pero simple de como cuidarnos.

Leer más

Que necesito para un buen podcast?

Las sagradas escrituras lo definen de la siguiente forma:

"El podcasting consiste en la distribución de archivos multimedia (normalmente audio o vídeo, que puede incluir texto como subtítulos y notas) mediante un sistema de redifusión (RSS) que permite opcionalmente suscribirse y usar un programa que lo descarga para que el usuario lo escuche."

Ciertamente en la red hay muchos tutoriales que nos hablan de:

  • Gestores de podcast
  • Como crear tu propio podcast
  • Como hacer un podcast

Y ok, esta bien pero... En algún momento han pensado que también debemos contar con un hardware de calidad para realizar nuestros podcast?

Debemos tener en cuenta muchas cosas a la hora de hacer la grabación entre ellas:

  • Donde lo vamos hacer?
  • ¿Lo hacemos solo audio?
  • ¿Audio y video?

En este punto se desprende algo muy importante que es la razón de este post y es:

¿Contamos con el hardware necesario?

A través de internet se pueden conseguir muchos productos y también anuncios gratis donde podemos consegir:

  • ¿Una buena webcam?
  • ¿Un buen headset?

O si lo prefieren:

  • Un buen microfono

¿Es factible hacer un podcast?

Eso depende de la tematica a la que sea enfocado, actualmente se están creando una serie de proyectos en internet, sitios web los cuales han tenido mucho éxito haciendo podcasts.

Leer más

Bower.io

Bower, un simple y fácil gestor de paquetes para la web. Depende de Node y de NPM y funciona a través de consola, se puede instalar fácilmente así:

``` npm install -g bower ```
bower.json ---------- Los paquetes son definidos por el archivo manifiesto `bower.json` que es muy similar al `package.json` de node o al `Gemfile` de Ruby. Creando nuestro plugin/paquete ------------------------------ Necesitamos: - Una cuenta en github. - Lo que vamos a publicar. Asumiendo que cumplimos esos requisitos, y que estamos en nuestro directorio de trabajo desde consola escribimos:
``` bower init ```
Ese comando define muchas opciones para saber más sobre ellas, clic [aquí](https://github.com/bower/bower.json-spec). Ejemplo ------- Veamos un ejemplo de como seria el manifiesto `bower.json`
``` { "name": "custom.css", "version": "0.1", "main": "path/to/main.css", "ignore": [ ".jshintrc", "**/*.txt", "**/.*", "node_modules", "bower_components", "test", "tests" ], "dependencies": { "": "", "": "" }, "homepage": "", "authors": [ "name " ], "description": "Lorem Ipsum", "keywords": [ "custom", "bootstrap" ], "license": "GPL2" } ```
Registro -------- Registrar nuesto paquete/plugin permite instalarlo de la siguiente forma: `bower install `. Entonces, para registrar lo que hicimos debemos escribir en consola
``` bower register example git://github.com/user/example.git ```
donde: - example es el nombre de nuestro plugin/paquete - `git://github.com/user/example.git` debemos cambiar los valores correspondientes a nuestro usuario y repo en github Esto es todo :D Gracias por la visita!!

Leer más

Alt Text

Una alternativa al archivo functions.phpde los temas de wordpress. Realmente no es gran cosa, solo realiza las siguientes optimizaciones:

  • custom_feed_link
  • oembed_slideshare
  • Custom_social_fields
  • remove_footer_admin
  • Canonical_Permalinks
  • Twitter_oEmbed
  • Opengraph for posts

Actualmente estoy preparando una nueva versión... Va a incluir unas mejoras interesantes :)

Caracteristicas

Descarga

Para la descarga clic aquí o lo pueden buscar usando el buscador de plugin en su panel de administración de WordPress

Instalación

  1. Subir refu-regulatory-functions/ al directorio /wp-content/plugins/
  2. Activar el plugin usando la opción Plugins en el menu de administración.

Repo

El plugin cuenta con un repo en github, si desean ayudar pues, clic aquí :D

Leer más