3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Discord BotでYoutubeの情報を取得する

Last updated at Posted at 2024-11-12

概要

PCではコピペでいいのですが、スマホユーザーはコピペをする際にアプリ離脱してしまうので、
リアルタイムでフレンドと情報の共有をするためにDiscordのみで完結するBotを作成します。

Discord.js v13
Node.js v22

1.Discord Botの準備

Discord Botを用意します
作成方法やトークンの払い出し方法は公式にも記載されているので割愛します。
参考

2.Nodeのインストール

Nodeをインストールします
LTS版で問題ありません。

3.Discord.jsのインストール

コンソールより下記コマンドを叩きます。

# npm
npm i discord.js

# yarn
yarn add discord.js

4.Youtube APIの用意

https://console.cloud.google.com/apis/dashboard

より「プロジェクトを作成」をクリックします。

image.png

② 任意のプロジェクト名を入力します。
image.png

③ 作成後のプロジェクトから「APIとサービスを有効にする」をクリック
image.png

④ API一覧画面の検索欄に「youtube」と入力すると「Youtube Data API v3」が出てくるので選択
image.png

⑤ API詳細の「有効にする」ボタンをクリック
image.png

⑥ API一覧から「Youtube Data API v3」の「認証情報を作成」をクリック
image.png

⑦ 「一般公開データ」を選択して「次へ」をクリック
image.png

⑧ 認証キーが払い出しされるのでメモしておきます。
image.png

5.Discord Botの実装

ひとまずindex.jsに記載します。
YouTubeとDiscordのキーとIDをそれぞれ書き換えます。
(運用する際にはキーなどはenvファイルに移動しましょう。)


const { Client, Intents } = require('discord.js');
const client = new Client({
     intents: [
        Intents.FLAGS.GUILDS,
        Intents.FLAGS.GUILD_MESSAGES,
        Intents.FLAGS.GUILD_MEMBERS,
        Intents.FLAGS.GUILD_MESSAGE_REACTIONS]
    }
);

const fetch = require('node-fetch');

client.login("!!!DiscordのアプリケーションID!!!");

client.on('ready', async () => {
    console.log("deploy done...")
})
client.on('messageCreate', async msg => {

    const ytUrlPattern =/^http(s)?:\/\/(www.youtube.com\/watch\?|m.youtube.com\/watch\?|youtube.com\/watch\?)(\w+)|^https\:\/\/youtu.be\//

    if (!msg.content.match(ytUrlPattern)) {
        return
    }

    const key = "!!!YOUTUBEから払い出されたAPIキー!!!"
    const url = new URL(msg.content.replace("`","'").split(/\n/)[0]);
    const params = new URLSearchParams(url.search);
    const ytid = params.get("v") // 動画ID

    // 動画のURLに続けてメッセージを打つ場合があるのでケアする。
    if (!ytid) {
        var afterSlash = msg.content.split("/")
        ytid = afterSlash.slice(-1)[0]
        // 改行を含んでいたら更にsplit
        if (ytid.match(/\r\n|\n/)) {
            ytid = ytid.split(/\r\n|\n/)[0]
        }
    }

    // APIの固定URL
    var apiUrl = 'https://www.googleapis.com/youtube/v3/videos';
    // レスポンスに含める情報を指定
    // 増やしたい場合は個々に追加する
    // @see https://developers.google.com/youtube/v3/docs/search/list?hl=ja
    apiUrl += '?part=snippet,contentDetails,statistics,status'; 
        
    // 取得する動画IDを指定
    apiUrl += '&id=' + ytid; 
    // APIキーを指定
    apiUrl += '&key=' + key; 

    // 概要欄を取得する
    // その際には整形
    const response = await fetch(apiUrl, {
        method: 'get',
    })
    if (response.status == 200) {
        const json = await response.json()
        if (json.items.length) {
            if (json.items[0].snippet.description) {

                // DiscordのMarkDown記法で装飾する。
                const head = "```diff\n\n";
                const title = json.items[0].snippet.title
                const reporter = json.items[0].snippet.channelTitle
                const desc = json.items[0].snippet.description.replace("`","") + "\n\n" + "---動画の概要ここまで---"
                const publishedDate = new Date(json.items[0].snippet.publishedAt)
                 // // 装飾終わり
                 var hood = "```"

                 var replyEmb = {
                    author: {
                        name: reporter,
                    },
                    title: title,
                    url: `${msg.content.split(/\n/)[0]}`,
                    name: `投稿者:${reporter}`,
                    description: head + "---動画の概要ここから---\n\n" + desc + hood,
                    color: 0x2ecc71,
                    footer: {
                        text: `${publishedDate.getFullYear()}/${publishedDate.getMonth() + 1}/${publishedDate.getDate()} ${("0" + publishedDate.getHours()).slice(-2)}:${("0" + publishedDate.getMinutes()).slice(-2)}に投稿された動画`
                    },
                }
                await msg.reply({ embeds: [replyEmb] }).catch(err => console.log(err))
            }
            else {
                await msg.reply({ content: "この動画には概要欄に説明がありません!", ephemeral: true }).then((res) => {
                    discord.delete(msg, res, 3000)
                }).catch(err => console.log(err))
            }
        }
    }
})

6. 動作確認

コンソールより下記コマンドを叩きます。

npm run node

コンソールに「deploy done...」と出力されたら起動できているので、Botを参加させたサーバーで任意のYouTubeURLを打ち込みます。

image.png

image.png

動画の概要欄などを取得することができました。

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?