Pinterestのnopin

「対策しました!」みたいなニュースが普通に注目されちゃうとかPinterestの勢いはすごいな。「対策」っていうのはおかしい気がするけど(どちらかというとPinterest寄りの目線なので)。それはまぁともかくnopinは実装がおかしい気がしてしょうがない。あまり興味もなかったのでnopinの話は読み流していたため「えっ? alert()?」とか思っただけだった。ちょっと追ってみたところクライアント側のJavaScriptでチェックしてるだけで、実際にはPinterestはnopinをチェックしていないと言って良いと思う。

PinterestのBookamrkletでは以下のようにチェックしているだけだった(読みやすいように整形しておいた)。

var i = document.getElementsByTagName("meta");

for (var g in i) {
  var e = i[g];

  if (e.name && e.name.toUpperCase() == "PINTEREST" && e.content && e.content.toUpperCase() == "NOPIN") {
    window.alert("This site doesn't allow pinning to Pinterest. Please contact the owner with any questions. Thanks for visiting!");
    return
  }
}

なのでBookmarkletの先頭でmeta要素などをざっくり削除するだけでこの部分は通る。

その後はPinterest側は何もチェックしないようなのでnopinを指定しているページの画像も普通にpinできる(自分でnopin仕込んだページを作って試したら出来た)。Pinterestはクライアント側だけでなくサーバー側でもpin先のページをクロールしてnopinをチェックするべきだし、そうでないのなら「pinされたくないならnopin指定すれば良い」などとは言うべきではない。

既にサードパーティ製のpinするツールはいくつかあるし、この人気ならもっと増えていくだろう。それらがちゃんとnopinを見ることを実装するかは誰も保証できないので、Pinterestがサーバー側でnopinをチェックしないままならばnopinは形骸化してしまう。

そもそもクロールしないのにクロールしないとチェックできないmeta要素で意思表示させるというアプローチが間違っている気がする。それに「Webサイト」や「ページ」ではなく「画像ファイル」に対して何らかの意思表示をさせるべきなので、HTTPヘッダーとかファイル名とか埋め込みメタデータとかのが向いてるはず。ただこれらの方法はあまりにもコンテンツ所有者には敷居が高いので、コンテンツ所有者側とPinterest側の実装コストとかを考慮すると、現実的なのはrobots.txt的なnopin.txtとかを用意させるとかなんじゃないかなーと思う。