Google Apps Scriptを使用して小説家になろうの作品をWayback Machineに自動でアーカイブする


はじめに

自動で小説家になろうの作品をアーカイブに追加するスクリプトをpythonで書いたが、
いちいち自分で起動しなければならず、面倒くさい。

そこで、Google Apps Scriptを使用して、
毎日決まった時間に小説家になろうの作品を自動でWayback Machineにアーカイブに追加するようにした。

やったこと

1.payloadの分析
2.Wayback Machineの分析
3.スクリプト
4.スケジューリング

1.payloadの分析

htmlのサイトにリクエストする際、GETパラメータを送ることがある。
これについてまったく知識がなかったのだが、

によれば、urlの最後に書けばいいらしい。
つまり、
payload = {'out': 'json','gzip':5, 'rtype':day }

?out=json&gzip=5&rtype=day
をurlの最後につければいいということだ。

つまりこのurlにアクセスすればよい
https://api.syosetu.com/rank/rankget/?out=json&gzip=5&rtype=20200304-d
パラメータはこれを参照した。

2.Wayback Machineの分析

こちらにも書いた方法だと、いちいちサイトにアクセスしなければならない。

urlを分析したところ、

'https://web.archive.org/save/' + 保存したいurl
にアクセスすると、urlのサイトをアーカイブし、結果のページに飛ぶことが分かった。
結果のページに飛ぶ分、時間がかかってしまうのが問題点だが、
いちいちセーブのページに移動して、urlを入力してボタンを押す手間が省けた。

3.スクリプト

gasの使い方などはほかのサイトのほうが詳しいので調べてください。

narou_wayback.js

function get_narou(mode){

  var now = new Date();  
  var date = Utilities.formatDate(now, 'Asia/Tokyo', 'yyyyMMdd');
  var day = date + '-' + mode
  Logger.log(day)
  var payload = "?" + 'out=json'+ "&" + 'gzip=0'  + "&" + 'rtype=' + day;
  Logger.log(payload)

  var url = "https://api.syosetu.com/rank/rankget/" + payload
  Logger.log(url)

  var responseDataGET = UrlFetchApp.fetch(url).getContentText('UTF-8');
  Logger.log(responseDataGET);


  var contentJson = JSON.parse(responseDataGET) 
  return contentJson;
}






function wayback(url){
  var pdf_url = 'https://web.archive.org/save/'+url
  Logger.log(pdf_url)
  var options = {
    "muteHttpExceptions": true,     // 404エラーでも処理を継続する
  }
  var responseDataGET2 = UrlFetchApp.fetch(pdf_url, options);
  var code = responseDataGET2.getResponseCode();
  Logger.log(code);
  //Logger.log(responseDataGET2.getContentText('UTF-8'));
  Logger.log("--------------------------------------------")

}


//

function narou_wayback(mode){
  contentJson=get_narou(mode);
  for (let i=0; i<contentJson.length; i++){
    var url = "https://pdfnovels.net/" + contentJson[i].ncode +"/main.pdf";
    Logger.log(i+ "番目 "+ contentJson[i].ncode)
    wayback(url)
  }
}






//modeは日間の場合はd,週間の場合はw,月間の場合はmが、四半期の場合はqが入ります。

//+制約+
//・2013年5月1日以降の日付を指定してください。
//・週間を取得する場合、日付は火曜日の日付を指定してください。
//・月間、四半期を取得する場合、日付は1日を指定してください。

//また、「小説を読もう!で公開しているランキング」の日間ランキングは1日3回更新されていますが、このAPIでは午前4時~午前7時に作成した日間ランキングのみを蓄積しAPIで提供しています。 予めご了承願います。
function day(){
  narou_wayback("d")
}

function week(){
  narou_wayback("w")
}

function month(){
  narou_wayback("m")
}

function quarter(){
  narou_wayback("q")
}





(qiitaがgasに対応していないみたいなので.jsにしています。)

解説

1.get_narou(mode)でランキングを取得し、jsonで返す。
2.jsonから小説ごとに割り当てられているncodeを取得し、urlを作成する
3.wayback(url)に順番に入れて、アーカイブを登録する。

参考にしたサイト

4.スケジューリング

さらにトリガーを使用して決まった時刻に動くようにしました。
トリガーを追加を押して、

このように設定しました。

問題点

これによれば、

+制約+
・2013年5月1日以降の日付を指定してください。
・週間を取得する場合、日付は火曜日の日付を指定してください。
・月間、四半期を取得する場合、日付は1日を指定してください。
詳しくは制約についてをご覧ください。

とある。
今回のスクリプトでは、実行時の日付を使用して小説家になろうAPIにアクセスしているため、
週間、月間、四半期を毎日アーカイブすることができず、
スケジュール設定で毎週、毎月指定の日程に実行するようにしているので、そこをいつか改善したい。

このように実行時間は6分までらしい。