1. ホーム
  2. Web制作
  3. html5

h5 web透かしSDKの実装コード例

2022-01-31 09:15:53

Webサイトの閲覧において、ユーザーがスクリーンショットを撮ったり、出所を追跡した上で機密情報が露出する画面を録画することを防ぐために、Web透かしが必要になることがよくあります。例えば、ネイルソフトをよく利用しますが、チャットの背景には自分の名前が表示されます。では、どのようにWeb透かし効果を実装するのでしょうか。

ウェブ電子透かしSDK、実装のアイデア

1. 名前、ニックネーム、IDなど、現在のユーザーについてより取得した情報を含む透かしを生成できること。
2. ウィンドウ全体を覆い、他の要素に影響を与えないようなCanvasを生成する
3. フォントの間隔、サイズ、色などを変更することができます
4. Jqueryへの依存なし
5. ユーザーが手動でこのCanvasを削除できないようにする必要があります。

実装分析

初期パラメータ

size: font size
color: font color
id: canvasId
text: text content
density: spacing
clarity: clarity
supportTip: Text tips not supported by Canvas

キャンバスを生成する

キャンバスのサイズはwindow.screenのサイズになります。

キャンバスは可視ウィンドウに固定され、z-indexは-1です。

  let body = document.getElementsByTagName('body');
    let canvas = document.createElement('canvas');
    canvas.style.cssText= 'position: fixed;width: 100%;height: 100%;left:0;top:0;z-index: -1;';
    body[0].appendChild(canvas);

フィンガープリント生成アルゴリズム

 let canvas = document.getElementById(this.params.id);
      let cxt = canvas.getContext('2d');
      let times = window.screen.width * this.params.clarity / this.params.density;// horizontal text fill times
      let heightTimes = window.screen.height * this.params.clarity * 1.5/ this.params.density; // vertical text fill times
      cxt.rotate(-15*Math.PI/180); //tilt the canvas
   
      for(let i = 0; i < times; i++) {
        for(let j = 0; j < heightTimes; j++) {
          cxt.fillStyle = this.params.color;
          cxt.font = this.params.size + ' Arial';
          cxt.fillText(this.params.text, this.params.density*i, j*this.params.density);
        }
      }

ユーザーが削除できないようにする

タイマーを使って一定時間ごとに指紋の有無を確認する

  let self = this;
    window.setInterval(function(){
    if (!document.getElementById(self.params.id)) {
    self._init();
    }
    }, 1000);

プロジェクトのコンパイル

glupを使ったコンパイル

  var gulp = require('gulp'),
        uglify = require("gulp-uglify"),
        babel = require("gulp-babel");
    gulp.task('minify', function () {
        return gulp.src('. /src/index.js') // the js file to be minified
        .pipe(babel())
        .pipe(uglify())
        .pipe(gulp.dest('. /dist')); //compressed path
    });

フィンガープリント効果

エフェクトアドレス

https://tianshengjie.cn/apps/web_fingerprint

プロジェクトアドレス

Github https://github.com/Jay-tian/web-fingerprint
Npmのパッケージです。 https://www.npmjs.com/package/web-fingerprint

以上、本記事の全内容をご紹介しましたが、皆様の学習のお役に立てれば幸いです。また、Script Houseをより一層応援していただければ幸いです。