]> jfr.im git - z_archive/twitter.git/blame - README
If invalid values are passed for secrets, raise an exception with a helpful error...
[z_archive/twitter.git] / README
CommitLineData
fdbae010 1Python Twitter Tools
a65893e4 2====================
fdbae010 3
bcd1bc9c 4[![Build Status](https://travis-ci.org/sixohsix/twitter.svg)](https://travis-ci.org/sixohsix/twitter) [![Coverage Status](https://coveralls.io/repos/sixohsix/twitter/badge.png?branch=master)](https://coveralls.io/r/sixohsix/twitter?branch=master)
9ae71d46 5
f1a8ed67 6The Minimalist Twitter API for Python is a Python API for Twitter,
7everyone's favorite Web 2.0 Facebook-style status updater for people
8on the go.
fdbae010 9
f1a8ed67 10Also included is a twitter command-line tool for getting your friends'
11tweets and setting your own tweet from the safety and security of your
5b8b1ead 12favorite shell and an IRC bot that can announce Twitter updates to an
f1a8ed67 13IRC channel.
fdbae010 14
5f47b302 15For more information, after installing the `twitter` package:
fdbae010 16
17 * import the `twitter` package and run help() on it
18 * run `twitter -h` for command-line tool help
a65893e4 19
51e0b8f1
MV
20
21twitter - The Command-Line Tool
22-------------------------------
a65893e4 23
30913a4e 24The command-line tool lets you do some awesome things:
a65893e4 25
30913a4e 26 * view your tweets, recent replies, and tweets in lists
a65893e4
MV
27 * view the public timeline
28 * follow and unfollow (leave) friends
29 * various output formats for tweet information
51e0b8f1 30
a65893e4
MV
31The bottom line: type `twitter`, receive tweets.
32
33
34
51e0b8f1
MV
35twitterbot - The IRC Bot
36------------------------
a65893e4
MV
37
38The IRC bot is associated with a twitter account (either your own account or an
39account you create for the bot). The bot announces all tweets from friends
40it is following. It can be made to follow or leave friends through IRC /msg
41commands.
42
5f47b302 43
5f47b302 44twitter-log
51e0b8f1 45-----------
5f47b302
MV
46
47`twitter-log` is a simple command-line tool that dumps all public
48tweets from a given user in a simple text format. It is useful to get
49a complete offsite backup of all your tweets. Run `twitter-log` and
50read the instructions.
51
30913a4e
MV
52twitter-archiver and twitter-follow
53-----------------------------------
54
55twitter-archiver will log all the tweets posted by any user since they
56started posting. twitter-follow will print a list of all of all the
57followers of a user (or all the users that user follows).
58
5f47b302 59
51e0b8f1
MV
60Programming with the Twitter api classes
61========================================
62
51e0b8f1
MV
63The Twitter and TwitterStream classes are the key to building your own
64Twitter-enabled applications.
65
66
67The Twitter class
68-----------------
69
70The minimalist yet fully featured Twitter API class.
71
72Get RESTful data by accessing members of this class. The result
73is decoded python objects (lists and dicts).
74
75The Twitter API is documented at:
76
76bb7360 77**[https://dev.twitter.com/overview/documentation](https://dev.twitter.com/overview/documentation)**
51e0b8f1 78
d4f3123e 79Examples:
bcbd4e2b 80```python
814d84f5 81from twitter import *
51e0b8f1 82
814d84f5 83t = Twitter(
bdad9dd1 84 auth=OAuth(token, token_key, con_secret, con_secret_key))
51e0b8f1 85
814d84f5
MG
86# Get your "home" timeline
87t.statuses.home_timeline()
51e0b8f1 88
814d84f5 89# Get a particular friend's timeline
aaf199d3 90t.statuses.user_timeline(screen_name="billybob")
51e0b8f1 91
ae2bf888
HN
92# to pass in GET/POST parameters, such as `count`
93t.statuses.home_timeline(count=5)
94
95# to pass in the GET/POST parameter `id` you need to use `_id`
96t.statuses.oembed(_id=1234567890)
97
814d84f5
MG
98# Update your status
99t.statuses.update(
100 status="Using @sixohsix's sweet Python Twitter Tools.")
51e0b8f1 101
814d84f5
MG
102# Send a direct message
103t.direct_messages.new(
104 user="billybob",
105 text="I think yer swell!")
d09c0dd3 106
814d84f5 107# Get the members of tamtar's list "Things That Are Rad"
fec0468d 108t.lists.members(owner_screen_name="tamtar", slug="things-that-are-rad")
a5aab114 109
814d84f5 110# An *optional* `_timeout` parameter can also be used for API
d4f3123e
MV
111# calls which take much more time than normal or twitter stops
112# responding for some reason:
113t.users.lookup(
114 screen_name=','.join(A_LIST_OF_100_SCREEN_NAMES), _timeout=1)
51e0b8f1 115
ae2bf888
HN
116# Overriding Method: GET/POST
117# you should not need to use this method as this library properly
118# detects whether GET or POST should be used, Nevertheless
119# to force a particular method, use `_method`
120t.statuses.oembed(_id=1234567890, _method='GET')
5a412b39
R
121
122# Send a tweet with an image included (or set your banner or logo similarily)
d4f3123e 123# by just reading your image from the web or a file in a string:
5702c7b9 124status = "PTT ★"
5a412b39 125with open("example.png", "rb") as imagefile:
880418b2 126 params = {"media[]": imagefile.read(), "status": status}
5a412b39 127t.statuses.update_with_media(**params)
d4f3123e
MV
128
129# Or by sending a base64 encoded image:
880418b2 130params = {"media[]": base64_image, "status": status, "_base64": True}
5a412b39 131t.statuses.update_with_media(**params)
ae2bf888 132```
51e0b8f1 133
d4f3123e
MV
134Searching Twitter:
135```python
814d84f5
MG
136# Search for the latest tweets about #pycon
137t.search.tweets(q="#pycon")
138```
51e0b8f1 139
16c4e7d4
BB
140
141Retrying after reaching the API rate limit
142------------------------------------------
143
144Simply create the `Twitter` instance with the argument `retry=True`, then the
145HTTP error codes 429, 502, 503 and 504 will cause a retry of the last request.
73a242d6 146If retry is an integer, it defines the number of retries attempted.
16c4e7d4
BB
147
148
51e0b8f1
MV
149Using the data returned
150-----------------------
151
152Twitter API calls return decoded JSON. This is converted into
d4f3123e 153a bunch of Python lists, dicts, ints, and strings. For example:
51e0b8f1 154
814d84f5
MG
155```python
156x = twitter.statuses.home_timeline()
51e0b8f1 157
814d84f5
MG
158# The first 'tweet' in the timeline
159x[0]
51e0b8f1 160
814d84f5
MG
161# The screen name of the user who wrote the first 'tweet'
162x[0]['user']['screen_name']
163```
51e0b8f1
MV
164
165Getting raw XML data
166--------------------
167
168If you prefer to get your Twitter data in XML format, pass
d4f3123e 169format="xml" to the Twitter object when you instantiate it:
51e0b8f1 170
814d84f5
MG
171```python
172twitter = Twitter(format="xml")
173```
51e0b8f1
MV
174
175The output will not be parsed in any way. It will be a raw string
176of XML.
177
178
179The TwitterStream class
180-----------------------
181
d4f3123e
MV
182The TwitterStream object is an interface to the Twitter Stream
183API. This can be used pretty much the same as the Twitter class
184except the result of calling a method will be an iterator that
185yields objects decoded from the stream. For example::
51e0b8f1 186
814d84f5 187```python
d4f3123e 188twitter_stream = TwitterStream(auth=OAuth(...))
814d84f5 189iterator = twitter_stream.statuses.sample()
51e0b8f1 190
814d84f5 191for tweet in iterator:
d4f3123e 192 ...do something with this tweet...
814d84f5 193```
51e0b8f1 194
84e6e1e4 195Per default the ``TwitterStream`` object uses
196[public streams](https://dev.twitter.com/docs/streaming-apis/streams/public).
197If you want to use one of the other
198[streaming APIs](https://dev.twitter.com/docs/streaming-apis), specify the URL
199manually:
200
201- [Public streams](https://dev.twitter.com/docs/streaming-apis/streams/public): stream.twitter.com
202- [User streams](https://dev.twitter.com/docs/streaming-apis/streams/user): userstream.twitter.com
203- [Site streams](https://dev.twitter.com/docs/streaming-apis/streams/site): sitestream.twitter.com
204
205Note that you require the proper
206[permissions](https://dev.twitter.com/docs/application-permission-model) to
207access these streams. E.g. for direct messages your
208[application](https://dev.twitter.com/apps) needs the "Read, Write & Direct
209Messages" permission.
210
9ae71d46 211The following example demonstrates how to retrieve all new direct messages
84e6e1e4 212from the user stream:
213
214```python
215auth = OAuth(
216 consumer_key='[your consumer key]',
217 consumer_secret='[your consumer secret]',
218 token='[your token]',
219 token_secret='[your token secret]'
220)
221twitter_userstream = TwitterStream(auth=auth, domain='userstream.twitter.com')
222for msg in twitter_userstream.user():
223 if 'direct_message' in msg:
224 print msg['direct_message']['text']
225```
226
d4f3123e
MV
227The iterator will yield until the TCP connection breaks. When the
228connection breaks, the iterator yields `{'hangup': True}`, and
229raises `StopIteration` if iterated again.
230
231Similarly, if the stream does not produce heartbeats for more than
23290 seconds, the iterator yields `{'hangup': True,
233'heartbeat_timeout': True}`, and raises `StopIteration` if
234iterated again.
235
236The `timeout` parameter controls the maximum time between
237yields. If it is nonzero, then the iterator will yield either
238stream data or `{'timeout': True}` within the timeout period. This
239is useful if you want your program to do other stuff in between
240waiting for tweets.
241
242The `block` parameter sets the stream to be fully non-blocking. In
243this mode, the iterator always yields immediately. It returns
244stream data, or `None`. Note that `timeout` supercedes this
925431e9
O
245argument, so it should also be set `None` to use this mode,
246and non-blocking can potentially lead to 100% CPU usage.
d4f3123e 247
51e0b8f1
MV
248Twitter Response Objects
249------------------------
250
d4f3123e 251Response from a twitter request. Behaves like a list or a string
51e0b8f1
MV
252(depending on requested format) but it has a few other interesting
253attributes.
254
255`headers` gives you access to the response headers as an
256httplib.HTTPHeaders instance. You can do
d4f3123e 257`response.headers.get('h')` to retrieve a header.
51e0b8f1
MV
258
259Authentication
260--------------
261
262You can authenticate with Twitter in three ways: NoAuth, OAuth, or
d4f3123e 263OAuth2 (app-only). Get help() on these classes to learn how to use them.
51e0b8f1 264
d4f3123e 265OAuth and OAuth2 are probably the most useful.
51e0b8f1
MV
266
267
268Working with OAuth
269------------------
270
271Visit the Twitter developer page and create a new application:
272
5d5d68cc 273**[https://dev.twitter.com/apps/new](https://dev.twitter.com/apps/new)**
51e0b8f1
MV
274
275This will get you a CONSUMER_KEY and CONSUMER_SECRET.
276
277When users run your application they have to authenticate your app
d4f3123e 278with their Twitter account. A few HTTP calls to twitter are required
51e0b8f1
MV
279to do this. Please see the twitter.oauth_dance module to see how this
280is done. If you are making a command-line app, you can use the
281oauth_dance() function directly.
282
d4f3123e 283Performing the "oauth dance" gets you an ouath token and oauth secret
51e0b8f1
MV
284that authenticate the user with Twitter. You should save these for
285later so that the user doesn't have to do the oauth dance again.
286
287read_token_file and write_token_file are utility methods to read and
288write OAuth token and secret key values. The values are stored as
289strings in the file. Not terribly exciting.
290
291Finally, you can use the OAuth authenticator to connect to Twitter. In
d4f3123e 292code it all goes like this:
51e0b8f1 293
814d84f5
MG
294```python
295from twitter import *
51e0b8f1 296
814d84f5
MG
297MY_TWITTER_CREDS = os.path.expanduser('~/.my_app_credentials')
298if not os.path.exists(MY_TWITTER_CREDS):
299 oauth_dance("My App Name", CONSUMER_KEY, CONSUMER_SECRET,
300 MY_TWITTER_CREDS)
51e0b8f1 301
814d84f5 302oauth_token, oauth_secret = read_token_file(MY_TWITTER_CREDS)
51e0b8f1 303
814d84f5 304twitter = Twitter(auth=OAuth(
d4f3123e 305 oauth_token, oauth_token_secret, CONSUMER_KEY, CONSUMER_SECRET))
51e0b8f1 306
814d84f5 307# Now work with Twitter
04e76c4d 308twitter.statuses.update(status='Hello, world!')
814d84f5 309```
51e0b8f1 310
d4f3123e
MV
311Working with OAuth2
312-------------------
313
314Twitter only supports the application-only flow of OAuth2 for certain
315API endpoints. This OAuth2 authenticator only supports the application-only
316flow right now.
317
318To authenticate with OAuth2, visit the Twitter developer page and create a new
319application:
320
321**[https://dev.twitter.com/apps/new](https://dev.twitter.com/apps/new)**
322
323This will get you a CONSUMER_KEY and CONSUMER_SECRET.
324
325Exchange your CONSUMER_KEY and CONSUMER_SECRET for a bearer token using the
326oauth2_dance function.
327
328Finally, you can use the OAuth2 authenticator and your bearer token to connect
329to Twitter. In code it goes like this::
330
331```python
332twitter = Twitter(auth=OAuth2(bearer_token=BEARER_TOKEN))
333
334# Now work with Twitter
335twitter.search.tweets(q='keyword')
336```
51e0b8f1
MV
337
338License
339=======
340
8be9a740 341Python Twitter Tools are released under an MIT License.