Tag Archive for 'twitter'

Identificando posibles “drops” de usuarios de Twitter, con Python

Hace un par de días se supo que Twitter liberará aquellos nombres de usuario que no hayan registrado actividad durante 6 meses o más.

Les dejo una herramienta para obtener los días de inactividad de un usuario a través de su último status publicado. Esta clase puede ser utilizada, por ejemplo, para recorrer listados de palabras en búsqueda de nombres valiosos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import twitter
import sys
import urllib2
from datetime import datetime
 
class UnknownUser(Exception):
    pass
 
class UnknownStatus(Exception):
    pass
 
class TwitterExpire(object):
    def __init__(self):
        self.__t = twitter.Api()
 
    def verify(self, username):
        try:
            user = self.__t.GetUser(user=username)
        except urllib2.HTTPError:
            raise UnknownUser
        else:
            status = user.GetStatus()
            if status:
                timestamp = status.GetCreatedAtInSeconds()
                d = datetime.fromtimestamp(timestamp)
                td = datetime.now() - d
                return td
            else:
                raise UnknownStatus
 
def main(username):
    te = TwitterExpire()
    try:
        result = te.verify(username)
    except UnknownUser:
        print u"User '%s' doesn't exist" % username
    except UnknownStatus:
        print u"Couldn't find any status for '%s'" % username
    else:
        print result
 
if __name__ == '__main__':
    if len(sys.argv) >= 2:
        main(username=sys.argv[1])

Algunos resultados:

mahadeva@blue:~$ python2.5 last_status.py patito
258 days, 11:16:49.425212
mahadeva@blue:~$ python2.5 last_status.py patricio
Couldn't find any status for 'patricio'
mahadeva@blue:~$ python2.5 last_status.py usuarioinexistente
User 'usuarioinexistente' doesn't exist
mahadeva@blue:~$ python2.5 last_status.py shitmydadsays
1 day, 22:35:44.434214

Mostrando búsquedas de Twitter en una página web con jQuery

El programa consta de dos partes: el contenedor de resultados y el script.

Contenedor de resultados

Se trata del elemento HTML donde se mostrarán los resultados de una búsqueda. Los términos de búsqueda se establecen en el atributo title.

Por ejemplo, si quisiéramos mostrar los resultados del tag #obama:

1
<div class="twitter_search" title="#obama"></div>

Podés crear todos los contenedores que quieras en la misma página, en el lugar que desees:

1
2
<div class="twitter_search" title="#python"></div>
<div class="twitter_search" title="#jquery"></div>

El script

Son las instrucciones JavaScript del programa que se encargará de todo el trabajo: obtendrá los términos de búsqueda, solicitará los resultados a través de la API de Twitter y mostrará los resultados en el navegador.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Number of tweets to show for each column
const MAX_RESULTS= 20;
function twitter_search() {
	var url = 'http://search.twitter.com/search.json?callback=?';
	// Iterating over the different search columns
	$('.twitter_search').each(function() {
		var container = $(this);
		// Search terms are specified in the 'title' attribute
		var search = container.attr('title');
		if (search) {
			// Showing column title
			if (container.siblings('h1').length == 0) {
				container.parent().prepend('<h1>' + search + '</h1>');
			}
			var since_id = 0;
			if (container.children().length) {
				// Retrieve results since this id
				since_id = container.children(':first').attr('id').replace('#', '');
			}
			// Request the results
			$.getJSON(url, {'q': search, 'since_id': since_id}, function(data) {
				// Processing those results, if any
				if (data.results.length) {
					for (i in data.results.reverse()) {
						var r = data.results[i];
						// Creating the result container
						var div = $('<div id="#' + r.id + '"></div>');
						// Don't show this element now
						div.hide();
						// Adding some styles through .twitter_result
						div.addClass('twitter_result');
						// Adding user's image
						div.append('<img src="' + r.profile_image_url + '" alt="' + r.from_user + '" />');
						// Adding username
						div.append('<a href="http://twitter.com/' + r.from_user + '">' + r.from_user + '</a>');
						// Adding tweet
						div.append('<span>' + r.text + '</span>');
						// Adding corners
						div.corner();
						// Adding this result to the main container
						container.prepend(div);
						// Effect
						div.slideDown('slow');
					}
				}
				// Removing old tweets
				if (container.children().length > MAX_RESULTS) {
					// Negative index
					to_remove = MAX_RESULTS - container.children().length
					container.children().slice(to_remove).each(function() {
						$(this).slideUp();
					});
				}
			});
		}
	});
};
 
