DropboxのAPIを叩くために登録していたアプリが消えた?

今日の12時頃くらいまでは動いていたみたいだけど、そっからダメになってるっぽい。
アプリを登録しなおしてKeyを設定しなおしたら動いたので、プログラムではないはず

このブログはDropboxで共有しているChangelogファイルを定期的にダウンロードしてChalowでHTMLを生成している。
のはずが、何時まで経っても更新が反映されないので不思議に思いログを確認したところ、DropboxのAPIを叩くところでエラーになっている

Thu Sep  8 12:20:01 JST 2011
PHP Fatal error:  Uncaught exception 'Dropbox_Exception_Forbidden' with message 'Forbidden. This could mean a bad OAuth request, or a file or folder already existing at the target location.' in /path/to/downloadDropbox/Dropbox/OAuth/PHP.php:93
Stack trace:
#0 /path/to/downloadDropbox/Dropbox/API.php(68): Dropbox_OAuth_PHP->fetch('http://api.drop...', Array, 'POST')
#1 /path/to/downloadDropbox/download_filh.php(19): Dropbox_API->getToken(
#2 {main}
thrown in /path/to/downloadDropbox/Dropbox/OAuth/PHP.php on line 93

oAuth関係で失敗しているようなのでDropbox側のAPIが不調なのかと開発者用のダッシュボードを確認する
https://www.dropbox.com/developers_beta/apps

すると、以前登録していたはずのアプリが表示されてない。
おそらく何かの拍子で削除されたか、Dropbox側の何かが原因だと思われるが、一先ず現状復帰を優先させる

新しくひとつアプリを追加してChangelogをダウンロードするプログラムのApp keyとApp secretを更新すると、正常にダウンロードされるようになった

特にアナウンスもない様子だし、Twitterでも誰も何も言ってないので恐らく何らかで消えたんだろうくらいに思っておく

更新Pingを発行できるように修正する

先日、このブログがGoogleのブログ検索で引っかからないとぼやいたところ、藤野 氏より「いや、更新pingが打てないのはブログじゃないよね」的なごく当たり前の指摘を受けたので対応してみた。

このブログについて

このブログ自体はChalowというツールを使って作ってるのだけど、今までの経験からコメントとかトラックバックなんかのかっこ良さげな機能は使われないと判断して削っておりました。
※ どうせコメントとかもないし

ただ、確かに更新Pingくらい打てないとGoogleなんかで記事が検索できるようになるまで半日かかるとか泣けてくる自体に。

で調べたところ、Chalowの製作者のブログにこんな発言が。

