]> jfr.im git - z_archive/twitter.git/blobdiff - twitter/cmdline.py
Change domain to api.twitter.com for cmdline tool
[z_archive/twitter.git] / twitter / cmdline.py
index d362b634ceb0c23bd0d8bc4d5b3aa226fa584ba1..d722a6ace1b0bd845f49db70529854a3c879abb8 100644 (file)
@@ -12,7 +12,7 @@ ACTIONS:
  leave          remove the specified user from your following list
  public         get latest public tweets
  replies        get latest replies
- search         searchtwitter (Beware: octothorpe, escape it)
+ search         search twitter (Beware: octothorpe, escape it)
  set            set your twitter status
  shell          login the twitter shell
 
@@ -30,7 +30,7 @@ OPTIONS:
  -t --timestamp             show time before status lines
  -d --datestamp             shoe date before status lines
     --no-ssl                use HTTP instead of more secure HTTPS
-
+    --oauth <filename>      filename to read/store oauth credentials to
 
 FORMATS for the --format option
 
@@ -52,7 +52,6 @@ prompt: <twitter_shell_prompt e.g. '[cyan]twitter[R]> '>
 
  OAuth authentication tokens are stored in the file .twitter_oauth in your
  home directory.
-
 """
 
 CONSUMER_KEY='uS6hO2sV6tDKIOeVjhnFnQ'
@@ -70,13 +69,10 @@ from urllib import quote
 import webbrowser
 
 from api import Twitter, TwitterError
-from oauth import OAuth
+from oauth import OAuth, write_token_file, read_token_file
+from oauth_dance import oauth_dance
 import ansi
 
-# Please don't change this, it was provided by the fine folks at Twitter.
-# If you change it, it will not work.
-AGENT_STR = "twittercommandlinetoolpy"
-
 OPTIONS = {
     'action': 'friends',
     'refresh': False,
@@ -93,8 +89,8 @@ OPTIONS = {
 }
 
 def parse_args(args, options):
-    long_opts = ['help', 'format', 'refresh',
-                 'refresh-rate', 'config', 'length', 'timestamp', 
+    long_opts = ['help', 'format=', 'refresh', 'oauth=',
+                 'refresh-rate=', 'config=', 'length=', 'timestamp', 
                  'datestamp', 'no-ssl']
     short_opts = "e:p:f:h?rR:c:l:td"
     opts, extra_args = getopt(args, short_opts, long_opts)        
@@ -118,6 +114,8 @@ def parse_args(args, options):
             options['config_filename'] = arg
         elif opt == '--no-ssl':
             options['secure'] = False
+        elif opt == '--oauth':
+            options['oauth_filename'] = arg
 
     if extra_args and not ('action' in options and options['action'] == 'help'):
         options['action'] = extra_args[0]
@@ -214,6 +212,17 @@ class AnsiSearchFormatter(object):
             ansi.cmdColour(colour), result['from_user'],
             ansi.cmdReset(), result['text']))
 
+_term_encoding = None
+def get_term_encoding():
+    global _term_encoding
+    if not _term_encoding:
+        lang = os.getenv('LANG', 'unknown.UTF-8').split('.')
+        if lang[1:]:
+            _term_encoding = lang[1]
+        else:
+            _term_encoding = 'UTF-8'
+    return _term_encoding
+
 formatters = {}
 status_formatters = {
     'default': StatusFormatter,
@@ -322,9 +331,12 @@ class SearchAction(Action):
         # We need to be pointing at search.twitter.com to work, and it is less
         # tangly to do it here than in the main()
         twitter.domain="search.twitter.com"
+        twitter.uri=""
         # We need to bypass the TwitterCall parameter encoding, so we
         # don't encode the plus sign, so we have to encode it ourselves
-        query_string = "+".join([quote(term) for term in options['extra_args']])
+        query_string = "+".join(
+            [quote(term.decode(get_term_encoding()))
+             for term in options['extra_args']])
         twitter.encoded_args = "q=%s" %(query_string)
 
         results = twitter.search()['results']
@@ -374,7 +386,7 @@ class LeaveAction(AdminAction):
 
 class SetStatusAction(Action):
     def __call__(self, twitter, options):
-        statusTxt = (u" ".join(options['extra_args'])
+        statusTxt = (" ".join(options['extra_args']).decode(get_term_encoding())
                      if options['extra_args']
                      else unicode(raw_input("message: ")))
         status = (statusTxt.encode('utf8', 'replace'))
@@ -435,46 +447,6 @@ class DoNothingAction(Action):
     def __call__(self, twitter, options):
         pass
 
-def parse_oauth_tokens(result):
-    for r in result.split('&'):
-        k, v = r.split('=')
-        if k == 'oauth_token':
-            oauth_token = v
-        elif k == 'oauth_token_secret':
-            oauth_token_secret = v
-    return oauth_token, oauth_token_secret
-
-def oauth_dance(options):
-    print ("Hi there! We're gonna get you all set up to use Twitter"
-           " on the command-line.")
-    twitter = Twitter(
-        auth=OAuth('', '', CONSUMER_KEY, CONSUMER_SECRET),
-        format='')
-    oauth_token, oauth_token_secret = parse_oauth_tokens(
-        twitter.oauth.request_token())
-    print """
-In the web browser window that opens please choose to Allow access to the
-command-line tool. Copy the PIN number that appears on the next page and
-paste or type it here:
-"""
-    webbrowser.open(
-        'http://api.twitter.com/oauth/authorize?oauth_token=' +
-        oauth_token)
-    oauth_verifier = raw_input("Please type the PIN: ").strip()
-    twitter = Twitter(
-        auth=OAuth(
-            oauth_token, oauth_token_secret, CONSUMER_KEY, CONSUMER_SECRET),
-        format='')
-    oauth_token, oauth_token_secret = parse_oauth_tokens(
-        twitter.oauth.access_token(oauth_verifier=oauth_verifier))
-    oauth_file = open(options['oauth_filename'], 'w')
-    print >> oauth_file, oauth_token
-    print >> oauth_file, oauth_token_secret
-    oauth_file.close()
-    print "That's it! Your authorization keys have been written to %s." % (
-        options['oauth_filename'])
-
-
 actions = {
     'authorize' : DoNothingAction,
     'follow'    : FollowAction,
@@ -498,10 +470,6 @@ def loadConfig(filename):
                 options[option] = cp.get('twitter', option)
     return options
 
-def read_oauth_file(fn):
-    f = open(fn)
-    return f.readline().strip(), f.readline().strip()
-
 def main(args=sys.argv[1:]):
     arg_options = {}
     try:
@@ -530,14 +498,18 @@ def main(args=sys.argv[1:]):
 
     if (options['action'] == 'authorize'
         or not os.path.exists(options['oauth_filename'])):
-        oauth_dance(options)
+        oauth_dance(
+            "the Command-Line Tool", CONSUMER_KEY, CONSUMER_SECRET,
+            options['oauth_filename'])
 
-    oauth_token, oauth_token_secret = read_oauth_file(options['oauth_filename'])
+    oauth_token, oauth_token_secret = read_token_file(options['oauth_filename'])
     
     twitter = Twitter(
         auth=OAuth(
             oauth_token, oauth_token_secret, CONSUMER_KEY, CONSUMER_SECRET),
-        secure=options['secure'])
+        secure=options['secure'],
+        api_version='1',
+        domain='api.twitter.com')
 
     try:
         Action()(twitter, options)
@@ -545,6 +517,6 @@ def main(args=sys.argv[1:]):
         print >>sys.stderr, e
         raise SystemExit(1)
     except TwitterError, e:
-        print >> sys.stderr, e.args[0]
+        print >> sys.stderr, str(e)
         print >> sys.stderr, "Use 'twitter -h' for help."
         raise SystemExit(1)