discord.jsでGoogle検索機能を作る方法

2021/06/01

discord.js Node.js

一々ブラウザを立ち上げなくても検索できたら楽ですよね。

ということで、この記事ではdiscord.jsでGoogle検索機能を作っていきます!

前提条件

  • Node.js, npmがインストールされている。
  • discord.jsでBotが起動できている。

パッケージのインストール

npm install serp request

を実行し、serpとrequestをインストールします。

必要なパッケージはこれだけです。

コマンド名を決める

単純なものがいいと思います。ここでは!searchにします。

const searchcmd = '!search'

client.on('message', async message => {
  if (message.content.startsWith(searchcmd)) {

  }
})

検索語句だけ切り取る

message.contentをそのまま検索にかけると、不要であるコマンド部分まで検索されてしまいますので、検索語句だけ切り取ってやる必要があります。

.slice(searchcmd.length + 1)部分でコマンド部分を置き換えています。

const searchcmd = '!search'

client.on('message', async message => {
  if (message.content.startsWith(searchcmd)) {
    const searchword = message.content.slice(searchcmd.length + 1)

  }
})

検索語句が空だった場合の処理

検索語句が空だと何も検索できないので、returnする必要があります。

const searchcmd = '!search'

client.on('message', async message => {
  if (message.content.startsWith(searchcmd)) {
    const searchword = message.content.slice(searchcmd.length + 1)

    if (!searchword) return message.reply('検索語句を指定してください。')

  }
})

serpの設定

serpのリファレンスを参考にして書いていきます。

const serp = require('serp')

const searchcmd = '!search'

client.on('message', async message => {
  if (message.content.startsWith(searchcmd)) {
    const searchword = message.content.slice(searchcmd.length + 1)

    if (!searchword) return message.reply('検索語句を指定してください。')

    const links = await serp.search({
      host: 'google.com',
      qs: {
        q: searchword,
        filter: 0,
        pws: 0
      },
      num: 3
    })
  }
})

返信する

Embed(埋め込み)を使うことにします。

リンクごとにフィールドを分けているのは、見やすさ向上とリンクがうまく貼れない現象の対策です。

const serp = require('serp')
const { MessageEmbed } = require('discord.js')

const searchcmd = '!search'

client.on('message', async message => {
  if (message.content.startsWith(searchcmd)) {
    const searchword = message.content.slice(searchcmd.length + 1)

    if (!searchword) return message.reply('検索語句を指定してください。')

    const links = await serp.search({
      host: 'google.com',
      qs: {
        q: searchword,
        filter: 0,
        pws: 0
      },
      num: 3
    })
    
    const embed = new MessageEmbed()
      .setTitle(`「${searchword}」の検索結果`)
    links.forEach(link => embed.addField('\u200b', `[${link.title}](https://google.com${link.url})`))
    embed.addField('\u200b', `すべての検索結果は[こちら](https://www.google.com/search?q=${searchword})`)
    message.channel.send(embed)
  }
})

検索結果が見つからなかった場合

上までのコードでも検索はできますが、もし検索結果が見つからなかった場合、Botがエラーを吐くだけでメッセージが返されません。

そのため、利用者目線だと検索結果が返ってこないコマンドになってしまいます。

なので、結果が見つからなかった時用のコードを書く必要があります。

const serp = require('serp')
const { MessageEmbed } = require('discord.js')

const searchcmd = '!search'

client.on('message', async message => {
  if (message.content.startsWith(searchcmd)) {
    const searchword = message.content.slice(searchcmd.length + 1)

    if (!searchword) return message.reply('検索語句を指定してください。')

    const links = await serp.search({
      host: 'google.com',
      qs: {
        q: searchword,
        filter: 0,
        pws: 0
      },
      num: 3
    })

    const embed = new MessageEmbed()
      .setTitle(`「${searchword}」の検索結果`)
    links.forEach(link => embed.addField('\u200b', `[${link.title}](https://google.com${link.url})`))
    embed.addField('\u200b', `すべての検索結果は[こちら](https://www.google.com/search?q=${searchword})`)
    message.channel
      .send(embed)
      .catch (err => {
        message.channel.send(
          new MessageEmbed()
            .setDescription('検索結果が見つかりませんでした...\n検索語句を変えて、再度お試しください。')  
        )
      })
  }
})

コード全文

この記事で書いたコードの全文です。

const serp = require('serp')
const { MessageEmbed } = require('discord.js')

const searchcmd = '!search'

client.on('message', async message => {
  if (message.content.startsWith(searchcmd)) {
    const searchword = message.content.slice(searchcmd.length + 1)

    if (!searchword) return message.reply('検索語句を指定してください。')

    const links = await serp.search({
      host: 'google.com',
      qs: {
        q: searchword,
        filter: 0,
        pws: 0
      },
      num: 3
    })

    const embed = new MessageEmbed()
      .setTitle(`「${searchword}」の検索結果`)
    links.forEach(link => embed.addField('\u200b', `[${link.title}](https://google.com${link.url})`))
    embed.addField('\u200b', `すべての検索結果は[こちら](https://www.google.com/search?q=${searchword})`)
    message.channel
      .send(embed)
      .catch (err => {
        message.channel.send(
          new MessageEmbed()
            .setDescription('検索結果が見つかりませんでした...\n検索語句を変えて、再度お試しください。')
        )
      })
  }
})

特定のサイトだけを検索する方法

example.comは検索したいサイトのURLに置き換えてください。

const serp = require('serp')
const { MessageEmbed } = require('discord.js')

const searchcmd = '!search'
const searchurl = 'example.com'

client.on('message', async message => {
  if (message.content.startsWith(searchcmd)) {
    const searchword = message.content.slice(searchcmd.length + 1)

    if (!searchword) return message.reply('検索語句を指定してください。')

    const links = await serp.search({
      host: 'google.com',
      qs: {
        q: searchword + `site:${searchurl}`,
        filter: 0,
        pws: 0
      },
      num: 3
    })
    
    const embed = new MessageEmbed()
      .setTitle(`「${searchword}」の検索結果`)
    links.forEach(link => embed.addField('\u200b', `[${link.title}](https://google.com${link.url})`))
    embed.addField('\u200b', `すべての検索結果は[こちら](https://www.google.com/search?q=${searchword}+site:${searchurl})`)
    message.channel
      .send(embed)
      .catch (err => {
        message.channel.send(
          new MessageEmbed()
            .setDescription('検索結果が見つかりませんでした...\n検索語句を変えて、再度お試しください。')  
        )
      })
  }
})

おわり

お読みいただきありがとうございました!

エラーやご指摘等ありましたら下のコメント欄までお願いします。

シェアもぜひ!

QooQ