so-netのスマホ向けテレビ番組表「CHAN-TORU」がJSON形式でデータを渡してくれるのに気が付いた。それでGASで取得すれば何か面白そうなことができそうだと思って、試しにコードを書いてみた。SONYはレコーダーを作っているからグループ内でこのようなサイトがあるのだろうと想像している。
class http_access { constructor() { this.cookies = []; } get_page (url) { var options = { "method" : "get", }; var headers = {}; var str = ""; for(var s in this.cookies) str += Utilities.formatString("%s=%s;", s, this.cookies[s]); if (str.length > 0) { headers["Cookie"] = str; options["headers"] = headers; } var response = UrlFetchApp.fetch (url, options); var setcookie = response.getAllHeaders()["Set-Cookie"]; if (typeof (setcookie) != "undefined") { if (typeof (setcookie) == "string") { var temp = setcookie; setcookie = []; setcookie[0] = temp; } for(var i = 0; i < setcookie.length; i ++) { var temp = setcookie[i].split(";")[0]; temp = temp.split("="); this.cookies[temp[0]] = temp[1]; } } return response; } } function test_entry () { var http = new http_access (); var resp = http.get_page ("https://tv.so-net.ne.jp/chan-toru/index"); console.log ("status = " + resp.getResponseCode()); var text = resp.getContentText(); console.log (text); Utilities.sleep (2 * 1000); resp = http.get_page ("https://tv.so-net.ne.jp/chan-toru/login?theme=cht"); console.log ("status = " + resp.getResponseCode()); text = resp.getContentText(); console.log (text); Utilities.sleep (2 * 1000); resp = http.get_page ("https://tv.so-net.ne.jp/chan-toru/trial/loginFinish?mode=trial"); console.log ("status = " + resp.getResponseCode()); text = resp.getContentText(); console.log (text); Utilities.sleep (2 * 1000); var now = new Date (); var url = "https://tv.so-net.ne.jp/chan-toru/tvsearch?op=bytime&span=24&category=1&start=20200315050000&_=" + now.getTime (); console.log ("url = " + url); resp = http.get_page (url); text = resp.getContentText(); try { var program = JSON.parse (); console.log ("start = " + program['header']['index']['start']); } catch (e) { console.log ("error " + e); console.log (text); } }
UrlFetchApp.fetch をラッピングして、cookieの処理を追加したのだが、これを実行するとJSONのパースでエラーになってしまう。何が起きているのだろうと思い、HTTPで返されたデータを見てみると、
CHAN-TORUは以下のブラウザをサポートしています
パソコン:Internet Explorer9以降、Firefox、Chrome、Safari
スマホ、タブレット:MobileWebkit採用ブラウザ(iOS Safari,Androidブラウザなど)
となっていた。GASはuser-agentの値を変更できないようなので、これではデータを取得できない。世の中甘くないか。NHKのサイトがGASからのアクセスを許容しているのが例外的なのかな。