自分のGoogle Bookmarksを公開した。


Delicious にマルチポストすることにしたので、この記事に書かれていることは現在は行っていません。

詳細は下に書きました。


Google BookmarksはRSS形式で受信することもできるので、こちらで少し弄ってRSSとして公開することにした。

PermalinkはブックマークしたサイトのURL、フィード内容は僕のコメントになっている。このブログの左サイドバーに表示されているものと同じ。

将来は、http://www.google.com/bookmarks/bookmarks.html からエクスポートできるブックマークのHTMLも公開しようと思っていたりするが、今は未定。


"Opera"というタグで選別してあるものはこちら。

おそらくOperaに関しては他の人よりも多くのソースにあたっていると思うので、おもしろい情報があるかもしれない。

廃止しました。

こちらでやったこと

まず試しに、Google BookmarksのRSSをそのままダウンロードしてきてOperaで開いたところ、「Operaでこのフィードを受信しますか?」とかいうダイアログが出たので、RSSというのはサーバーでMIMEタイプを指定したりしなくてもいいというのがわかった。それなら普通にそのRSSをダウンロードして別のサーバーに上げてしまえばいいじゃん、と思った

wgetRSSを取得

というわけでwgetを使ってGoogle BookmarksのRSSを取得することにした。

wget --no-check-certificate --user=ユーザー名 --password=パスワード "http://www.google.com/bookmarks/lookup?hl=en&sort=&output=rss" -O /ブックマーク保存用ディレクトリ/gbookmarks.rss

(--no-check-certificateというオプションを付けないといけない点に注意)

scpをパスワード入力なしでやる

落としたファイルはsftpなりscpなりでサーバーに送る。僕の場合はscpで。

scp /ブックマーク保存用ディレクトリ/gbookmarks.rss ユーザー名@サーバー:/サーバー内のパス/gbookmarks.rss

これをcronを使って自動化するのだが、このままだと毎度パスワードを求められてしまうので、自動化するにはトリックが必要である。

詳しくはssh にてパスワードを使用しないでログインする方法を参照してもらえばいいのだが、自分の環境で動いた方法だけをメモっておく。

ssh-keygen -t dsa

してDSA形式の公開鍵(id_dsa.pub)と秘密鍵(id_dsa)のペアをローカルの$HOME/.ssh/ディレクトリに作る。(rsa形式が必要かdsa形式が必要かはサーバーによって異なるが、わからなかったら両方試してみればいい)

サーバーに$HOME/.ssh/というディレクトリを作って、その中にさっき作ったid_dsa.pubというファイルをコピー。ここは普通にscpを使ってパスワード入力しないといけない。

scp $HOME/.ssh/id_dsa.pub ユーザー名@サーバー:.ssh

サーバーにコピーしたid_dsa.pubをauthorized_keys2という名前に変える。このファイルはパーミッションを適切に変更しておく(上のリンク参照)

cronで自動化

これで晴れてcronを使って自動化できる。自動化するスクリプト(makegbookmarksrss.shとでも名付けて、ブックマーク保存用ディレクトリと同じところにでも置いておく)は

#!/bin/zsh-4.3.4

if /opt/local/bin/wget --no-check-certificate --user=ユーザー名 --password=パスワード "http://www.google.com/bookmarks/lookup?hl=en&sort=&output=rss" -O /ブックマーク保存用ディレクトリ/gbookmarks.rss; then

scp /ブックマーク保存用パス/gbookmarks.rss ユーザー名@サーバー:/サーバー内のパス/gbookmarks.rss
fi

wgetとブックマーク保存用ディレクトリはフルパスで指定)

それから、

crontab -e

でcrontabを編集して以下を書く。

0,15,30,45 * * * * /ブックマーク保存用ディレクトリ/makegbookmarksrss.sh > /ブックマーク保存用ディレクトリ/log.txt 2>&1

(行の最後に改行が必要?最後のところは、実行結果log.txtというログファイルに残し、失敗時にメールを送らないようにするらしい)

Yahoo! Pipesで要素の名前を変更

これをそのままRSSとして公開してもいいのだが、Google BookmarksはちゃんとしたRSS構造をしていないので、普通に受信してもコメント欄は読めない。

そういうわけで、Yahoo! Pipesのお世話になった。

見ての通り、もともとあるitem.description要素には何も書いてないので適当な名前に変更して、item.smh:bkmk_annotation要素をitem.descriptionという名前に変更しただけ。

Operaタグで選別したRSSのほうは、その下にitem.smh:bkmk_labelによるフィルターをかけている。


いくつか

  • 言うまでもなく、cronはローカルのコンピューターが動いている間だけしか動かないので、このフィードは自分がパソコンを使っている間しか更新されない(うちの学校のサーバーはcronが普通には使えないようになっているみたいだったので、サーバー上でcronを動かすという方法もできなかった)。しかしそもそも、ブックマークは自分がネットしている間しか更新しないのだからそれでもいいだろう。
  • 普通の無料で借りられるサーバーだとscpやsftpでのアクセスが出来なかったりするので、この方法は難しいかもしれない。(いや、別にftpを自動化してもいいのだが、パスワードを平文で送るのを15分おきにやるのはちょっと怖い)
  • Yahoo! Pipesでは、RSSの更新分をメールで送るYahoo! Alertというのがあるので、Yahoo! Alertでブックマークを自分に送ることにした。
  • 同じ方法を使ってtwitterも1日分の(Followしている人と自分の)ログをメールで一気に送るようにしようと思ったが、twitterの場合は更新が多すぎて1日1回メールをする設定にしていては全部は送ってくれない。更新の度にメールさせることもできるが、そこまでやるのもなあ。
  • このブログの更新が止まったとき、僕が生きてるか心配になってくれた人はtwitter(こちらもここの左サイドバーにある)を覗いてくれればいいわけですが、最近はtwitterのほうも更新頻度が下がっているので、ブックマークが更新されていればとりあえずネットはしているということだと思ってください。



Yahoo Pipesの仕様変更によりコメントが配信されていない。あとで何とかする。


スクリプトのほうを書き換えて一応復旧させた。

#!/bin/sh
mypath=適当なパス

if /opt/local/bin/wget --no-check-certificate --user=ユーザー名 --password=パス -t 5 "http://www.google.com/bookmarks/lookup?hl=en&sort=&output=rss" -O $mypath/gbookmarks_new.rss; then

fsize=`wc -c $mypath/gbookmarks.rss | awk '{print $1}'`
fsize_new=`wc -c $mypath/gbookmarks_new.rss | awk '{print $1}'`
if [ "$fsize" != "$fsize_new" ]; then
echo "file size different"
mv $mypath/gbookmarks.rss $mypath/gbookmarks_old.rss
mv $mypath/gbookmarks_new.rss $mypath/gbookmarks.rss
cat $mypath/gbookmarks.rss | sed -e "s/<description><\/description>//g" | sed -e "s/smh:bkmk_annotation/description/g" > $mypath/gbookmarks_tmp.rss
scp $mypath/gbookmarks_tmp.rss ユーザー名@サーバー:パス/gbookmarks.rss
rm $mypath/gbookmarks_tmp.rss
else
echo "file not updated"
rm $mypath/gbookamrks_new.rss
fi
fi

Pipesもちょっと弄っている。というか Fetch Feed するだけにしてある。

都合によりOperaタグで抽出のほうは辞めることにした。