#!/usr/bin/env python """ Export twitter friends. If you want to use the foaf export you need to set your username/password and install the rdflib libraries. """ VERSION="0.1" import logging #logging.basicConfig(format="%(levelname)-8s %(message)s", level=logging.DEBUG) import sys import twitter import simplejson # TODO Set your Username and Password if you want to use protected API #api = twitter.Api(username="", password="") api = twitter.Api() def getAllFriends(user): page = 1 all_data = [] while True: logging.info("get Data User %s Page %s" %(user, page)) url = 'http://twitter.com/statuses/friends/%s.json?page=%s' % (user, page) json = api._FetchUrl(url) data = simplejson.loads(json) all_data += data if len(data) < 95: #We are done" break page += 1 return all_data def getUser(user): url = "http://twitter.com/statuses/user_timeline/%s.json" %user json = api._FetchUrl(url) return simplejson.loads(json)[0]["user"] def makeNode(graph, FOAF, user): from rdflib.Graph import ConjunctiveGraph as Graph from rdflib import Namespace, Literal, BNode, RDF, URIRef node = BNode() graph.add((node, FOAF['nick'], Literal(user["screen_name"]))) graph.add((node, FOAF['name'], Literal(user["name"]))) graph.add((node, FOAF['img'], Namespace(user["profile_image_url"]))) url = user["url"] or "http://twitter.com/"+user["screen_name"] graph.add((node, FOAF['homepage'], Literal(url))) graph.add((node, RDF.type, FOAF['Person'])) return node def makeFOAF(user, friends): from rdflib.Graph import ConjunctiveGraph as Graph from rdflib import Namespace, Literal, BNode, RDF, URIRef graph = Graph() FOAF = Namespace("http://xmlns.com/foaf/0.1/") RDFS = Namespace("http://www.w3.org/2000/01/rdf-schema#") # bind the namespaces graph.bind('foaf', FOAF) graph.bind('rdfs', RDFS) person = makeNode(graph, FOAF, user) for f in friends: knows = makeNode(graph, FOAF, f) graph.add((person, FOAF['knows'], knows)) return graph.serialize(format="pretty-xml") def main(argv=None): if argv is None: argv = sys.argv from optparse import OptionParser usage = """usage: %prog [options] USERNAME\n\n\tGet all friends from twitter for USERNAME""" parser = OptionParser(usage=usage) parser.add_option("-f", "--file", dest="filename", help="write output to FILE", metavar="FILE") parser.add_option("-t", "--type", default="simple", dest="type", help="Output type simple or foaf [default: %default]") parser.add_option("-u", "--username", dest="username", help="your twitte username", metavar="USERNAME") parser.add_option("-p", "--password", dest="password", help="your twitter password", metavar="PASSWORD") (options, arg) = parser.parse_args(argv) if len(arg) != 2: parser.error("need an username") if options.type == "simple": friends = getAllFriends(arg[1]) txt = "\n".join((x["screen_name"] for x in friends)) elif options.type == "foaf": global api api = twitter.Api(username=options.username, password=options.password) user = getUser(arg[1]) friends = getAllFriends(arg[1]) txt = makeFOAF(user, friends) if options.filename: open(options.filename, "w").write(txt) else: print txt if __name__ == "__main__": main()