If you see this, then I've finally (at least partially) figured out how
to use the Blogger-beta GData API from Python. And to make posting a little
bit quicker/easier for me, I've stuck that Python code into a Vim plugin.
To be honest, I'm not entirely sure what I was doing wrong in my previous
attempts. I've changed several things, then changed some back. The resulting
code really doesn't look much different to me than it did before, but there
are a few very subtle changes. I suspect my ignorance when it comes to HTTP
and XML protocols played a large part in my frustrations.
Anyways, here is a working version of the Python code that works for
posting a blog entry. You will obviously need to fill in your
BLOGID, GMAIL_ADDRESS, and GMAIL_PASSWORD
appropriately for it to work for you:
#!/usr/bin/env python
import httplib2, re
account = "GMAIL_ADDRESS"
password = "GMAIL_PASSWORD"
blogid = "BLOGID"
def authenticate(h):
auth_uri = 'https://www.google.com/accounts/ClientLogin'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
myrequest = "Email=%s&Passwd=%s&service=blogger&service=TestCompany-TestApp-0.0" % (account, password)
response, content = h.request(auth_uri, 'POST', body=myrequest, headers=headers)
if response['status'] == '200':
return re.search('Auth=(\S*)', content).group(1)
else:
return None
entry = """<?xml version="1.0" ?>
<entry xmlns='http://www.w3.org/2005/Atom'>
<title type='text'>Test Post</title>
<content type='xhtml'>
<div xmlns="http://www.w3.org/1999/xhtml">
If you are reading this, then it worked!
</div>
</content>
<author>
<name>TestUser</name>
</author>
</entry>
"""
h = httplib2.Http()
uri = 'http://www.blogger.com/feeds/%s/posts/full' % blogid
# Get the Auth token from ClientLogin
auth = authenticate(h)
if auth:
headers = {'Content-Type': 'application/atom+xml', 'Authorization': 'GoogleLogin auth=%s' % auth.strip()}
response, content = h.request(uri, 'POST', body=entry, headers=headers)
# blindly follow redirects
while response['status'] == '302':
response, content = h.request(response['location'], 'POST', body=entry, headers=headers)
if response['status'] == '201':
print "Entry successfully posted."
else:
print "Post failed: %s" % response['status']
else:
print "Authorization failed."
It's pretty rough, I realize, but I think it's good enough to get anyone
started if you are interested. I hope someone will find this useful.
Now to see what other functionality I can perform :).
Oh, I almost forgot. If you want the Vim plugin I'm using you can get it here. To install it, drop it in ~/.vimrc/plugins/. To use it, open vim, type your post's subject on the first line, the post body below that, and type :BlogPost when you are done.