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

commits5 min read読了の目安(約5100字 2

こんにちは!

この記事では、discord.jsでGoogle検索機能を作る方法を解説します。

前提条件

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

Step1 必要なパッケージのインストール

requestを書くのを忘れていました。申し訳ありませんでした。(2021/03/29 18:10)

npm install serp request

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

使うパッケージはこれだけです。簡単ですね。

Step2 コードを書いていく

Step2.1 コマンドを決める

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

+ if (message.content.startsWith("!search")) {
+ 
+ }

Step2.2 検索語句だけ切り取る

2021/03/28 01:32追記 .replace()を使うことにしたので書き直しました、だ さんコメントありがとうございます!

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

.replace(searchcmd,"")部分でコマンド文を無に置き換えています!

+ const searchcmd = "!search";
- if (message.content.startsWith("!search")) {
+ if (message.content.startsWith(searchcmd)) {
+   const searchword = message.content.replace(searchcmd,"");
}

.slice()を使用します。

()内の数字は、「Step2.1で決めたコマンドの文字数+1」に置き換えてください。

例えば、!searchは7文字+1で8です。

Step2.3 serpの設定

https://www.npmjs.com/package/serp

serpのページを参考にして書いていきます。

+ const serp = require("serp");

const searchcmd = "!search";
if (message.content.startsWith(searchcmd)) {
  const searchword = message.content.replace(searchcmd,"");
+   var options = {
+   host : "google.co.jp",
+   qs : {
+     q : searchword,
+     filter : 0,
+     pws : 0
+   },
+   num : 3
+ };
+ const links = await serp.search(options);
}

Step2.4 Discordに送信するコード

毎度お馴染みのmessage.channel.sendですね〜

const serp = require("serp");

const searchcmd = "!search";
if (message.content.startsWith(searchcmd)) {
  const searchword = message.content.replace(searchcmd,"");
  var options = {
  host : "google.co.jp",
  qs : {
    q : searchword,
    filter : 0,
    pws : 0
  },
  num : 3
};
const links = await serp.search(options);
+ message.channel.send({
+   embed: {
+     title: "検索結果",
+     description: `[${links[0].title}](https://www.google.co.jp${links[0].url})\n\n[${links[1].title}](https://www.google.co.jp${links[1].url})\n\n[${links[2].title}](https://www.google.co.jp${links[2].url})`,
+     color: "#4285F4"
+   }
+ });
}

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

上までのコードでも検索はできるのですが、もし検索結果が見つからなかったら、botがエラーを吐いてメッセージが返されないので、

利用者「は?何これ使えへんBotやな、kickしよ」というようなことに繋がりかねません(?)

なので、見つからなかった時用のコードを書きます。

const serp = require("serp");

const searchcmd = "!search";
if (message.content.startsWith(searchcmd)) {
  const searchword = message.content.replace(searchcmd,"");
+   try {
    var options = {
    host : "google.co.jp",
    qs : {
      q : searchword,
      filter : 0,
      pws : 0
    },
    num : 3
  };
  const links = await serp.search(options);
  message.channel.send({
    embed: {
      title: "検索結果",
      description: `[${links[0].title}](https://www.google.co.jp${links[0].url})\n\n[${links[1].title}](https://www.google.co.jp${links[1].url})\n\n[${links[2].title}](https://www.google.co.jp${links[2].url})`,
      color: "#4285F4"
    }
  });
+ } catch (error) {
+   message.channel.send({
+     embed: {
+       title: "検索結果",
+       description: `検索結果が見つからなかったようです…\n検索語句を変えてもう一度試してください。`,
+       color: "#4285F4"
+     }
+   });
+ }
}

コード全文

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

const serp = require("serp");

const searchcmd = "!search";
if (message.content.startsWith(searchcmd)) {
  const searchword = message.content.replace(searchcmd,"");
  try {
    var options = {
    host : "google.co.jp",
    qs : {
      q : searchword,
      filter : 0,
      pws : 0
    },
    num : 3
  };
  const links = await serp.search(options);
  message.channel.send({
    embed: {
      title: "検索結果",
      description: `[${links[0].title}](https://www.google.co.jp${links[0].url})\n\n[${links[1].title}](https://www.google.co.jp${links[1].url})\n\n[${links[2].title}](https://www.google.co.jp${links[2].url})`,
      color: "#4285F4"
    }
  });
} catch (error) {
  message.channel.send({
    embed: {
      title: "検索結果",
      description: `検索結果が見つからなかったようです…\n検索語句を変えてもう一度試してください。`,
      color: "#4285F4"
    }
  });
}
}

おまけ 特定のサイト内を検索する

http://example.comは検索したいサイトのURLに置き換えてくださいね〜!

const serp = require("serp");

const searchcmd = "!search";
if (message.content.startsWith(searchcmd)) {
  const searchword = message.content.replace(searchcmd,"");
  try {
    var options = {
    host : "google.co.jp",
    qs : {
-       q : searchword,
+       q : searchword + "+site:http://example.com",
      filter : 0,
      pws : 0
    },
    num : 3
  };
  const links = await serp.search(options);
  message.channel.send({
    embed: {
      title: "検索結果",
      description: `[${links[0].title}](https://www.google.co.jp${links[0].url})\n\n[${links[1].title}](https://www.google.co.jp${links[1].url})\n\n[${links[2].title}](https://www.google.co.jp${links[2].url})`,
      color: "#4285F4"
    }
  });
} catch (error) {
  message.channel.send({
    embed: {
      title: "検索結果",
      description: `検索結果が見つからなかったようです…\n検索語句を変えてもう一度試してください。`,
      color: "#4285F4"
    }
  });
}
}

おわり

拙い文でしたがここまでお読みくださりありがとうございました...!

動かないじゃん!とか、ここ読みにくい!書き直せ!とかがあれば、どうぞ下のコメント欄までお願いします。