]>
jfr.im git - z_archive/twitter.git/blob - twitter/api.py
4 from exceptions
import Exception
6 from twitter
.twitter_globals
import POST_ACTIONS
7 from twitter
.auth
import UserPassAuth
, NoAuth
11 return sys
.hexversion
> 0x20600f0
16 import simplejson
as json
18 class TwitterError(Exception):
20 Exception thrown by the Twitter object when there is an
21 error interacting with twitter.com.
25 class TwitterCall(object):
27 self
, auth
, format
, domain
, uri
="", agent
=None,
28 encoded_args
=None, secure
=True):
34 self
.encoded_args
= encoded_args
37 def __getattr__(self
, k
):
39 return object.__getattr
__(self
, k
)
40 except AttributeError:
42 self
.auth
, self
.format
, self
.domain
,
43 self
.uri
+ "/" + k
, self
.agent
, self
.encoded_args
, self
.secure
)
45 def __call__(self
, **kwargs
):
46 uri
= self
.uri
.strip("/")
48 for action
in POST_ACTIONS
:
49 if self
.uri
.endswith(action
):
52 kwargs
["source"] = self
.agent
61 uriBase
= "http%s://%s/%s%s%s" %(
62 secure_str
, self
.domain
, uri
, dot
, self
.format
)
64 if (not self
.encoded_args
):
65 if kwargs
.has_key('id'):
66 uri
+= "/%s" %(kwargs
['id'])
68 self
.encoded_args
= self
.auth
.encode_params(uriBase
, method
, kwargs
)
74 argStr
= "?%s" %(self
.encoded_args
)
76 argData
= self
.encoded_args
80 headers
["X-Twitter-Client"] = self
.agent
81 if self
.auth
is not None:
82 headers
.update(self
.auth
.generate_headers())
84 req
= urllib2
.Request(uriBase
+argStr
, argData
, headers
)
87 handle
= urllib2
.urlopen(req
)
88 if "json" == self
.format
:
89 return json
.loads(handle
.read())
92 except urllib2
.HTTPError
, e
:
97 "Twitter sent status %i for URL: %s.%s using parameters: (%s)\ndetails: %s" %(
98 e
.code
, uri
, self
.format
, self
.encoded_args
, e
.fp
.read()))
100 class Twitter(TwitterCall
):
102 The minimalist yet fully featured Twitter API class.
104 Get RESTful data by accessing members of this class. The result
105 is decoded python objects (lists and dicts).
107 The Twitter API is documented here:
109 http://apiwiki.twitter.com/
110 http://groups.google.com/group/twitter-development-talk/web/api-documentation
114 twitter = Twitter("hello@foo.com", "password123")
116 # Get the public timeline
117 twitter.statuses.public_timeline()
119 # Get a particular friend's timeline
120 twitter.statuses.friends_timeline(id="billybob")
122 # Also supported (but totally weird)
123 twitter.statuses.friends_timeline.billybob()
125 # Send a direct message
126 twitter.direct_messages.new(
128 text="I think yer swell!")
132 twitter_search = Twitter(domain="search.twitter.com")
134 # Find the latest search trends
135 twitter_search.trends()
137 # Search for the latest News on #gaza
138 twitter_search.search(q="#gaza")
140 Using the data returned::
142 Twitter API calls return decoded JSON. This is converted into
143 a bunch of Python lists, dicts, ints, and strings. For example,
145 x = twitter.statuses.public_timeline()
147 # The first 'tweet' in the timeline
150 # The screen name of the user who wrote the first 'tweet'
151 x[0]['user']['screen_name']
153 Getting raw XML data::
155 If you prefer to get your Twitter data in XML format, pass
156 format="xml" to the Twitter object when you instantiate it:
158 twitter = Twitter(format="xml")
160 The output will not be parsed in any way. It will be a raw string
164 self
, email
=None, password
=None, format
="json", domain
="twitter.com",
165 agent
=None, secure
=True, auth
=None):
167 Create a new twitter API connector using the specified
168 credentials (email and password). Format specifies the output
169 format ("json" (default) or "xml").
172 if email
is not None or password
is not None:
174 raise ValueError, "can't specify 'email' or 'password' and 'auth' params"
175 auth
= UserPassAuth(email
, password
)
180 if (format
not in ("json", "xml", "")):
181 raise TwitterError("Unknown data format '%s'" %(format))
182 TwitterCall
.__init
__(
183 self
, auth
, format
, domain
, "", agent
,
186 __all__
= ["Twitter", "TwitterError"]