見守りカメラ Qwatch TS-NS110W から Node.js で画像を取得するメモ

プロトアウトスタジオ Advent Calendar 2020 の 21 日目の記事として書いた、見守りカメラ Qwatch TS-NS110W から Node.js で画像を取得するメモです。

見守りカメラ IODATA Qwatch TS-NS110W から Node-RED で画像を取得できた ので Node. js でも試してみました。

digest-fetch を使う

手軽に取れそうだなと思ったのは digest-fetch – npm でした。

npm i digest-fetch node-fetch

digest-fetch は node-fetch に依存しているので digest-fetch と一緒にインストールします。

ソースコードはこちらです。ダウンロードした画像を snapshot-record.jpg として実行した Node.js と同じ階層に保存します。

const DigestFetch = require('digest-fetch');
const fs = require('fs');

async function main () {
  const client = new DigestFetch('username', 'password', { algorithm: 'MD5' });

  const url = 'http://<IPAddress>:<httpPort>/snapshot.jpg';
  
  const options = {};

  let resp = await client.fetch(url, options);
  let dataArrayBuffer = await resp.arrayBuffer();
  fs.writeFileSync(`./snapshot-record.jpg`, new Buffer.from(dataArrayBuffer), 'binary');
  
}

main();

以下のように設定値を対応します。

  • UserName
    • Qwatch 管理画面のログインID
  • Password
    • Qwatch 管理画面のパスワード
  • IPAddress
    • Qwatch のIPアドレス
  • HttpPort
    • Qwatch のAPI用の HTTPポート番号(おそらく5桁)
    • WEBブラウザで入る管理画面である 80 ポートではなく管理画面で確認できるもの

詳しくは 見守りカメラ IODATA Qwatch TS-NS110W から Node-RED で画像を取得できた 記事でもう少し設定値について詳細が書いてあるので参考にしてください。

Digest 認証も色々なアプローチがあるようで、 { algorithm: 'MD5' } のように細かく挙動が決めれるようで素敵です。

request だとこう書く

当初、Digest 通信の探し方が上手にできなかったんですが、最終的に HTTP Authentication の項目で把握できました。

Digest authentication is supported, but it only works with sendImmediately set to false; otherwise request will send basic authentication on the initial request, which will probably cause the request to fail.

ソースコードはこちらです。同じく、ダウンロードした画像を snapshot-record.jpg として実行した Node.js と同じ階層に保存します。


const request = require('request');
const fs = require('fs');
const url = 'http://<IPAddress>:<httpPort>/snapshot.jpg';
const options = {
  'auth': {
    'user': 'username',
    'pass': 'password',
    'sendImmediately': false
  }
};

request.get(url, options).pipe(fs.createWriteStream('snapshot-record.jpg'))

'sendImmediately': false の設定、一発というのが気持ちいいですね。

image

ただ、request ライブラリ Deprecated なので、いずれ使えなくなることを想定して、digest-fetch のような他のライブラリでの書き方も意識しておいたほうが良いと思いました。しかし、よくできてる。request。