【JavaScript】YouTubeのドラフトを一括公開するコード(2025年3月)

ユウゴウパズル』の攻略動画を70本以上 Youtubeにアップしたんですが、「いちいち公開ボタン押すのテソい!(鹿児島弁でめんどくさい)」と思って検索したところ、コードで解決できるという記事が。
それを元に、ChatGPT の手も借りつつ自分の設定に変えたり、追記をしてみました。

Youtube Studio ドラフト一括変換.js タイトル画像

概要

YouTubeスタジオのドラフト(下書き)を、一括で公開にします。

  • JavaScript
  • Google Chrome (F12キーを使う)
  • 2025/03/12 自分で使って確認

こちらを参考に、いじったものになります:

私の設定

  1. 視聴者:子供向けではない

    子供向け/子供向けではない、どちらかを先に設定しないと、公開設定のページに進めない。

  2. 公開

    非公開/限定公開ではありません。

やり方

1. Youtubeのドラフトがある場面を開く。 2. F12キーを押す 3. Consoleタブを選ぶ 4. > のすぐうしろをクリック

⑤ 下のコードをコピペ

「 > 」部分にテキスト入力できるので、下のコードをコピぺ

⚡ペーストできない

こんな警告が出て、ペーストできない時:

Warning: Don’t paste code into the DevTools Console that you don’t understand or haven’t reviewed yourself. This could allow attackers to steal your identity or take control of your computer. Please type ‘allow pasting’ below to allow pasting.

「 理解してないコードを貼り付けないでね。悪い奴が情報盗んだり操作したりするからね。貼り付けたいなら、allow pasting と打ってね 」

ということなので、ペースト可能にするには allow pasting と手打ちすればOK。むやみやたらにコピペするのは、リスクがあるからねーという注意書きです。

editDraft = async () => {
  return new Promise ((resolve) => {
    document.querySelector("#row-container > div:nth-child(8) > ytcp-video-list-cell-actions > div > ytcp-button.edit-draft-button.style-scope.ytcp-video-list-cell-actions").click();
    setTimeout(() => resolve(), 3000);
  });
};

activateNotChild = async () => { // 視聴者:子供向けではない
  return new Promise ((resolve) => {
    document.querySelector("#audience > ytkc-made-for-kids-select > div.made-for-kids-rating-container.style-scope.ytkc-made-for-kids-select > tp-yt-paper-radio-group > tp-yt-paper-radio-button:nth-child(2)").click();
    setTimeout(() => resolve(), 3000);
  });
};

activateLastStep = async () => { // 公開設定へ
  return new Promise ((resolve) => {
    document.querySelector("#step-title-3").click();
    setTimeout(() => resolve(), 3000);
  });
};

activatePublic = async () => {
  return new Promise ((resolve) => {
    setTimeout(() => {
      let publicButton = document.querySelector('tp-yt-paper-radio-button[name="PUBLIC"]');
      if (publicButton) {
        publicButton.click();
        console.log("✅ 公開ボタンをクリックしました!");
        resolve();
      } else {
        console.error("❌ 公開ボタンが見つかりません!");
      }
    }, 3000); // 3秒待機
  });
};

doneEdit = async () => {
  return new Promise ((resolve) => {
    document.getElementById('done-button').click();
    setTimeout(() => resolve(), 5000);
  });
};

closeDialog = async () => {
  return new Promise ((resolve) => {
    document.querySelector('#close-button button').click();
    setTimeout(() => resolve(), 5000);
  });
};

publish = async () => {
  await editDraft();
  await activateNotChild();
  await activateLastStep();
  await activatePublic();
  await doneEdit();
  await closeDialog();
};

publishCurrentPageContent = async () => {
  for (i=0; i<50; i++) {
    if (!document.querySelector("#row-container > div:nth-child(8) > ytcp-video-list-cell-actions > div > ytcp-button.edit-draft-button.style-scope.ytcp-video-list-cell-actions")) {
      break;
    }
    await publish();
  }
};

⑥ 下のコマンドをコピペ

  1. 上の長~いコードをコピペしたら、改行。最後に下のコマンドをコピペ

  2. ENTERキーで自動公開スタート!

  3. ページを閉じずに、終わるまで待とう。途中でやめたい時は、タブを閉じる更新

publishCurrentPageContent();

小話

ChatGPT ChatGPT に手伝ってもらいながら作りました。楽しかったー。

me
最後のダイアログが閉じなくて手動になっちゃうよ―
ChatGPT
閉じるボタンのHTML構造を見せてもらえる?
me
こんなんなってますー
ChatGPT
click();で閉じる?id 存在する?aria-disabled='false'?
me
閉じないなー。#close-buttonはある、false
ChatGPT
'#close-button button'でやってみて
me
あ!私も見つけた。await closeDialog();が無いや
me ChatGPT
できたーー!!

ベースは
「Youtube の ページの中から目当てのボタンタグを探して、クリックしてくれー」
なので、仕様が大きく変わらない限りは、ページの HTML/CSS を調べて応用できそう。

例:「視聴者:子供向け」にしたい。
  • 10行目のtp-yt-paper-radio-button:nth-child(2) (1)でいいと思う。

  • もしくは、YouTubeスタジオのチェックボックスで動画を一括選択視聴者を先に指定。で、関連コードをまるごと消す:

    1. 8 - 13行目のactivateNotChild = async () => {から始まる部分。

    2. 53行目のawait activateNotChild();

「 公開ボタンをクリックしました! 」
のログもカットできるけど、せっかく ChatGPT ChatGPT が作ってくれたし、かわいいので残しました。ボタン押したタイミングもわかりやすくて良し。

Next Post Previous Post