]>
jfr.im git - z_archive/twitter.git/blob - twitter/api.py
3 from exceptions
import Exception
5 from twitter
.twitter_globals
import POST_ACTIONS
6 from twitter
.auth
import UserPassAuth
, NoAuth
10 return sys
.hexversion
> 0x20600f0
15 import simplejson
as json
17 class TwitterError(Exception):
19 Base Exception thrown by the Twitter object when there is a
20 general error interacting with the API.
24 class TwitterHTTPError(TwitterError
):
26 Exception thrown by the Twitter object when there is an
27 HTTP error interacting with twitter.com.
29 def __init__(self
, e
, uri
, format
, uriparts
):
33 self
.uriparts
= uriparts
37 "Twitter sent status %i for URL: %s.%s using parameters: "
38 "(%s)\ndetails: %s" %(
39 self
.e
.code
, self
.uri
, self
.format
, self
.uriparts
,
42 class TwitterCall(object):
44 self
, auth
, format
, domain
, uri
="", agent
=None,
45 uriparts
=None, secure
=True):
51 self
.uriparts
= uriparts
54 def __getattr__(self
, k
):
56 return object.__getattr
__(self
, k
)
57 except AttributeError:
59 auth
=self
.auth
, format
=self
.format
, domain
=self
.domain
,
60 agent
=self
.agent
, uriparts
=self
.uriparts
+ (k
,),
63 def __call__(self
, **kwargs
):
66 for uripart
in self
.uriparts
:
67 #if this part matches a keyword argument, use the supplied value
68 #otherwise, just use the part
69 uriparts
.append(kwargs
.pop(uripart
,uripart
))
70 uri
= '/'.join(uriparts
)
73 for action
in POST_ACTIONS
:
74 if uri
.endswith(action
):
77 kwargs
["source"] = self
.agent
80 """This handles a special case. It isn't really needed anymore because now
81 we can insert an id value (or any other value) at the end of the
82 uri (or anywhere else).
83 However we can leave it for backward compatibility."""
84 id = kwargs
.pop('id', None)
94 uriBase
= "http%s://%s/%s%s%s" %(
95 secure_str
, self
.domain
, uri
, dot
, self
.format
)
99 headers
["X-Twitter-Client"] = self
.agent
101 headers
.update(self
.auth
.generate_headers())
102 arg_data
= self
.auth
.encode_params(uriBase
, method
, kwargs
)
104 uriBase
+= '?' + arg_data
109 req
= urllib2
.Request(uriBase
, body
, headers
)
112 handle
= urllib2
.urlopen(req
)
113 if "json" == self
.format
:
114 return json
.loads(handle
.read())
117 except urllib2
.HTTPError
, e
:
121 raise TwitterHTTPError(e
, uriBase
, self
.format
, self
.uriparts
)
123 class Twitter(TwitterCall
):
125 The minimalist yet fully featured Twitter API class.
127 Get RESTful data by accessing members of this class. The result
128 is decoded python objects (lists and dicts).
130 The Twitter API is documented here:
132 http://apiwiki.twitter.com/
133 http://groups.google.com/group/twitter-development-talk/web/api-documentation
138 auth=OAuth(token, token_key, con_secret, con_secret_key)))
140 # Get the public timeline
141 twitter.statuses.public_timeline()
143 # Get a particular friend's timeline
144 twitter.statuses.friends_timeline(id="billybob")
146 # Also supported (but totally weird)
147 twitter.statuses.friends_timeline.billybob()
149 # Send a direct message
150 twitter.direct_messages.new(
152 text="I think yer swell!")
154 # Get the members of a particular list of a particular friend
155 twitter.user.listname.members(user="billybob", listname="billysbuds")
160 twitter_search = Twitter(domain="search.twitter.com")
162 # Find the latest search trends
163 twitter_search.trends()
165 # Search for the latest News on #gaza
166 twitter_search.search(q="#gaza")
169 Using the data returned
170 -----------------------
172 Twitter API calls return decoded JSON. This is converted into
173 a bunch of Python lists, dicts, ints, and strings. For example::
175 x = twitter.statuses.public_timeline()
177 # The first 'tweet' in the timeline
180 # The screen name of the user who wrote the first 'tweet'
181 x[0]['user']['screen_name']
187 If you prefer to get your Twitter data in XML format, pass
188 format="xml" to the Twitter object when you instantiate it::
190 twitter = Twitter(format="xml")
192 The output will not be parsed in any way. It will be a raw string
197 self
, email
=None, password
=None, format
="json",
198 domain
="twitter.com", agent
=None, secure
=True, auth
=None,
201 Create a new twitter API connector.
203 Pass an `auth` parameter to use the credentials of a specific
204 user. Generally you'll want to pass an `OAuth`
207 twitter = Twitter(auth=OAuth(
208 token, token_secret, consumer_key, consumer_secret))
211 Alternately you can pass `email` and `password` parameters but
212 this authentication mode will be deactive by Twitter very soon
213 and is not recommended::
215 twitter = Twitter(email="blah@blah.com", password="foobar")
218 `domain` lets you change the domain you are connecting. By
219 default it's twitter.com but `search.twitter.com` may be
222 If `secure` is False you will connect with HTTP instead of
225 The value of `agent` is sent in the `X-Twitter-Client`
226 header. This is deprecated. Instead Twitter determines the
227 application using the OAuth Client Key and Client Key Secret
230 `api_version` is used to set the base uri. By default it's
231 nothing, but if you set it to '1' your URI will start with
234 if email
is not None or password
is not None:
237 "Can't specify 'email'/'password' and 'auth' params"
239 auth
= UserPassAuth(email
, password
)
244 if (format
not in ("json", "xml", "")):
245 raise ValueError("Unknown data format '%s'" %(format))
249 uriparts
+= (str(api_version
),)
251 TwitterCall
.__init
__(
252 self
, auth
=auth
, format
=format
, domain
=domain
, agent
=agent
,
253 secure
=secure
, uriparts
=uriparts
)
256 __all__
= ["Twitter", "TwitterError", "TwitterHTTPError"]