日記/2017-02-15
2017-02-16 (木) 21:42:28 (1469d)
Pukiwiki:トラックバックの検討、その2。 †
つーわけで、少しずつやってます。
とりあえず、
一度作ったきり放置状態の「はてなblog」を対抗機にして、
まずは『依頼する』側からやってます。
これができれば、『変なリクエストに対するレスポンス』の実動作も見られるので。
[+]→続きを読む。
[-]
方針としては? †
「送信ボタン」を押したらトラックバック送信する、プラグイン。
書式は以下のような感じ。
&tbsend(URL,text,flg);
pukiwiki プラグイン的には 〜inline()とか 〜convert() とかの動きでいうと。
URLが、接続先の記事URL。
text が表示用テキスト。これは省略可能で、その場合 URL文字列が指定されているとみなして動く。
flg はプラグインが勝手につけるもので、ユーザは意識しなくて良い。
上記のように書くと、wiki記事ページ上には以下の2要素が表示される。
- 「text」というホットスポット。クリックすれば URL のページが開く。
- pukiwikiの下記記載と同じように見えるはず。
[[text>URL]]
- pukiwikiの下記記載と同じように見えるはず。
- 「Send Trackback」というボタン。押すとトラックバック送信する。
一度ボタンを押してトラックバック送信すると、プラグイン自身が自分の flgパラメータを「送信済み」状態に変更、ページをリロードする。
「送信済み」であれば、上記「textのホットスポット」は表示されるが、「Sendボタン」は表示されなくなる。
結果、普通に触っている限りにおいては、1つの&tbsend からは1回しかトラックバック送信しない。
トラックバックスパムの対策として、管理者認証が必要に思う。
自由編集できる wiki で「攻撃者が &tbsendを書いてping送信」できてしまうと、攻撃用に悪用されてしまうため。
管理者認証ができるかは要調査。
具体的な設計としては、既存の voteプラグインあたりを参考にしてます。
1つのページに複数置かれるとか、ボタンを押すと元画面を書き換えるとか、そういう振る舞いが近い。
ボタンを押したあとの動き詳細。 †
「送る」ボタンを押したあとの処理。
pukiwiki プラグイン的には 〜action() の処理。
こんなアルゴで実装中。
- プラグインで指定された「リンク対象のURL」を取得。
- 上記URL先に接続、対象記事 Get。
- もし当該記事がなければ、エラー。
- 取得した記事内を解析し、rdf領域内にある「trackback:ping=xxxx」で指定されるURLを取り出す。
- もしなければ、トラックバック未対応と判断して送らない。
- trackback URL にtrackback ping送信。
- ping 結果のレスポンス解析、OKかどうかチェック。
- Okなら、前述の通り、プラグイン部分に「送信済み」フラグを反映する。
- エラー動作は未定。
というわけで、現時点での進捗。 †
実は、基本的なメカニズム部分は作成・テスト済みで、以下のようなことはできています。
- 最初の表示(URLリンクとボタン表示)処理。
- ボタンを押したあと、フラグを書き換えて「ボタン表示しない」状態になる仕組み。
- ただ voteプラグインベースで作ったので inline ではなくブロックプラグインになっている。
「どの位置のプラグインか」の特定処理は attachref()を参考に見直したほうがよい。
- ただ voteプラグインベースで作ったので inline ではなくブロックプラグインになっている。
- 送信処理の基本メカニズム。
- 実際に「はてなブログ」へのトラックバック送信には成功してます:
そちらの記事で「トラックバック受領、承認待ち」の状態になったことを確認できた。 - 具体的な実装としては:rdfの(簡易)解析→URL取得実施と、上記URLへの送信。
- 実際に「はてなブログ」へのトラックバック送信には成功してます:
以下、いくつかは前述とかぶりますが、今後のToDo。
- プラグイン自体の inline()化。
- これができないと、1行に複数のURLを書けない。
- 「送信」を管理者のみ実施可能にする。
- これがないと、トラックバックスパムへの悪用ができてしまう。
- 別の言い方をすると、このプラグインを置く場合には、少なくとも「特定の管理者」の定義を必須にするつもり。
- ページをincludeされた状態でのトラックバック送信への対処仕様の検討・決定
- 例えば友瀬の日記ページのように『複数の日記をまとめて表示』するような画面がある。
ここにおいてトラックバック送信がどう動くべきか。 - 本質的には「元ページのURL」で送信するのが筋。
だがたぶん「まとめたページのURL」で送ってしまうと思う。
- 正直ここについては、管理者の人的責務でやるしかないと思っている。
- 正直ここについては、管理者の人的責務でやるしかないと思っている。
- 例えば友瀬の日記ページのように『複数の日記をまとめて表示』するような画面がある。
- 相手サーバの trackbackping URLの解析方法の追加改善
- 仕様上は
『<.... trackback:ping="http://---"; ....>』
となっているが。
「はてな」では『< .... trackback:ping="http://---" ....>』
となっていて、多少緩い。
検索正規表現だけの話なので、やればいいだけではあるかも。
- 仕様上は
- トラックバックping 仕様自体の隙間に関わる部分への対応決定
- 明確な定義がないので、「自分ルール」でもできちゃうけど・・・という部分。
実際、2/15時点でのテスト版では、自分のブログ対象なのをいいことに、わりといい加減な内容で送っている。 - 「記事概要」の文字コードについて。統一された仕様がないっぽい。
- 例えば EUC で送っていいのか。UTF-8 MUSTなのか。
現状友瀬の wiki がEUCなので、ちょっと悩む。
RSSなど UTF-8で作るのが前提なので、それにあわせるのが筋っぽくはある。
- 例えば EUC で送っていいのか。UTF-8 MUSTなのか。
- 「記事概要」の内容。
- 本文を250文字くらいでぶった切るのがデファクトっぽいけど、それもどうよ。
- 明確な定義がないので、「自分ルール」でもできちゃうけど・・・という部分。
- トラックバックURLを利用者が直接指定する方式は必要か。
- 「はてな」ではそんな感じの機能があった。
- パラメータを指定すれば実現は簡単なので、決めるだけではある。
- 「Blog Name」の内容。
- pukiwiki開発室談義のメモでは「システム名でいいんじゃね」的なことがあるが、ほんとにそれでいい?
素直に「呼び出すブログの名前」じゃないのか。
もしシステム名でよいとしても、「3rdベンダー製」であるプラグインが「pukiwiki」を名乗るのはまた問題。
- pukiwiki開発室談義のメモでは「システム名でいいんじゃね」的なことがあるが、ほんとにそれでいい?
- 各種通信エラーの扱い
- 捨てちゃってもいいんだけど、残す意味があるかな。
意味があるなら、例えば元ページのソース内にコメント形式で残す、という手は使えないこともない。 - 「トラックバック未サポートでした」は残す意味があるかもしれない。
- 前述の「トラックバックpingURLを直指定」の機能との兼ね合い。
少なくとも「はてな」は(理由不明だが)rdfの自己解析をしていない節がある。
rdf 記載なしand/or rdf解析でトラックバックpingが読み取れないようなときに、という可能性は・・・あるのかなぁ。
- 前述の「トラックバックpingURLを直指定」の機能との兼ね合い。
- 捨てちゃってもいいんだけど、残す意味があるかな。
ご意見などがあれば。
Link: 日記/2017-02-16(1469d)