多くのコンテンツサイトには、テキストをコピーすると元記事のURLを自動で付けてくれる仕組みがあります。たとえば魔境歌詞網や知乎などです。中にはテキストのコピーを一切禁止しているサイトもあります。こうした機能の実装は難しくなく、数行の簡単なJavaScriptで済みます。ただ、その前にサイトに本当に必要な機能なのかを考えるべきです。通常の訪問者がテキストをコピーしてFacebookに貼り付けたとき、それは本当にサイトの害になるのでしょうか。また、訪問者によるコピーを本気で防ぎたいなら、こうした方法は「君子は防げても小人は防げない」というもので、本当に正直者だけを防げるにすぎません。それで利益を守れているのでしょうか、それとも、サイトを使いにくくしているだけなのでしょうか。
私は、コピーを禁止するのは必要ないと考えています。サイトの内容をコピーする人は2種類に分かれます。記事を盗む悪意のある人と、テキストを共有するためにコピーする通常の訪問者です。現在の技術では、悪意のある人を効果的に防ぐことはほぼできません。唯一の方法は、すべての文字を画像にすることですが、それではサイトのSEOが大きく落ち込み、モバイル端末でも「極めて使いにくい」ものになってしまいます。一方、通常の訪問者が共有目的でテキストをコピーしても、サイトのアクセスが減るわけではありません。むしろアクセス増加に役立つので、積極的に歓迎すべきです。コピー禁止は、ユーザーにとって大きな不便をもたらすだけです。
サイトによっては、コピーされたテキストの末尾に「版権所有,翻印必究(無断転載を禁じます)」を付けるところもあります。これはコピー禁止ほど強硬ではありませんが、本当に必要かどうかはやはり慎重に考えるべきです。今の時代に、過去の保護的な発想にとらわれ続けることはできません。むしろ逆に考えて、より多くの人が情報を得られるようにし、共有を通じて成長していくことを目指すべきだと思います。
最も大切なのは、サイトを運営する目的を考えたうえで、コピー禁止機能が必要かどうかを判断することです。また、技術がどれほど優れていても、「君子は防げても小人は防げない」ということを忘れないでください。最も恐れるべきは、悪意のある訪問者を防げないまま、善意の訪問者にとってサイトを使いにくくしてしまうことです。技術の面から一度離れて、法律面での対応や、ビジネス面での防火壁づくりを考えてみてください。
ここでは、知乎の方法をおすすめします。訪問者がテキストをコピーすると、次のような文章が先頭に追加されます。
作者:侯翔宇 リンク:https://www.zhihu.com/question/40502548/answer/86972830 出典:知乎 著作権は作者に帰属します。転載する場合は、作者に連絡して許可を得てください。ただし、どのテキストをコピーしても追加されるわけではありません。一定の文字数以上をコピーしたときだけ表示されます。ユーザーが短い一行を自分のブログにコピーしたときは、版権の文章は煩わしく感じられるでしょう。しかし、大きな文章をまとめてコピーし、Facebookやブログで共有するときであれば、私個人としては、このような攻撃的ではない注意書きならむしろ喜んで受け入れ、記事の末尾に残しておくか、そのままにしておくと思います。ユーザーがSNSで共有したとしても、アクセスを知乎に呼び戻すことができます。
ポイント:
- コピー禁止や版権テキストの追加が本当に必要かを考える。
- 版権テキストは、コピーされた文字数が多いときだけ表示する。
- 自動で追加するテキストには、必ず記事のURLを含める。
- 攻撃的ではない注意メッセージにする。
コピーを禁止する
おすすめはしませんが、まずはコピーを禁止する方法を見てみましょう。ここでは、右クリックを無効にするという愚かな方法ではなく、oncopy イベントを遮断する方法を採用しています。右クリックの禁止は、訪問者にとって本当に迷惑な仕組みです。document.body.oncopy = function(e) {
return false;
}これは jQuery の preventDefault() と同じことです。注意メッセージを追加する
注意メッセージの追加も、同じく oncopy イベントを使います。イベントの引数 e には e.clipboardData.setData() があり、コピーされるテキストを変更できます。ユーザーがコピーしたテキストに注意メッセージを加えるだけです。ただし、セキュリティ上の理由から、ブラウザはクリップボードの内容を取得させてくれません。そのため、window.getSelection() を使って、ユーザーがコピーした内容(つまり選択されたテキスト)を取得する必要があります。document.body.oncopy = function(e) {
var notice_text = "\n部落格:https://coder.tw \n 謝謝分享";
var origin_text = window.getSelection();
e.clipboardData.setData(“text/plain”, origin_text + notice_text);
return false;
}
最後にも preventDefault を使います。oncopy イベントはコピーが行われる前に発生するため、preventDefault を呼ばないと、クリップボードの内容を設定しても元のテキストで上書きされてしまいます。clipboardData.setData の第1引数は、形式を指定するものです。
window.getSelection() が返すのは String ではなく Selection オブジェクトです。訪問者は画像や書式付きのテキストなどもコピーする可能性があるためです。コピーされた文字数を計算したい場合は、toString で文字列に変換してから数えます。例えば次のようにします。
window.getSelection().toString().length