名言LINEボットを作ってみた。（LINEAPIとGASを使って遊んでみた３）

# 名言君

## 説明
[名言１００選](https://business-textbooks.com/wordofwisdom100/)の中の名言から、ユーザーが入力したキーワードに関する名言を返します。

## 使い方
１：LINEで文字を入力して送信します。
２：LINEに入力したキーワードに関連する名言が返ってきます。関連する名言がない場合はランダムで名言が返ってきます。

## 作り方
１：[名言１００選](https://business-textbooks.com/wordofwisdom100/)から名言だけをスクレイピングで取り出します。
２：LINEボットを作成します。
３：GSSに、スクレイピングで取り出した名言を入力します。
４：GASに、コードを書きます。

１：[名言１００選](https://business-textbooks.com/wordofwisdom100/)から名言だけをスクレイピングで取り出します。

```スクレイピング.py
from selenium import webdriver
import pandas

"""***************************************
もろもろの設定
***************************************"""
browser = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver')
df = pandas.read_csv('default.csv', index_col=0)
url = "https://business-textbooks.com/wordofwisdom100/" #データを取りたいページ

"""******************************
CSS SELECTORの設定
******************************"""
STRONG = "strong"

"""***************************************
実行部分
***************************************"""

browser.get(url)
strongs = browser.find_elements_by_css_selector(STRONG)
print(len(strongs))

for strong in strongs:
  try:
      word = strong.text
      print(word)
      se = pandas.Series([word],["word"])
      df = df.append(se, ignore_index=True)
  except Exception as e:
      print(e)


print("Finished Scraping. Writing CSV.......")
df.to_csv("output.csv")
print("DONE")
```

４：GASに、コードを書きます。

```名言.gs
// シートを取得
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); // 「シート1」はシート名

//使用する変数を設定
var PROPERTIES = PropertiesService.getScriptProperties();
var LINE_ACCESS_TOKEN = PROPERTIES.getProperty('LINE_ACCESS_TOKEN')
var LINE_END_POINT = "https://api.line.me/v2/bot/message/reply"
var reply_token;
var query;


function doPost(e){
if (typeof e === "undefined"){
 reply_token = ""
 query = "満足"
} else{
  var json = JSON.parse(e.postData.contents);
  reply_token= json.events[0].replyToken;
  //送られたLINEメッセージを取得
  query = json.events[0].message.text;
}
　　Logger.log("検索キーワード"+query);
 var answer = searchGSS(query);
 postBackToLine(answer);
}


//GSSの名言（A1:A100)の中からLINEメッセージで送られてきたキーワードを含む名言を返す。
function searchGss(query){
  var target_numbers = [];
  var values = sheet.getRange("A1:A100").getValues();
  for (var i = 0;i<values.length;i++) {
    var value = values[i].toString();//object→string
    if (value.indexOf(query)!=-1) {
      target_numbers.push(i);
      Logger.log(target_numbers);
    }
  }
  if(target_numbers.length > 0) {
    Logger.log(target_numbers)
    var min = 0 ;
    var max = target_numbers.length - 1 ;
    var random = Math.floor( Math.random() * (max + 1 - min) ) + min  ;  
    var target_number = target_numbers[random] + 1;
    var target_value = sheet.getRange("A" + target_number).getValue();
  }else{
    var min = 0;
    var max = 99;
    var random = Math.floor( Math.random() * (max + 1 - min) ) + min ; 
    var target_value = sheet.getRange("A" + random).getValue();
  }
  return target_value
}

//LINEに名言を返す。
function postBackToLine(answer){
var messages = [{
 "type": "text",
 "text":  "そういう時はこの名言！\n\n" + answer
}];
  
Logger.log(messages)
UrlFetchApp.fetch(LINE_END_POINT, {
 'headers': {
   'Content-Type': 'application/json; charset=UTF-8',
   'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN,
 },
 'method': 'post',
 'payload': JSON.stringify({
   'replyToken': reply_token,
   'messages': messages,
 }),
});   
}
```

以上

## QRコード
以下のQRコードから友達登録できますので、よろしければお試しください。

<img width="718" alt="スクリーンショット 2018-08-23 13.15.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/280727/a3e72526-e99a-2a64-d4f7-d1004d34aa1f.png">