views:

44

answers:

1

I'm heavily basing my code off of this excellent tutorial at Ars Technica, so I am able to track my own new followers because my login information is hard-coded in. However, I'd like to track new followers of other people's accounts too. How can I do this without their passwords?

import pycurl, json, StringIO
STREAM_URL = "http://stream.twitter.com/1/statuses/filter.json?follow=[userid1],[userid2]&track=[keyword1],[keyword2]"
REST_URL = "http://api.twitter.com/1/"

class Client:
    def __init__(self):
        self.friends = []
        self.buffer = ""
        self.userid = None
        self.conn = pycurl.Curl()

    def authenticate(self, username, password):
        output = StringIO.StringIO()
        self.conn.setopt(pycurl.USERPWD, "%s:%s" % (username, password))
        self.conn.setopt(pycurl.URL, REST_URL + "account/verify_credentials.json")
        self.conn.setopt(pycurl.WRITEFUNCTION, output.write)
        self.conn.perform()

    data = json.loads(output.getvalue())
    if "error" in data: return False
    self.userid = data["id"]
    return True

    def connect(self):
        self.conn.setopt(pycurl.URL, STREAM_URL)
        self.conn.setopt(pycurl.WRITEFUNCTION, self.on_receive)
        self.conn.perform()

    def on_receive(self, data):
        self.buffer += data
        if data.endswith("\r\n") and self.buffer.strip():
            content = json.loads(self.buffer)
            self.buffer = ""
            print content

        if "friends" in content:
            self.friends = content["friends"]

        elif "event" in content and content["event"] == "follow":  
            id_list = ['[userid1]','[userid2]']
            print "NEW FOLLOWER!!"
            print "target id:", content["target"]["id"]
            if content["target"]["id"] in id_list:  
                print content
                print "New follower:", content["source"]["name"], "(@" + content["source"]["screen_name"] + ")"  
            elif content["source"]["id"] == self.userid:  
                self.friends.append(content["target"]["id"])

        elif "text" in content:
            to = content["in_reply_to_user_id"]
            if to and to != self.userid and to not in self.friends: return
            if to == self.userid: print "(REPLY)",
            print u"{0[user][name]}: {0[text]}".format(content)

client = Client()  
if client.authenticate("[username]", "[password]"):  
    client.connect()  
else:  
    print "Login credentials aren't valid!"  
+1  A: 

Taylor Singletary of Twitter responded to the same question on the Google group for Twitter Development Talk:

This is unfortunately not currently possible with the Streaming API. Given the flexibility of followers/ids and friends/ids API methods, tracking changes over time with those methods would likely be your best avenue.