前回はNode.jsとExpressとAzure.CognitiveServicesでつくる顔検出アプリを作成しましたが、料金は完全無料ではありません。そこでこれをWeb上に公開してしまうと他の人にバンバン使われて、料金は自分払いになるという憂き目にあうこともあります。
そこで前回の実行時間を記憶しておいて一定時間が経過しないと使用できなくしてしまいましょう。それでは不便だって? だったら自分で作りましょう(← 超上から目線)。
短時間で何度も実行できなくする
こんな関数をつくります。引数は関数の名前と最低空けたい時間(ここでは「分」)です。関数が実行されたら関数名のテキストファイルを作成します。次に関数が呼び出されたらテキストファイルに記録してある時間と比較して実行を許可するか拒否するかを決めます。
初回実行のときはテキストファイルは存在しないので例外が発生します。そのため例外処理をしてあります。
顔検出アプリの動作確認はこちらからお願いします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
function IsUseShortInterval(functionName, minutes){ let oldValue = 0; let filePath = functionName +'.txt'; try{ // テキストファイルは存在しないかもしれない let nowText = fs.readFileSync(filePath); oldValue = Number(nowText); } catch{ console.log("例外"); } // 現在時刻を取得する let now = new Date(); // 1970 年 1 月 1 日 00:00:00 UTC から現在までの経過時間をミリ秒で表した数値を取得 let newValue = now.getTime(); // 前回実行時との経過時間の差の単位を分に変換 let passedMintes = (newValue - oldValue)/1000/60; // 制限時間内に関数が呼び出された。 if(passedMintes < minutes) return true; // 関数の実行を許可した場合はその時刻をテキストファイルに記録する fs.writeFileSync(filePath, now.getTime().toString()); return false; } |
顔検出の処理を制限したいので以下のようにします。一度実行すると15分間使えません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
async function GetResponseFaceResult(req, res, obj){ obj.page_title = '顔認識の結果'; // ファイルが選択されていなかった場合はノーカウント if(req.file == null){ obj.main_content = 'ファイルが選択されていません。'; let content = ejs.render(index, obj); res.writeHead(200, {'Content-Type':'text/html'}); res.write(content); res.end(); return; } let filePath = req.file.path; // 一度実行すると15分間は処理を行なわない let intervalMinutes = 15; if(IsUseShortInterval('GetResponseFaceResult', intervalMinutes)){ obj.main_content = intervalMinutes + ' 分以上空けてください'; let content = ejs.render(index, obj); res.writeHead(200, {'Content-Type':'text/html'}); res.write(content); res.end(); fs.unlink(filePath, function(err){}); return; } // ここから下は同じ try { let detected_faces = await DetectFaceExtract(filePath); let result = await GetFacesResultContent(filePath, detected_faces); obj.main_content = result; } catch (e) { obj.main_content = '例外が発生しました'; } let content = ejs.render(index, obj); res.writeHead(200, {'Content-Type':'text/html'}); res.write(content); res.end(); fs.unlink(filePath, function(err){}); } |
それから一度実行すると15分間使えないならそのようにページに書くべきです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
function GetResponseFaceTest(req, res, obj){ obj.page_title = '顔認識の実験'; let now = new Date(); let passedSeconds = 0; // 前回実行時からの経過秒 let intervalMinutes = 15; try{ // ファイルから1970 年 1 月 1 日 00:00:00 UTC からの経過時間を求め、 // ここから前回実行時からの経過秒を求める let timeText = ''; timeText = fs.readFileSync('GetResponseFaceResult.txt'); passedSeconds = Math.round((now.getTime() - Number(timeText))/1000); } catch{ // 例外がおきるのはおそらくファイルが存在しないから。 // 初めて処理が行なわれるので前回実行時からの経過秒には大きめの数値をいれる console.log('例外'); passedSeconds = 3600 * 24; } let canUseText = ""; // もし前回実行時からの経過秒のほうがintervalMinutes * 60を上回っていれば // 動作制限をする必要はない // そうでないなら待ち時間を表示する if(passedSeconds > intervalMinutes * 60) canUseText = 'いまなら使用可能です。'; else{ let waitSeconds = intervalMinutes*60 - passedSeconds; let minutes = Math.round(waitSeconds/60); canUseText = `あと <strong class = "red">${minutes} 分 ${waitSeconds%60} 秒</strong> お待ちください。`; } let str = ` <p>画像をアップロードしてください。 ただし前回実行から${intervalMinutes}分以上経過しないと処理はおこなわれません。</p> <p>${canUseText}</p> <form action="face-result" method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> `; // ここから下は同じ obj.main_content = str; let content = ejs.render(index, obj); res.writeHead(200, {'Content-Type':'text/html'}); res.write(content); res.end(); } |
顔検出アプリの動作確認はこちらからお願いします。