Saturday, 18 June 2011

How to fix your broken Blogger client program

For about a month now I and other people have been unable to use the blogger api to update our blogs. This is one of a raft of problems caused by a recent update of the blogger system, and some other ones (including the fact my OpenID is broken) are still outstanding. However, the OpenID thing isn't a big deal, whereas the api blog posting is something I use a lot.

I can happily report that the Blogger/Google people have come through for us and found the problem. I had been losing hope, because as a linux user I'm used to having people break stuff, and then say the problem is that I'm running linux. But, though it's admittedly taken them a while, google's blogger team have dug to the bottom of the problem and found the cause. Maybe I should have more faith in future, we'll see.

If you've found that your blogger API client program has stopped working in the last month, then what follows is what you need to do to get it working again.



Turns out that some of us had misinterpreted the blogs 'posting endpoint' to be this

http://idratherhack.blogspot.com/feeds/posts/default

which was working fine, you could send the appropriate XML to this endpoint, and post to your blog. But it was never supposed to work, and since the upgrade, it doesn't. This is a shame, because it's a nice URL that makes some sense to the user.

The endpoint we should have been using looks more like:

http://www.blogger.com/feeds/8441087078477003568/posts/default

So the question is, how do you get from a blog name/url like 'idratherhack.blogspot.com' to this horrible blog ID? Well, there's a few ways of doing it.

1) Connect to your blog and pull it as an html page. Near the top you'll see an entry like:

<link rel="service.post" type="application/atom+xml" title="I&#39;d Rather Hack - Atom" href="http://www.blogger.com/feeds/8441087078477003568/posts/default" />
The 'href' part of this gives you the url that you should use for posting to the blog.

2) The more complex way is described in the protocol document


1: Authenticate with google using client-login or Oauth.

2: do an HTTP GET to http://www.blogger.com/feeds/default/blogs

This will return a mass of XML that gives information regarding the authenticated user. Within this are entries like:


<link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/profileID/blogs/blogID' />
<link rel='alternate' type='text/html' href='http://blogName.blogspot.com/' />
<link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blogName.blogspot.com/feeds/posts/default' />
<link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='http://www.blogger.com/feeds/blogID/posts/default' />



The important one is the one that has a 'rel' value of

http://schemas.google.com/g/2005#post

the accompanying 'href' gives the endpoint you must used for posting blog entries. Here it is described as 'http://www.blogger.com/feeds/blogID/posts/default', but when you get a real feed the 'blogID' will be replaced by a big old number to produce a unique endpoint for the blog.

This XML also contains other interesting 'link' entries, like:

rel=http://schemas.google.com/blogger/2008#setting
rel=http://schemas.google.com/blogger/2008#template

the href of these gives endpoints that let you pull a list of settings or the template of the blog.


So basically, if you get this 'post' endpoint, and use that instead of http://<blogname>.blogspot.com/feeds/posts/default, you should find that your API program starts working again.

3 comments:

  1. Oh no. I was already doing this, and I still can't post.

    ReplyDelete
  2. I'm not sure Onus, but the problem you described elsehwere (getting a 200 rather than a 201 response) rings a bell with me. I think that the '200' might return some error withing the returning page.

    Basically it's saying "Things were alright at the http level, but at the blogger level there was a problem, and here is some xml to explain it".

    Did you get anything back from the 200 response?

    ReplyDelete