隠居日録

隠居日録

2016年(世にいう平成28年)、発作的に会社を辞め、隠居生活に入る。日々を読書と散歩に費やす

so-netのCHAN-TORUはGASからのアクセスを許さない

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以降、FirefoxChromeSafari

    スマホタブレット:MobileWebkit採用ブラウザ(iOS Safari,Androidブラウザなど)
  • となっていた。GASはuser-agentの値を変更できないようなので、これではデータを取得できない。世の中甘くないか。NHKのサイトがGASからのアクセスを許容しているのが例外的なのかな。