💬

discord.js を使ったX(旧Twitter)の展開BOT

2023/12/17に公開
2

環境構築と使用言語

環境構築

npm init -y
npm i discord.js

使用言語

discord.js v14

なにをやるの?

ツイート共有URLをDiscordに送信すると、このようなツイート内容がなんなのかがURLを踏まないと分からないようになっています。

そこで、その共有URLが送信されたら投稿内容を分かりやすく表示させるBOTを作ろう!と、この記事を書いています。

どうやってやるの?

今回は、https://api.vxtwitter.com というAPIを使用して作成していきます。

こちらが、作成した時の画像です。

コード

下記では部分的なコードを書きます。実際に動くコードが見たい場合は GitHub に投稿しているのでそちらをご覧ください。

まず、メッセージイベントを作成します

client.on(Events.MessageCreate, async (message) => {
    //.....
});

送信されたメッセージが共有URLかを確認する

const matches = messageContent.match(/https:\/\/(twitter\.com|x\.com)\/[^/]+\/status\/\d+/);

もし共有URLであれば、パラメータを取得する

if (matches) {
    const new_url = new URL(matches[0]);
    const path = new_url.pathname;
}

APIを使用してデータを取得し、そのデータをEmbed形式で送信

fetch(`https://api.vxtwitter.com${path}`)
    .then(response => {

        if (!response.ok) {
            throw new Error(response.statusText);
        }

        return response.json();
    })
    .then(async data => {

        if (data.error) {
            return;
        }

        const embed = new EmbedBuilder()
            .setAuthor({
                name: data.user_name,
                iconURL: data.user_profile_image_url,
                url: data.tweetURL
            })
            .setDescription(data.text)
            .setFields(
                { 
                    name: '💘',
                    value: `${data.likes}`,
                    inline: true 
                },
                {
                    name: '🔄 + 🗣️',
                    value: `${data.replies + data.retweets}`,
                    inline: true
                },
            )
            .setColor('Green');

        if (data.mediaURLs.length > 0) {
            embed.setImage(data.mediaURLs[0]);
        }

        await message.channel.send({ embeds: [embed] });
    })
    .catch(error => console.error('Error:', error));

最後に

https://api.vxtwitter.com のAPIを使用しているため、APIの提供が終了するとこの機能は使用できなくなります。

このプログラムは、 MITライセンスで、ライセンス所有者はFulxcore Technologiesです。

なお、MITライセンスの全文表記は省略します。

Fulxcore Technologies

Discussion

P_nutsKP_nutsK
if (matches) {
    const new_url = new URL(matches[0]);
    const path = new_url.pathname;
}

とありますが,

const matches = messageContent.match(/https:\/\/(twitter\.com|x\.com)\/[^/]+\/status\/\d+/);

の部分の正規表現を/https:\/\/(?:twitter\.com|x\.com)(\/[^/]+\/status\/\d+)/としたら

if(matches) {
    const path = matches[1]
}

で済むのではないでしょうか?
もう少し圧縮したもの↓

/https?:\/\/(?:twitter|x)\.com(\/[^/]+\/status\/\d+)/