2008/02/04
Bloggerでのラベル一覧表示スクリプトを修正しました
以前、[再] Bloggerのクラシックテンプレート(FTP公開)でもラベル一覧を表示したいを紹介したのですが、BloggerのAPIでエラーが発生してしまい、動作しなくなってしまったので修正しました。
具体的には、
http://www.blogger.com/feeds/UserID/blogs/BlogID?alt=json-in-script&callback=listLabels
とリクエストしても、次のエラーが表示されます。
The 'callback' parameter is only supported on feeds.
この現象は、どうやらBloggerAPIの問題として投稿されているようです。
Public Metafeed Callback Error - Blogger Data API | Google グループ
Issue 341 - gdata-issues - Google Code
[再] Bloggerのクラシックテンプレート(FTP公開)でもラベル一覧を表示したいでは、アップデートとしてユーザのブログ一覧から絞り込む方法を紹介しましたが、Google グループのコメントにもあるように、callbackパラメータを省略した場合にデフォルトで設定される gdata.io.handleScriptLoaded を自身で定義することでも対応できます。
var gdata = function() {}
gdata.io = function() {}
gdata.io.handleScriptLoaded = function(root) {
var baseURL = '/blogs/ishikawa/labels/';
var baseHeading = "ラベル";
var isFTP = true;
var llDiv = document.getElementById('labelList');
var h2 = document.createElement('h2');
h2.className = 'sidebar-title';
var h2t = document.createTextNode(baseHeading);
h2.appendChild(h2t);
llDiv.appendChild(h2);
var ul = document.createElement('ul');
ul.id = 'label-list';
var regBlogId = new RegExp(/blog-(\d+)/);
var labelSort = new Array();
var entry = root.entry;
for (var p in entry.category) {
var category = entry.category[p];
labelSort[labelSort.length] = category.term;
}
labelSort.sort();
for (var r=0; r < labelSort.length; r++){
var li = document.createElement('li');
var a = document.createElement('a');
var label = new String(labelSort[r]);
var l = encodeURIComponent(label);
if (isFTP) {
if (label.indexOf('Blogger') >= 0) {
l = l.replace(/%/g, '=');
} else if (encodeURIComponent(label.replace(/[!-~\s]/g, '')).indexOf('%', 0) >= 0) {
l = Base64.encode(new String(label));
l = l.replace(/\//g, "__");
}
}
a.href = baseURL + l +'.html';
a.innerHTML = label + ' ';
li.appendChild(a);
ul.appendChild(li);
abnk = document.createTextNode(' ');
ul.appendChild(abnk);
}
llDiv.appendChild(ul);
}
</script>
<script type="text/javascript" src="http://www.blogger.com/feeds/08755644619888194912/blogs/1303966254927872449?alt=json-in-script" ></script>
しばらくは、様子を見る必要がありそうです。
ラベル: blogger
2007/12/11
[再] Bloggerのクラシックテンプレート(FTP公開)でもラベル一覧を表示したい
以前にBloggerのクラシックテンプレート(FTP公開)でもラベル一覧を表示する方法を紹介したのですが、不具合が発見されたので再エントリーします。
発見された不具合は、ラベル名にスペースがある場合マルチバイト文字と誤判定しBase64エンコードしてしまうというものです。
URLエンコードした際に"%"の有無で判定していたのですが、これではスペース(%20)等の記号を含む場合にうまくありません。
そしてさらに、Bloggerという文字列がラベルに含まれていた場合、Base64エンコードではなく、URLエンコードになるという現象も確認しました。
Bloggerという単語以外にも発生するのかは不明です・・・。だれか詳しい方教えてください(泣
というわけで、修正版は下記からお願いいたします。折角ですので、コード生成機を作成しました。
当記事を参考にされた方、すみませんでした!お手数ですが、修正をお願いいたします。
なお、前回同様下記コードの実行には別途Base64エンコードのライブラリが必要です。
Free code and tutorialsにある、Javascript base64 encoding等を予め、読み込ませる必要がありますので、ご注意ください。
Update:
2008/01/29現在、http://www.blogger.com/feeds/UserID/blogs/BlogID?alt=json-in-script&callback=listLabelsというリクエストでエラーが帰ってきてしまいます。
調べてみると、同じ現象にあっている人がいるようですが、残念ながら解決策はまだないようです。
Public Metafeed Callback Error - Blogger Data API | Google グループ
※中桐 秀起さん、コメントありがとうございます!
Blogger Data APIが変更になって、Google AJAX APIからmetafeedを取得するようになった気がするのですが、既存のコードをあまり修正しないように対応してみます。もっとスマートなやり方があれば是非お知らせください!
単純に、全ポストデータを取得しラベルを抽出します。
しかしながら、ラベルを取得するのに、全フィードを取得しなければいけないので、
Update2:
http://www.blogger.com/feeds/UserID/blogs からは、callbackが使えるようなので、ユーザのブログ情報を取得し、指定のBlogIDのCategory(ラベル)を表示するように修正しました。
コードは下記の生成機より、取得できます。
念のためこれまでのコードは、[Genarate old]から取得できます。
| UserID: | プロフィールページのURLの最後等 例)http://www.blogger.com/profile/08755644619888194912 |
|
|---|---|---|
| BlogID: | 投稿画面URLの最後等 例)http://www.blogger.com/posts.g?blogID=1303966254927872449 |
|
| ベースURL: | ラベルディレクトリのURLまたはパス | |
| タイトル: | リストのタイトル | |
| FTP公開: | FTP公開モードの場合チェック |
ラベル: blogger
2007/07/20
Bloggerのクラシックテンプレート(FTP公開)でもラベル一覧を表示したい
07/12/11追記:下記スクリプトに不具合が見つかりました。こちらの記事を参照してください。
弊社Official Blogでは、Bloggerのクラシックテンプレート(FTP公開)でブログを公開しています。
記事の投稿時には、「この投稿のラベル」というところでラベルを設定できるのですが、設定したラベルの一覧をサイドバーに表示するタグは無いようなのです。
クラシックテンプレートは…
クラシックテンプレートの利用者は、上に示したようなカスタマイズができません。というより、それ以前にブログにラベル一覧を表示する方法が用意されていません。
(クラシックテンプレートには、)サイドバーに全てのラベルを表示するタグはありません。サイドバーのラベルウィジェットを使う場合には、レイアウトテンプレートに変更する必要があります。(クリボウ訳)
レイアウトテンプレートを使えない身(FTP 公開ブログ)としては、非常に残念です…。
なにか他の方法で表示できないかと調べていると、Javascriptでサイドバーにラベル一覧を表示する方法を発見しました!
phydeaux3: Automatic List of Labels for Blogger Classic Templates / FTPCaveats - this only works for blogs that have their admin profile publicly available, and the blog must be publicly listed in that profile (this is as it should, if you haven't announced your blog publicly, then your metafeed shouldn't be public). It also does NOT return the number of posts in each label. Just the list of all the ones used.
Ok, you need two pieces of information for it to work. Your Blogger UserID number, and your Blogs ID number. Both of these you can get via your dashboard. For the USERID, click on the View Profile link and it's the long number at the end of that url. For the Blog ID number, again from the dashboard if you click on any links to change settings or create a post for that blog, all links will have blogID=XXXXXXX at the end where the X's will be that particular blog's ID number. Once you have that, here is code that will fetch and display the labels for your blog.
どうやら、プロフィールを公開している状態で、UserIDとBlogIDがあれば可能なようです。
上記サイトより早速コードを拝借して試してみると、日本語のラベルページにジャンプできません!
Bloggerより生成されたラベルページのファイル名を良く見てみると、なんと日本語が混じるとBase64でエンコードされたファイル名になっています。ですが、上記コードでは単純にencodeURIComponentしているだけのようです。海外ではこれでOKですが、日本ではちょっとまずいです。
というわけで、前置きが長くなりましたが、以下が改造後のソースです。
※Base64のエンコードには、Free code and tutorialsにある、Javascript base64 encodingを使用しています。
このファイルを予め読み込んでおく必要があります。
<div id="labelList"></div> <script type="text/javascript">
//<![CDATA[
function listLabels(root){
var baseURL = '/blog/labels/';
var baseHeading = "ラベル";
var isFTP = true;
var llDiv = document.getElementById('labelList');
var entry = root.entry;
var h2 = document.createElement('h2');
h2.className = 'sidebar-title';
var h2t = document.createTextNode(baseHeading);
h2.appendChild(h2t);
llDiv.appendChild(h2);
var ul = document.createElement('ul');
ul.id = 'label-list';
var category = entry.category;
labelSort = new Array();
for(p in category){
labelSort[labelSort.length] = [category[p].term];
}
labelSort.sort();
for (var r=0; r < labelSort.length; r++){
var li = document.createElement('li');
var a = document.createElement('a');
if(isFTP){
var l = encodeURIComponent(labelSort[r]);
if (l.indexOf('%', 0) >= 0) {
var reg1=/\//g;
l = Base64.encode(new String(labelSort[r]));
l = l.replace(reg1, "__");
}
a.href = baseURL + l +'.html';
}
else {
a.href = baseURL + encodeURIComponent(labelSort[r]);
}
a.innerHTML = labelSort[r] + ' ';
li.appendChild(a);
ul.appendChild(li);
abnk = document.createTextNode(' ');
ul.appendChild(abnk);
}
llDiv.appendChild(ul);
}
//]]>
</script>
<!--
The script source URL must be
http://www.blogger.com/feeds/<UserID>/blogs/<BlogID>?alt=json-in-script&callback=bloggerLabels
You can get your <UserID> at the end of your profile view URL.
And you can get your <BlogID> at the end of URL in your blog editor (and blog setting)
like http://www.blogger.com/posts.g?blogID=xxxxx, in this case xxxxx is your <BlogID>.
-->
<script type="text/javascript" src="http://www.blogger.com/feeds/UserID/blogs/BlogID?alt=json-in-script&callback=listLabels" ></script>
baseURLや、baseHeading等の値は環境に合わせて変更します。
詳しくは元記事をご覧下さい。
ラベル: blogger
