📱

Pinterestの写真を検索して返してくれるLINE Botを作った

2 min read

はじめに

この機能は、TWICEの最新ニュースを取得してくれるLINEBotに、追加機能として加えた内容です。
LINE Developersのアカウント作成等の説明はありません。

概要

LINEで受け取ったテキストを検索にかけ、検索結果の写真をLINE Botでリプライする。

システム構成図

①LINEからメッセージを送信
②LINE Messaging APIがメッセージを受信して、Google Apps ScriptのAPIを呼出
③Google Apps ScriptのAPIからCustom Search JSON APIを呼出
④Custom Search JSON APIからの戻り値を受け取り、LINE Messaging APIにメッセージを送信
⑤LINE Messaging APIがメッセージを受信して、LINEにメッセージを送信
⑥LINEが受信したメッセージを表示

Google Apps Scriptのソースコード

/*
 * ボットにイベントが発生したときの(メイン)処理
 */
function doPost(e) {
  const events = JSON.parse(e.postData.contents).events;
  events.forEach((event) => {
    // イベントがメッセージの受信だったとき
    if(event.message.type == "text") {
      return reply(event);
    } else if(event.message.type == "sticker"){
      ...
    }
 });
}

function reply(e) {
  // 受信したメッセージ
  const text = e.message.text
  const messages = [
    {
      "type": "text",
      "text": text + "!"
    }
  ]
  const url = "https://www.googleapis.com/customsearch/v1?key=*************&cx=***********&searchType=image&num=5&q=twice " + text
  const res = UrlFetchApp.fetch(url)
  const response = JSON.parse(res.getContentText());
  Logger.log("検索終了");
  const array = response.items
  const img = array[Math.floor(Math.random() * array.length)].link
  const img_message = {
    "type": "image",
    "originalContentUrl": img,
    "previewImageUrl": img
  }
  messages.push(img_message)
  
  const postData = {
    "replyToken": e.replyToken,
    "messages": messages
  };
 
  // 送信のための諸準備
  const replyData = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + ACCESS_TOKEN
    },
    "payload": JSON.stringify(postData)
  };
  // JSON形式でAPIにポスト
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", replyData);
}

説明

 var url = "https://www.googleapis.com/customsearch/v1?key=*************&cx=***********&searchType=image&num=5&q=twice " + text
  • 検索タイプをimage、第1クエリパラメータにtwiceを設定して、TWICEに関連する写真だけが返ってくるようにしました。num=5で5つの写真を取得
  const array = response.items
  const img = array[Math.floor(Math.random() * array.length)].link
  • 5つの写真からランダムに一つを選択

検索エンジンのサイトはPinterestに設定しました。

Custom Search JSON APIの使い方の詳細はこちらをみて下さい。

https://developers.google.com/custom-search/v1/introduction

最後に

今回はgasを利用したことで手軽に実装できた。環境構築いらないしデプロイも楽。
ちょっとしたものを作るときはgasが便利!