今開けているページをブックマークからBloggerに投稿する。
(a.k.a. はてブのブックマークレットもどき)
これをブックマークに登録する。
javascript:void%20window.open('http://path_to_the_file/blogthis.html?url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title),'blogthis');
下記のファイルを、どこかのhttpサーバに置く。localhostでもよい。
<html>
<head>
<title>blog this page</title>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("gdata", "1.x");
google.setOnLoadCallback(init);
var BLOGGER_AUTH_URL = 'http://www.blogger.com/feeds';
var BLOGGER_LIST_URL = 'http://www.blogger.com/feeds/default/blogs';
var BlogPress = {
service: null,
blogs: [],
cuurrentBlogNum: 0 // modify this according to your blog settings.
};
function el(id) {
return document.getElementById(id);
}
function changeStatus(status) {
alert(status);
};
function loginOrOut() {
var token = google.accounts.user.checkLogin(BLOGGER_AUTH_URL);
if(token) {
google.accounts.user.logout();
init();
}
else {
google.accounts.user.login(BLOGGER_AUTH_URL);
}
}
function init() {
var param = new Array();
var query = window.location.search.substring(1);
var params = query.split('&');
for(var i = 0; i < params.length; i++) {
var pos = params[i].indexOf('=');
if(pos > 0) {
param[params[i].substring(0, pos)] = params[i].substring(pos + 1);
}
}
el('title').value = decodeURIComponent(param['title']);
el('url').value = decodeURIComponent(param['url']);
var token = google.accounts.user.checkLogin(BLOGGER_AUTH_URL);
if(token) {
el('login').value = "logout";
BlogPress.service = new google.gdata.blogger.BloggerService('GoogleInc-bloggerOffline-1');
getBlogs();
el('submit').disabled = false;
}
else {
el('login').value = "login";
el('submit').disabled = true;
}
}
function getBlogs() {
var query = new google.gdata.blogger.BlogQuery(BLOGGER_LIST_URL);
BlogPress.service.getBlogFeed(query, handleBlogsFeed, handleError);
}
function handleBlogsFeed(resultsFeedRoot) {
var blogsFeed = resultsFeedRoot.feed;
BlogPress.blogs = blogsFeed.getEntries();
var blog = BlogPress.blogs[BlogPress.cuurrentBlogNum];
var title = blog.getTitle().getText();
el('postTo').innerHTML = 'Post to ' + title;
}
function handleError(error) {
changeStatus(error.cause ? error.cause.statusText : error.message);
};
function submit() {
var title = el('title').value;
var link = '<a href="'+el('url').value+'">'+el('url').value+'</a>';
var content = link + "</br>\n" + el('comment').value;
var blogPostEntry = new google.gdata.blogger.PostEntry();
blogPostEntry.setTitle(google.gdata.atom.Text.create(title));
blogPostEntry.setContent(google.gdata.atom.Text.create(content, 'html'));
var blog = BlogPress.blogs[BlogPress.cuurrentBlogNum];
var blogPostHref = blog.getEntryPostLink().getHref();
BlogPress.service.insertEntry(blogPostHref, blogPostEntry, handleEntryPost, handleError);
}
function handleEntryPost(entryRoot) {
changeStatus('Successfully added or updated post.');
}
</script>
</head>
<body>
<img src="pumpkin_64.png" alt="An image of the same domain is needed somehow." />
<div><input id="login" type="button" value="login" onClick="loginOrOut()" /></div>
<hr>
<div id="postTo"></div>
<div>Title: <input type="text" id="title" size=70 /></div>
<div>URL: <input type="text" id="url" size=70/></div>
<div>Commnet: <br/><textarea id="comment" rows=20 cols=50></textarea></div>
<div><input id="submit" type="button" value="submit" onClick="submit()" /></div>
</body>
</html>
はまった点①
認証のため同じドメインの画像を表示する必要があるんだって。何?その仕様。
はまった点②
handleBlogsFeed()が呼び出されるのは、getBlogs()を抜けてinit()が終わったあと。getBlogs()の直後に、handleBlogsFeed()で設定したグローバル変数をチェックしたら何もなくてはまった。