エラーメッセージ
https://www.amazon.co.jp のリクエストに失敗しました(エラー: 503)。サーバー応答の一部: <html> <head> <META HTTP-EQUIV="Content-Type" content="text/html; charset=Shift_JIS"> <title> ²Àf𨩯µÄ¢Ü·I </title> <style type="tex...(応答の全文を見るには muteHttpExceptions オプションを使用してください)(行 2、ファイル「コード」)
応答の全文中のコメント
Amazonデータへの自動アクセスについては、api-services-support @ amazon.comにお問い合わせください。
APIへの移行については、https://developer.amazonservices.jp/ref=rm_5_svのMarketplace API、またはhttps://affiliate.amazon.co.jp/gp/advertising/apiのProduct Advertising APIを参照してください。 /detail/main.html/ref=rm_5_acはユースケースの広告用です。
当該エラー発生コード
1function testFunc() { 2 var response = UrlFetchApp.fetch('https://www.amazon.co.jp/dp/4800288487/'); 3}
成功例
1function testFunc() { 2 var response = UrlFetchApp.fetch('https://twitter.com/yuzutadashi2/status/1197741551813685251?s=20'); 3}
実際のコード
1// Amazon商品を取得する 2function getAmazonPrdcts(label, linkUrl, row) { 3 4 // スプレッドシートを取得する 5 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();// Container Bound Script 6 var sheet = spreadsheet.getSheets()[0];// シート数を指定して取得 7 8 // ASINコードを取得する 9 if (linkUrl.match(/dp/.{10}/)) { 10 var asin = linkUrl.match(/dp/.{10}/)[0].replace(/dp/(.{10})/, '$1'); 11 } else if (linkUrl.match(/product-reviews/.{10}/)) { 12 asin = linkUrl.match(/product-reviews/.{10}/)[0].replace(/product-reviews/(.{10})/, '$1'); 13 } 14 15 // 商品ページを設定する 16 var prdct_URL = 'https://www.amazon.co.jp/dp/'+ asin +'/'; 17 18 // Getリクエストのパラメータ 19 var options = { 20 method: "get" 21 }; 22 // 商品ページを取得する 23 var reply = url_Request(prdct_URL, options);// 1. URLそのままを取得 24 var response = reply[0]; 25 var errorMsg = reply[1]; 26 // 商品ページを取得できなかったとき 27 if (response == undefined) { 28 sheet.getRange(row, 5).setValue(errorMsg);// エラーを書き出す 29 return ['', '', '']; 30 } 31 32 // 文字コードを指定して商品ページを取得する 33 var charset = '', src1 = response.getContentText();// 2. 文字列エンコードされた内容を取得 34 if (src1.match(/meta charset="[\s\S]*?"/)) { 35 charset = src1.match(/meta charset="[\s\S]*?"/)[0].replace(/meta charset="([\s\S]*?)"/, '$1') 36 } 37 var src2 = response.getContentText(charset);// 3. 文字コードを指定して内容を取得 38 if (src2.match(/<span id="productTitle" class="a-size-large">[\s\S]*?</span>/)==null) { 39 return ['', '', '']; 40 } 41 var prdctTitle = src2.match(/<span id="productTitle" class="a-size-large">[\s\S]*?</span>/)[0] 42 .replace(/<span id="productTitle" class="a-size-large">([\s\S]*?</span>)/, '$1') 43 .replace(/ /g, '\n').replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&') // [HTML特殊文字] 改行, '<', '>', '&' 表示を 文字変換する 44 .replace(/"/g, '"').replace(/'/g, "'") // '"', "'" 表示を 文字変換する 45 .replace(/‒/g, '‒').replace(/–/g, '–').replace(/—/g, '—').replace(/―/g, '―') // '‒', '–', '—', '―' 表示を 文字変換する 46 .replace(/⁓/g, '⁓').replace(/〜/g, '〜').replace(/〰/g, '〰') // '⁓', '〜', '〰' 表示を 文字変換する 47 .replace(/./g, '.');// '.' 表示を 文字変換する 48 49 // メディアアイコンを設定する 50 var mediaIcon = '????'; 51 52 // ツイート内のユニコードを分解しないように配列に分ける 53 var shortPrdctTitleArray = prdctTitle.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[\s\S]/g) || []; 54 // ツイート44文字(43+'…')に収めて連結する 55 if (shortPrdctTitleArray.length > 44) { 56 shortPrdctTitleArray.splice(43, shortPrdctTitleArray.length-43);// 0開始n番目からn個削除 57 var shortPrdctTitle = mediaIcon + shortPrdctTitleArray.join('').replace(/\s*$/, '') +'…'; 58 } else { 59 shortPrdctTitle = mediaIcon + shortPrdctTitleArray.join(''); 60 } 61 62 // リンクURLを高評価カスタマーレビューページに設定する 63 linkUrl = 'https://www.amazon.co.jp/product-reviews/'+ asin +'/ref=cm_cr_arp_d_viewopt_sr?ie=UTF8&filterByStar=positive&reviewerType=all_reviews&pageNumber=1'; 64 65 // 商品画像URLを取得する 66 var image_URL = ''; 67 if (src2.match(/"mainUrl":".*?"/)) { 68 image_URL = src2.match(/"mainUrl":".*?"/)[0].replace(/"mainUrl":"(.*?)"/, '$1'); 69 } else if (src2.match(/data-old-hires=".*?"/)) { 70 image_URL = src2.match(/data-old-hires=".*?"/)[0].replace(/data-old-hires="(.*?)"/, '$1'); 71 } 72 73 return [shortPrdctTitle, linkUrl, image_URL]; 74} 75 76 77// パラメータを使用してURLを取得する 78function url_Request(url, options) { 79 // URL取得 or FetchAppエラー10回 したら抜ける 80 for (var i=0; i < 10; i++) { 81 try {// 主処理 82 var response = UrlFetchApp.fetch(url, options); 83 } catch (e) {// エラー処理 84 var errorMsg = e; 85 if (e.toString().match(/エラー: 404/)) { break; } 86 Utilities.sleep(7 * 1000);// 7秒 87 } 88 if (response != undefined) { break; } 89 } 90 // URLを取得できなかったら undefined が返る 91 return [response, errorMsg]; 92}
Amazonデータへの自動アクセスについては、api-services-support @ amazon.comにお問い合わせください。
APIへの移行については、https://developer.amazonservices.jp/ref=rm_5_svのMarketplace API、またはhttps://affiliate.amazon.co.jp/gp/advertising/apiのProduct Advertising APIを参照してください。
答えが書いてあるじゃないですか。
あなたの回答
tips
プレビュー