Twilyze blog

主に備忘録

ニコニコ動画のマイリストから「とりあえずマイリスト」へまとめて移動(登録)させる

ニコニコ動画の「とりあえずマイリスト」といえば一時的に動画を登録しておいて、後で通常のマイリストに移すなり消すなりして使う場所です(たぶん)。
そんな用途だからなのか通常のマイリストからとりあえずマイリストへの移動・コピー操作はできません。

一つずつとりあえずマイリストへ登録していくしかないですが面倒なので自動化します。


(普通はこんなことしたいとは思わないはずですが先日必要になったので…)

注意

  • この方法は少なからずサーバーに負担をかけるので混雑時間帯は避けましょう。
    一つ登録する毎に5秒のインターバルを入れてるので大丈夫だとは思いますが自己責任でお願いします。

  • 「自分のマイリスト」から「とりあえずマイリスト」へ登録する方法です
    他の人のマイリストからは登録できません。

やり方

  1. ブラウザはGoogle Chromeを使います
    他のブラウザでもできる気がしますが確認はしてないのであしからず。

  2. とりあえずマイリストに移したいマイリストのページを開きます

  3. F12キーを押してChromeデベロッパーツールを開き、Consoleタブを選択します f:id:Twilyze:20160120055126p:plain

  4. 下のコードをConsole画面に貼り付け、一番上の行を自分のマイリスト番号に書き換えます(番号はURL末尾の数値) f:id:Twilyze:20160120055600p:plain

  5. Enterキーを押すと処理が始まるので終わるまでページは開いたままにしておいてください*1


コピー用

var mylistID = 12345678;  // 移したいマイリスト番号をここに
var index = 0;

var main = function (mylist) {
  var i = index;
  var len = mylist.mylistitem.length;
  var wait = 5e3;
  var addCount = 0;

  var addDeflist = function (i) {
    if (i >= len) {
      clearInterval(id);
      console.info('%cFinish!  登録:' + addCount + '/' + len, 'color: green; font-size: 16px');
      return;
    }

    var item_id = mylist.mylistitem[i].item_id;
    var token = NicoAPI.token;
    var url = 'http://www.nicovideo.jp/api/deflist/add?item_id=' + item_id + '&token=' + token;

    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.onreadystatechange = function () {
      if (xhr.readyState == 4 && xhr.status == 200) {
        var res = JSON.parse(xhr.responseText);
        if (res) {
          var progress = (i + 1) + '/' + len;
          var data = {'item_id': item_id, 'videoID': mylist.mylistitem[i].item_data.video_id};
          if (res.status === 'ok') {
            addCount++;
            console.log('OK:' + progress, data);
          }
          else {
            console.error('ERROR:' + progress, data, res.error);
            if (res.error.code === "EXPIRETOKEN") {
              clearInterval(id);
              console.info('ページ更新後 index を ' + i + ' にして再度実行してください');
              return;
            }
          }
        }
      }
    };
    xhr.send(null);
  };

  console.info('登録件数: ' + len + '件\n処理時間: ' + (len * wait / 6e4).toFixed(1) + '分');
  addDeflist(i);
  var id = setInterval(function () {
    i++;
    addDeflist(i);
  }, wait);
};

if (!isFinite(mylistID)) {
  console.error(mylistID);
}
else {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', "http://www.nicovideo.jp/api/mylist/list?group_id=" + mylistID, true);
  xhr.onreadystatechange = function () {
    if (xhr.readyState == 4 && xhr.status == 200) {
      var mylist = JSON.parse(xhr.responseText);
      if (mylist && mylist.status === 'ok') {
        main(mylist);
      }
    }
  };
  xhr.send(null);
}

参考

*1:件数が多い場合 "期限切れのトークンです" というエラーが出る可能性があります。
その場合はページを更新してスクリプト2行目のindexの値を書き換え、再度実行してください。