]>
Commit | Line | Data |
---|---|---|
146b4f29 | 1 | """ |
c115f12f | 2 | twitter-log - Twitter Logger/Archiver |
146b4f29 MV |
3 | |
4 | USAGE: | |
5 | ||
c115f12f | 6 | twitter-log <screen_name> [max_id] |
146b4f29 MV |
7 | |
8 | DESCRIPTION: | |
9 | ||
10 | Produce a complete archive in text form of a user's tweets. The | |
11 | archive format is: | |
12 | ||
5f3ddd05 MV |
13 | screen_name <tweet_id> |
14 | Date: <tweet_time> | |
15 | [In-Reply-To: a_tweet_id] | |
146b4f29 | 16 | |
c115f12f | 17 | Tweet text possibly spanning multiple lines with |
146b4f29 MV |
18 | each line indented by four spaces. |
19 | ||
5f3ddd05 MV |
20 | |
21 | Each tweet is separated by two blank lines. | |
146b4f29 MV |
22 | |
23 | """ | |
24 | ||
5f3ddd05 MV |
25 | from __future__ import print_function |
26 | ||
146b4f29 MV |
27 | import sys |
28 | import os | |
7f9d60c6 MV |
29 | from time import sleep |
30 | ||
098660ce MV |
31 | from .api import Twitter, TwitterError |
32 | from .cmdline import CONSUMER_KEY, CONSUMER_SECRET | |
33 | from .auth import NoAuth | |
34 | from .util import printNicely | |
35 | ||
146b4f29 | 36 | |
7f9d60c6 | 37 | def log_debug(msg): |
5f3ddd05 | 38 | print(msg, file=sys.stderr) |
146b4f29 | 39 | |
c115f12f MV |
40 | def get_tweets(twitter, screen_name, max_id=None): |
41 | kwargs = dict(count=3200, screen_name=screen_name) | |
7f9d60c6 MV |
42 | if max_id: |
43 | kwargs['max_id'] = max_id | |
146b4f29 | 44 | |
7f9d60c6 | 45 | n_tweets = 0 |
146b4f29 MV |
46 | tweets = twitter.statuses.user_timeline(**kwargs) |
47 | for tweet in tweets: | |
7f9d60c6 MV |
48 | if tweet['id'] == max_id: |
49 | continue | |
5f3ddd05 MV |
50 | print("%s %s\nDate: %s" % (tweet['user']['screen_name'], |
51 | tweet['id'], | |
52 | tweet['created_at'])) | |
53 | if tweet.get('in_reply_to_status_id'): | |
54 | print("In-Reply-To: %s" % tweet['in_reply_to_status_id']) | |
55 | print() | |
146b4f29 | 56 | for line in tweet['text'].splitlines(): |
098660ce | 57 | printNicely(' ' + line + '\n') |
5f3ddd05 MV |
58 | print() |
59 | print() | |
7f9d60c6 MV |
60 | max_id = tweet['id'] |
61 | n_tweets += 1 | |
62 | return n_tweets, max_id | |
63 | ||
64 | def main(args=sys.argv[1:]): | |
7f9d60c6 | 65 | twitter = Twitter( |
c115f12f | 66 | auth=NoAuth(), |
7f9d60c6 MV |
67 | api_version='1', |
68 | domain='api.twitter.com') | |
69 | ||
c115f12f | 70 | if not args: |
5f3ddd05 | 71 | print(__doc__) |
c115f12f MV |
72 | return 1 |
73 | ||
74 | screen_name = args[0] | |
75 | ||
76 | if args[1:]: | |
77 | max_id = args[1] | |
7f9d60c6 MV |
78 | else: |
79 | max_id = None | |
80 | ||
81 | n_tweets = 0 | |
82 | while True: | |
83 | try: | |
c115f12f | 84 | tweets_processed, max_id = get_tweets(twitter, screen_name, max_id) |
7f9d60c6 MV |
85 | n_tweets += tweets_processed |
86 | log_debug("Processed %i tweets (max_id %s)" %(n_tweets, max_id)) | |
87 | if tweets_processed == 0: | |
88 | log_debug("That's it, we got all the tweets. Done.") | |
89 | break | |
098660ce | 90 | except TwitterError as e: |
7f9d60c6 MV |
91 | log_debug("Twitter bailed out. I'm going to sleep a bit then try again") |
92 | sleep(3) | |
c115f12f MV |
93 | |
94 | return 0 |