GASを使ってネットワークカメラから画像を取得したいと思っていますが、完全にハマってしまいました。
過去の質問↓
①GASでネットワークカメラから静止画を取得したい
②連想配列から値を取り出せない
色々な方にアドバイスを頂き、ようやくダイジェスト認証の2回めのリクエストにチャレンジするところまで来ているのですが、エラーが出てしまいます。
javascript
1function camera(){ 2 var url = "http://グローバルIP****************:ポート番号*********/snapshot.jpg" //ポート開放済み 3 var options = { 4 "method": "GET", 5 "muteHttpExceptions":true 6 }; 7 var firstRequest = UrlFetchApp.fetch(url,options).getHeaders(); 8 Logger.log(firstRequest) 9 //レスポンスヘッダー{Server=, Content-Type=text/html, Content-Length=351, Date=Wed, 24 Feb 2021 07:22:38 GMT, WWW-Authenticate=Digest realm="Network Camera", nonce="9e55a4cbae641acb2d0adb43890abf84", qop="auth"} 10 11 var data = firstRequest["WWW-Authenticate"] 12 var nonce = data.slice(data.indexOf("nonce")+7,-13) //nonceの文字列切り出し 13 var nc = "00000001" 14 var q = "auth" 15 var cNonce = cnonce() 16 var a1 = "admin:Network Camera:パスワード************" 17 var a2 = "GET:/snapshot.jpg" 18 19 //ハッシュ値計算 20 var a1digest = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, a1); 21 var a2digest = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, a2); 22 var responsestr = `${a1digest}:${nonce}:${nc}:${cNonce}:${q}:${a2digest}`; 23 var response = getMD5Hash(responsestr);//16進数32桁の文字列に 24 25 //ヘッダー 26 var headers = { 27 Authorization:"Digest username:admin", 28 realm:"Network Camera", 29 nonce:nonce, 30 uri:"/snapshot.jpg", 31 response:response, 32 qop:q, 33 nc:nc, 34 cnonce:cNonce, 35 algorithm:"MD5" 36 } 37 var options2 = { 38 "muteHttpExceptions":true, 39 "headers":headers 40 }; 41 var secondRequest = UrlFetchApp.fetch(url,options2); 42 Logger.log(secondRequest) //400 - Bad Request 43} 44 45function getMD5Hash(input) { 46 var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, input); 47 var txtHash = ''; 48 for (j = 0; j < rawHash.length; j++) { 49 var hashVal = rawHash[j]; 50 if (hashVal < 0) 51 hashVal += 256; 52 if (hashVal.toString(16).length == 1) 53 txtHash += "0"; 54 txtHash += hashVal.toString(16); 55 } 56 return txtHash; 57} 58 59function cnonce(){ 60 // 生成する文字列の長さ 61 var l = 16; 62 // 生成する文字列に含める文字セット 63 var c = "abcdefghijklmnopqrstuvwxyz0123456789"; 64 var cl = c.length; 65 var r = ""; 66 for(var i=0; i<l; i++){ 67 r += c[Math.floor(Math.random()*cl)]; 68 } 69 return r 70}
もはや何がおかしいのか自分でもよくわからないのですが、特にハッシュ値の計算とヘッダーの記述部分に自信がありません。
他にもおかしいところがありましたらご指摘いただけないでしょうか。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/25 02:16
退会済みユーザー
2021/02/25 02:59