$(document).ready(function() {
	// Initial search 
	twitter_search();
	// Refresh the results every 5 seconds
	setInterval("twitter_search();", 5000);
});

Acá pueden ver una demostración funcional del script: Twitter Search + jQuery (actualizado marzo de 2010).

Aclaraciones de la demo:

  • Casi no hay consumo de bandwidth de nuestro servidor, porque estoy usando jQuery 1.3.2 desde Google y es el navegador del usuario quien se encarga de hacer el request de búsqueda a la API de Twitter
  • En la demo los resultados se actualizan automáticamente cada 5 segundos (setInterval("twitter_search();", 5000))
  • Sigo una estructura FIFO (gracias al parámetro since_id de la API). Esto significa que iré agregando nuevos resultados en la cabecera mientras remuevo los más antiguos
  • La demo es XHTML 1.0 Transitional

Consultando Crunchbase con Python

Por mi trabajo, siempre estoy pendiente de lo que sucede en Crunchbase (de hecho, estoy suscripto a su feed de páginas recientes). Con tantas empresas y personas yendo y viniendo por Twitter, se transformó en una fuente de consulta permanente.

¿Puedo consultar Crunchbase con Python? La respuesta es obvia :-)

Crunchbase tiene una API muy interesante que devuelve resultados en formato JSON. Pueden encontrar documentación sobre su uso en en crunchbase-api.

Para este programa estoy usando la librería simplejson (sudo apt-get install python-simplejson)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import sys, urllib, simplejson
 
api = 'http://api.crunchbase.com/v/1/search.js?%s'
 
def main():
    if len(sys.argv) >= 2:
        q = ' '.join(sys.argv[1:])
        source = urllib.urlopen(api % urllib.urlencode({'query': q}))
        results = simplejson.loads(source.read())
        if results['results']:
            for r in results['results']:
                name = r.get('name')
                if not name:
                    name = ' '.join([w.capitalize() \
                        for w in r['permalink'].split('-')])
                print '%s (%s): %s' % (
                    name.strip(),
                    r['namespace'].capitalize(),
                    r['crunchbase_url'],
                )       
        else:
            print 'No results for "%s"' % q
    else:
        print 'Usage: python %s <keyword(s)>' % sys.argv[0]
 
if __name__ == '__main__':
    main()

Aquí tienen algunos resultados:

mahadeva@blue:~$ python crunchbase.py
Usage: python crunchbase.py
mahadeva@blue:~$ python crunchbase.py popego
Popego (Company): http://www.crunchbase.com/company/popego
Santiago Siri (Person): http://www.crunchbase.com/person/santiago-siri

El programa en sí no es muy cómodo de usar (para eso existen los add-ons de de Firefox ;-) ), pero es un buen punto de partida para utilizar, por ejemplo, como una aplicación de Django, o un bot que interactúe con Twitter.

Buscador para Twitter, con Python, en 12 líneas

Hoy estuve viendo los resultados de la búsqueda #pyconar2009 en Twitter Search, y me dije: “por qué no hacer las búsquedas desde consola, con Python?”

Unos minutos después, aquí está el resultado:

1
2
3
4
5
6
7
8
9
10
11
12
import feedparser, urllib
 
def main():
    feed_source = 'http://search.twitter.com/search.atom?%s'
    q = raw_input('Search term: ')
    if q:
        f = feedparser.parse(feed_source % urllib.urlencode({'q': q}))
        for entry in f.entries:
            print '%s: "%s"' % (entry.author, entry.title) 
 
if __name__ == '__main__':
    main()

En este caso usé Universal Feed Parser ($ sudo apt-get install python-feedparser), pero pueden utilizar la librería que más les guste :-)




This work by Patricio Molina is licensed under a Creative Commons Attribution-ShareAlike 2.5 Argentina.