0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Twitchで特定の配信者が配信を開始したら自動でコメントしたい

Posted at

はじめに

Twitchで推しが配信を開始したのに見に行けなくてもどかしいこと、ありますよね?
見に行ってコメントを残したかったのに〜ということ、ありますよね?

そんな時に、推しが配信を開始したら自動でコメントできると便利だな() ということで作ってみました。

配信開始の検出

方法

Twitch EventSubを利用する方法

Twitchが提供するイベントサブスクリプション機能「EventSub」を使う方法です。これにより、配信開始イベントをリアルタイムで受信できます。

Twitch Helix APIをポーリングする方法

TwitchのHelix APIを定期的に呼び出して配信状況を確認する方法です。
注意点:
ポーリング間隔を短くするとTwitch APIのレート制限に引っかかる可能性があるため注意が必要です(通常1分程度の間隔が推奨)。

配信開始ごとにリアルタイムで1度だけコメントをしたいので、今回は前者のTwitch EventSubを利用する方法で進めます。

具体的な手順

偉大な先人がまとめてくれているのでそれを参考にしましょう。

https://qiita.com/azumag/items/4575c8147585c329fdf5
https://qiita.com/syakesalmon/items/dabb90a3bf66fb548c81

公式ドキュメント
https://dev.twitch.tv/docs/eventsub/

コメント方法

Twitch IRCの利用

今回はコメント先の配信者が決まっているので、Twitch IRCの仕組みを使うだけで簡易に実現可能です。
https://tmijs.com/#guide

コメント権限・トークンの取得

コメントしたいアカウントの、コメント権限を取得します。
「配信開始の検出」の際に作成したTwitchアプリのclient_idを用いて、同様の方法でトークンを取得します。
今回はコメントをしたいので、scopeにchat:editchat:readを指定します。

認証URLの例

https://id.twitch.tv/oauth2/authorize?client_id={client_id}&redirect_uri=http://localhost:3000&response_type=token&scope=chat:edit+chat:read

トークンの権限の種類については以下を参照ください
https://dev.twitch.tv/docs/authentication/scopes/#chat-and-pubsub-scopes

Twitch IRCを利用したコメント送信

Cloud Functionsを利用する場合の実装例が以下になります。

const tmi = require('tmi.js');
const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json());

// Twitch Bot設定
const TWITCH_BOT_USERNAME = 'your_user_name'; // コメント送信元のアカウント名
const TWITCH_OAUTH_TOKEN = 'oauth:your_oauth_token'; // OAuthトークン
const TARGET_CHANNELS = ["target_channel_name"]; // 配信者のチャンネル名
const COMMENT_CONTENT = "こんにちは!"; // コメントしたい内容

// Botクライアント設定
const client = new tmi.Client({
  identity: {
    username: TWITCH_BOT_USERNAME,
    password: TWITCH_OAUTH_TOKEN,
  },
  channels: TARGET_CHANNELS.concat([]), // 配列の要素の接頭に#が付与されるので複製して使用する
});

async function sendComment(broadcaster_user_login) {
  if ( TARGET_CHANNELS.includes(broadcaster_user_login) ) {
    // コメント送信
    try {
      await client.connect();
      await client.say(broadcaster_user_login, COMMENT_CONTENT);
      console.log('Comment sent successfully');
      } catch (error) {
      console.error('Error sending comment:', error);
      } finally {
      client.disconnect();
    }
  }
}

// 配信開始イベントのハンドリング
app.post('/', async (req, res) => {
  // Twitchからの検証リクエストを処理
  if (req.headers['twitch-eventsub-message-type'] === 'webhook_callback_verification') {
    res.status(200).send(req.body.challenge);
    console.log('Webhook verified');
    return;
  }

  // 配信開始イベントを処理
  if (
    req.headers['twitch-eventsub-message-type'] === 'notification' &&
    req.body.subscription.type === 'stream.online'
  ) {
    console.log('Stream started for channel:', req.body.event.broadcaster_user_login);
  //     {
  //         "subscription": {
  //             "id": "abcdefg123456",
  //             "type": "stream.online",
  //             ...
  //         },
  //         "event": {
  //             "broadcaster_user_id": "123456789",
  //             "broadcaster_user_login": "streamer_name", ← target_channel_name
  //             "broadcaster_user_name": "StreamerName",
  //             "started_at": "2024-12-11T08:00:00Z"
  //         }
  //      }
  //
    await sendComment(req.body.event.broadcaster_user_login);
    res.status(200).send('OK');
  } else {
    res.status(200).send('Unhandled event');
  }
});

exports.twitchStreamStartHandler = app;

終わりに

本当は自動で投げ銭までしたかったけど、IRC経由のコメントでは投げ銭が不可、その他APIを利用しても不可能とのことで残念でした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?