実現したいこと
GASによる投信情報APIでの情報の取得
前提
GoogleスプレッドシートにAPIで取得した情報を書き込みたい。
投信情報API https://www.am.mufg.jp/tool/webapi/
Google Apps Script は必要に迫られて今回初めて使っている。
情報を取得できるのは6~7回に1回程度で理由がわからない。6~7回に1回は成功するというのがまた厄介だ。
ここ一週間ほど毎日ChatGPTに聞いてみたり検索を駆使して色々調べているが解決しない。
code 403 というエラーはどうもアクセス拒否のようで、GASによる海外サーバーから(か、どうかはわからないが)
のアクセスやユーザーエージェントを理由にはじかれているのかなと素人ながら想像している。
Pythonで似たようなコードを書くと今のところ100%取得できる。
GASに原因があるのかなと想像する理由の一つがこれだ。
補足情報が必要であれば、教えてもらえれば調べます。
何か思い当たる方がいらっしゃれば、教えていただけるとありがたいです。
発生している問題・エラーメッセージ
Exception: Request failed for http://developer.am.mufg.jp returned code 403. Truncated server response: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" ... (use muteHttpExceptions option to examine full response) getFundJson @ memo.gs:30 MyFunction @ memo.gs:2該当のソースコード
Google Apps Script
function MyFunction() { jsonData = getFundJson('253266'); let baseDate = jsonData.base_date; baseDate = baseDate.slice(0, 4) + '/' + baseDate.slice(4, 6) + '/' + baseDate.slice(-2); baseDate = Utilities.parseDate(baseDate, 'JST', 'yyyy/MM/dd') let nav = jsonData.nav; let cmpPrevDay = Number(jsonData.cmp_prev_day); let netassets = jsonData.netassets; let result = [ [ Utilities.formatDate(baseDate, 'Asia/Tokyo', 'yyyy/MM/dd'), nav.toLocaleString(), cmpPrevDay, (Math.floor(netassets / 1000000) / 100).toLocaleString() ] ]; let numRows = result.length; // 配列の行数を取得 let numCols = result[0].length; // 配列の1行目の要素数を列数として取得 let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1'); let targetRange = sheet.getRange(9, 2, numRows, numCols); // 起点セル(B9) targetRange.setValues(result); } function getFundJson(fundCode) { let baseUrl = "developer.am.mufg.jp/fund_information_latest/fund_cd/"; let response = UrlFetchApp.fetch(baseUrl + fundCode); let data = response.getContentText(); return JSON.parse(data).datasets[0]; }
毎回ちゃんと成功する Python のコード
import pandas as pd import requests import unicodedata def get_fund_information_by_fund_code(fund_code): base_url = "https://developer.am.mufg.jp/fund_information_latest/fund_cd/" url = base_url + fund_code response = requests.get(url) if response.status_code == 200: return response.json()['datasets'][0] else: print("APIリクエストエラー:", response.status_code) return None def convert_to_halfwidth(text): return ''.join([unicodedata.normalize('NFKC', char) for char in text]) fund_code = "253266" result_json = get_fund_information_by_fund_code(fund_code) print(f'\nファンド名: {convert_to_halfwidth(result_json["fund_name"])}') print(f'ファンドコード: {result_json["fund_cd"]}') print(f'基準日: {pd.to_datetime(result_json["base_date"]):%Y/%m/%d}') print(f'基準価格: {result_json["nav"]:,}') print(f'前日比: {result_json["cmp_prev_day"]}')
試したこと
Pythonでの反応を試したが、同じような問題は発生しなかった。
URLをブラウザのアドレス欄に張り付けてもちゃんと毎回 JSON が表示される。
developer.am.mufg.jp/fund_information_latest/fund_cd/253266
補足情報(FW/ツールのバージョンなど)
ウェブ上のスプレッドシートを使っているので、最新版だと思われる。

回答1件
あなたの回答
tips
プレビュー