Skip to content

Instantly share code, notes, and snippets.

@velocityzen
Created September 26, 2011 16:30
Show Gist options
  • Save velocityzen/1242662 to your computer and use it in GitHub Desktop.
Save velocityzen/1242662 to your computer and use it in GitHub Desktop.

Revisions

  1. velocityzen revised this gist Oct 5, 2011. 1 changed file with 63 additions and 0 deletions.
    63 changes: 63 additions & 0 deletions auth.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,63 @@
    import urlparse
    import oauth2 as oauth

    consumer_key = ''
    consumer_secret = ''

    request_token_url = 'http://www.tumblr.com/oauth/request_token'
    access_token_url = 'http://www.tumblr.com/oauth/access_token'
    authorize_url = 'http://www.tumblr.com/oauth/authorize'

    consumer = oauth.Consumer(consumer_key, consumer_secret)
    client = oauth.Client(consumer)

    # Step 1: Get a request token. This is a temporary token that is used for
    # having the user authorize an access token and to sign the request to obtain
    # said access token.

    resp, content = client.request(request_token_url, "GET")
    if resp['status'] != '200':
    raise Exception("Invalid response %s." % resp['status'])

    request_token = dict(urlparse.parse_qsl(content))

    print "Request Token:"
    print " - oauth_token = %s" % request_token['oauth_token']
    print " - oauth_token_secret = %s" % request_token['oauth_token_secret']
    print

    # Step 2: Redirect to the provider. Since this is a CLI script we do not
    # redirect. In a web application you would redirect the user to the URL
    # below.

    print "Go to the following link in your browser:"
    print "%s?oauth_token=%s" % (authorize_url, request_token['oauth_token'])
    print

    # After the user has granted access to you, the consumer, the provider will
    # redirect you to whatever URL you have told them to redirect to. You can
    # usually define this in the oauth_callback argument as well.
    accepted = 'n'
    while accepted.lower() == 'n':
    accepted = raw_input('Have you authorized me? (y/n) ')
    oauth_verifier = raw_input('What is the PIN? ')

    # Step 3: Once the consumer has redirected the user back to the oauth_callback
    # URL you can request the access token the user has approved. You use the
    # request token to sign this request. After this is done you throw away the
    # request token and use the access token returned. You should store this
    # access token somewhere safe, like a database, for future use.
    token = oauth.Token(request_token['oauth_token'],
    request_token['oauth_token_secret'])
    token.set_verifier(oauth_verifier)
    client = oauth.Client(consumer, token)

    resp, content = client.request(access_token_url, "POST")
    access_token = dict(urlparse.parse_qsl(content))

    print "Access Token:"
    print " - oauth_token = %s" % access_token['oauth_token']
    print " - oauth_token_secret = %s" % access_token['oauth_token_secret']
    print
    print "You may now access protected resources using the access tokens above."
    print
  2. velocityzen revised this gist Sep 27, 2011. 1 changed file with 3 additions and 2 deletions.
    5 changes: 3 additions & 2 deletions photo2tumblr.py
    Original file line number Diff line number Diff line change
    @@ -59,13 +59,14 @@ def createPhotoPost(self, id, post):
    OAUTH_TOKEN = ''
    OAUTH_TOKEN_SECRET = ''

    DIR = "dir/with/pictures"
    DIR = 'dir/with/pictures'
    FILE_MASK = '*.jpg'
    BLOG = 'blog here'


    api = TumblrAPIv2(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)

    for img in glob.glob( os.path.join(DIR, '*.JPG') ):
    for img in glob.glob( os.path.join(DIR, FILE_MASK) ):

    date = time.gmtime(os.path.getmtime(img))
    post = {
  3. velocityzen revised this gist Sep 26, 2011. No changes.
  4. velocityzen renamed this gist Sep 26, 2011. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  5. velocityzen created this gist Sep 26, 2011.
    92 changes: 92 additions & 0 deletions photo2tumblr
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,92 @@
    import glob
    import json
    import os
    import time
    import urllib2
    import urlparse
    import oauth2
    from poster.encode import multipart_encode
    from poster.streaminghttp import register_openers

    class APIError(StandardError):
    def __init__(self, msg, response=None):
    StandardError.__init__(self, msg)

    class TumblrAPIv2:
    def __init__(self, consumer_key, consumer_secret, oauth_token, oauth_token_secret):
    self.consumer = oauth2.Consumer(consumer_key, consumer_secret)
    self.token = oauth2.Token(oauth_token, oauth_token_secret)
    self.url = "http://api.tumblr.com"

    def parse_response(self, result):
    content = json.loads(result)
    if 400 <= int(content["meta"]["status"]) <= 600:
    raise APIError(content["meta"]["msg"], result)
    return content["response"]

    def createPhotoPost(self, id, post):
    url = self.url + "/v2/blog/%s/post" %id

    img_file = post['data']
    del(post['data'])
    req = oauth2.Request.from_consumer_and_token(self.consumer,
    token=self.token,
    http_method="POST",
    http_url=url,
    parameters=post)
    req.sign_request(oauth2.SignatureMethod_HMAC_SHA1(), self.consumer, self.token)
    compiled_postdata = req.to_postdata()
    all_upload_params = urlparse.parse_qs(compiled_postdata, keep_blank_values=True)

    for key, val in all_upload_params.iteritems():
    all_upload_params[key] = val[0]

    all_upload_params['data'] = open(img_file, 'rb')
    datagen, headers = multipart_encode(all_upload_params)
    request = urllib2.Request(url, datagen, headers)

    try:
    respdata = urllib2.urlopen(request).read()
    except urllib2.HTTPError, ex:
    return 'Received error code: ', ex.code

    return self.parse_response(respdata)

    register_openers()

    CONSUMER_KEY = ''
    CONSUMER_SECRET = ''
    OAUTH_TOKEN = ''
    OAUTH_TOKEN_SECRET = ''

    DIR = "dir/with/pictures"
    BLOG = 'blog here'


    api = TumblrAPIv2(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)

    for img in glob.glob( os.path.join(DIR, '*.JPG') ):

    date = time.gmtime(os.path.getmtime(img))
    post = {
    'type' : 'photo',
    'date' : time.strftime ("%Y-%m-%d %H:%M:%S", date),
    'data' : img,
    'tags' : time.strftime ("%Y", date) + ", photo",
    'caption' : time.strftime ("%B %d / %Y", date)
    }

    try:
    response = api.createPhotoPost(BLOG,post)
    if 'id' in response:
    print response['id']
    os.remove(img)
    else:
    print response
    break

    except APIError:
    print "Error"
    break

    print "Done!"