基本的に chalow は「HTMLコンバータ」。変換と公開を同時にやってる人っ
て意外と多いのかもしれないけど、変換と公開のタイミングがいっしょで
あることは仮定してません。私は別タイミングだし[2004-05-17-5]。
まあ、ともかく私としては、chalow本体でPING打つってのもなあ、と思う
ので放置です。
[Weblogツール三種の神器](http://chalow.net/2004-08-10-4.html)

<<

このブログもDropboxにアップされたChangelogを定期的に取得して生成しているので「生成のタイミング != 記事が新規登録されたタイミング」になってしまいChalow本体にPing送信機能を突っ込むと無駄打ち空打ちが続いてしまうわけです。

基本方針

前項のような理由から、以下のような方針
・更新Pingを空撃ち無駄打ちしない
・Chalow自体の機能として実装しない

さて、どうしたものかと考えたところ、RSSのバックアップを取っておいて新しく吐き出したRSSとDiffが違ってたら更新Pingを送るようなスクリプトを書けばいいんじゃなかろうかという結論に相成りました。

下準備

Chalowの吐き出すRSSについて

で、そういう事が可能なのかと下調べのために吐き出しているRSSを眺めたところ、RSS自体の更新日が毎回生成した日時になっていたので最新記事の更新日に変更。
そうしないと、生成するたびにRSSの内容が変わってしまうから

類似例について

と言ってもちょっと調べると類似例が大量に出てきたので、それを参考に。
[cl.pocari.org - Google Blog Search に ping を送る Perl スクリプト](http://cl.pocari.org/2006-10-10-2.html)

XMLRPC::Liteのインストールについて

っとその前にXMLRPC::Liteをインストールしようとして散々っぱら怒られたのでそれは別記
[2011-07-12-1]

試しにPingserverを準備した

本当に送られているかどうか分からないので、とりあえずPHPで参考までに準備してみた。
※ と言っても、サンプル置いてパーミッションを出しただけ
[2011-07-12-3]

作った

使い方。blog_tmpは、ChalowでHTMLを吐き出しているディレクトリ
$ /path/to/publishPing.pl /path/to/chalow/blog_tmp/index.rdf

|perl|
#!/usr/local/bin/perl

use strict;
use warnings;
use XMLRPC::Lite;
use File::Compare;
use File::Copy;
use Error qw(:try);
my $file = shift(@ARGV);
## 更新通知用のサイト情報
my @parameters = (
'そうだ車輪と名付けよう 3rd',
'http://www.atyks.org/blog/',
'http://www.atyks.org/blog/',
'http://www.atyks.org/blog/index.rdf'
);
## 更新Ping送信用URL(複数)
my %endpoints = (
"google"                => {"method" => "weblogUpdates.extendedPing", "url" => 'http://blogsearch.googlh.co.jp/ping/RPC2' } ,
"test"                  => {"method" => "weblogUpdates.ping",         "url" => 'pingserver-url'} ,
);
## 更新の有無を判断するためのRSSのパスとバックアップファイル用のSuffix
my $sfx = "_bak";
if( compare($file , $file . $sfx) ) {
## 前回の実行時からRSSの内容が変更されていれば登録されたPingサーバに更新通知を行う
foreach my $title ( sort keys %endpoints)  {
my $endpoint = $endpoints{$title};
my $result;
try {
$result = XMLRPC::Lite
-> proxy($endpoint->{"url"})
-> call($endpoint->{"method"}, @parameters)
-> result;
}
catch Error with {
$result = {"message" => "", "flerror" => 1};
};
if( $result ){
print qq/success $title $result->{message} stat:$result->{flerror}\n/
}
else{
print qq/failed $title $result->{message} stat:$result->{flerror}\n/
}
}
}
else {
## no Diff, no Action
}
## 最後にRSSを更新する。これで2度打ちを防ぐ
copy($file , $file . $sfx);
exit;

||<

結論

あれ?動いていると思うんだけど、なんかリアルタイムに収集されているような気がしないな。
なんか勘違いしているかも
だめじゃん

追記 at 2011/07/21

無事、Googleのブログ検索の対象になった様子、更新した後に時間を開けずに検索対象になった。

おそらく要因は以下の二つ
・この時期で作成した更新PingをGoogleに送るようにしたこと
・Googleのブログ検索にここ登録したこと
※ 主に2点目を忘れていたのがネックだったような気がする

修正

・記事のタイトル部分に該当する箇所にカテゴリを追加
・サイト内の記事参照時に、タイトルとカテゴリを表示するように変更
・はてなダイアリーにリンクしていた記事を日付参照に変更
・サイト外へリンクしていたURLの差し替え

修正

・「・」から始めた行をリストにするよう修正
・単なる改行の場合、p要素でくくらずbrで改行するよう修正
・ pubilcカテゴリを一々表示しないよう修正
・ chalowファイルをutf8に変更

Hatena.pmを修正してシンタックスハイライトにgoogle-code-prettifyを使うように変更する

Text::VimColorだと記事中の日本語が文字化けしたので、差し替え

設置

http://codh.googlh.com/p/google-code-prettify/

Text::Hatenaを修正する

$ diff Hatena.pm Hatena.pm.2011-05-31
217,220c217,219
<         # $texts = Text::VimColor->new(string => $texts,
<         #                              filetype => $filter,
<         #                             )->html;
<         $texts = HTML::Entities::encode_entities($texts, '<>&"');
---
>         $texts = Text::VimColor->new(string => $texts,
>                                      filetype => $filter,
>                                     )->html;
224c223
<     return qq!<pre class="prettyprint hatena-super-pre">\n$texts</pre>\n!;
---
>     return qq!<pre class="hatena-super-pre">\n$texts</pre>\n!;

chalowをインストール

標準的なインストール

% sudo perl -MCPAN -e shell
% install Jcode
% install HTML::Template

はてな記法を使えるように修正

seh. http://diary.overlasting.net/2006-05-26-2.html

% install Text::Hatena
% install HTML::Entities
% install Text::VimColor
Vim自体がインストールされておらず失敗

% sudo yum -y install vim-enhanced

上記はプラグインなので、いちいち指定するのが面倒くさい
./chalow , line 469, sub okikae() を直接修正する

出力をUTF-8に変換する

chalowの$utf8_modeを1に
cl.confの文字コードをutf-8に変換する

プログラムコードをシンタックスハイライトする

Text::VimColorを使うようになっているので、必要なlight.cssを読み込む
http://search.cpan.org/dist/Text-VimColor/lib/Text/VimColor.pm

実行する

% time ./chalow -o blog –8 -c cl.conf changelog.txt

2011-05-13 atyks