Open3

Twitter API使ってbot作ったらシャドウBANされちゃった話

あおぽんたんあおぽんたん

どういうBot作ったの?

簡単に言うと にじさんじ に所属しているバーチャルライバーがYouTubeにアップロードした歌ってみた動画の告知ツイートをするBot

どんなツイートをするの?

毎日17時に歌ってみた動画のタイトル、公開時間、視聴URLを含んだツイートをする。
理由は、歌ってみた動画はプレミア公開される場合が多く、公開時間が17時以降になる場合が多いためです。
当日公開される動画がない場合は、何もツイートしません。

なんでシャドウBANされちゃったのか?

現在、明確な理由は分かっていないです...
ただ、色々試してみて「これが原因かも!」と思っている点があります。

あおぽんたんあおぽんたん

外部URLとハッシュタグを同時に使う

原因かもって思っていることは、「外部URLとハッシュタグを同時に使う」ことです。
理由は、

  • シャドウBANされる前に動画のタイトル、公開時間、視聴URL、ハッシュタグを含めて自動ツイートした後、他のTwitterアカウントでハッシュタグ検索したが、ツイートが表示されていなかった。
  • その後、動画のタイトルなどを変えて同時に2回ツイートしたが、そのツイートも表示されていなかった。
  • その後、シャドウBANされているか確認したところ、しっかりシャドウBANされていた...
  • Twitterアカウントを作り直して、今度は、ハッシュタグを除いてツイートした後、他のアカウントから検索するとツイートが表示されていた。
  • ツイートをした後、動画のタイトルなどを変えて同時に2回ツイートしたが、そのツイートも表示されている事を確認した。
  • その後、シャドウBANされているか確認したところ、シャドウBANされていなかった。

以上のことを含めると、外部URLとハッシュタグを同時に使うと、シャドウBANされるのではないかと思う。
しかし、他の人が作ったBotのツイートを見ると外部URLとハッシュタグが付いているものもあるので、まだ色々調べる必要がありそう。

あおぽんたんあおぽんたん

自作Bot ソースコード

import Twitter from "twitter";
import { Status } from "twitter-d";
import { Videos } from ".prisma/client";
import { format_date } from "../get_times";
export default async function (q: { video: Videos[] }) {
  const client = new Twitter({
    consumer_key: process.env.TWITTER_API_KEY || "",
    consumer_secret: process.env.TWITTER_SECRET_API_KEY || "",
    access_token_key: process.env.TWITTER_ACCESS_TOKEN || "",
    access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET || "",
  });
  if (!q?.video) {
    throw "not exist videoId";
  }

  const hashTag = "#にじさんじ #歌ってみた"; // タグは使わない
  console.log("----- video tweet -----");
  for await (const video of q.video) {
    const startTime = format_date({
      date: video.startTime,
      format: "MM/DD HH:mm 公開"
    });
    const msg = `
     [${startTime}]\n${video.title}\nhttps://www.youtube.com/watch?v=${video.id}
   `;
    console.log("videoId=", video.id);
    console.log(msg);
    const res = <Status>(
      await client.post("statuses/update", {
        status: msg
      })
    );
    console.log(res);
  }
  console.log("----- complete -----");
}