[筋トレ] LINE Notifyからマッチョの画像が送られてくる

最近、健康と体力維持のために寝る前に家トレをやってるんですが、
習慣化されるまでってどうしても忘れてしまったり、モチベーションが続かなかったりするんですよね。

そこでLINE Notifyを使ってリマインド的に「筋トレやろう！」っていうメッセージを送ればいいんじゃないかと。

ただ、単にメッセージだけだと結局無視をしてしまったりで、あんまり効果がなさそうだなぁと思ったので、
視覚的に脳に訴える筋肉モリモリマッチョマンの画像を送れば少しはヤル気が出るんじゃないか？
ということで、決まった時間にマッチョの画像を送り付けるLINEbotを作ります。

## 構成イメージ
![TrainingDiagram.png](https://qiita-image-store.s3.amazonaws.com/0/208648/8363b711-a83f-fc4e-7267-67b754cac9b0.png)


## 開発環境

* MacOS High Sierra
* Python3.6
* AWS Lambda
* [LINE Notify API](https://notify-bot.line.me/)
* [Google Custom Search API](https://console.cloud.google.com/apis)

## 必要な情報
イメージした構成に必要な情報を取得しておきます。

* LINE Notify アクセストークン
* Google API key
* Google カスタム検索 検索エンジンID

以下の記事を参考にしました。

* [[超簡単]LINE notify を使ってみる](https://qiita.com/iitenkida7/items/576a8226ba6584864d95)
* [Google Custom Search APIを使ってプログラムで検索結果を取得する](https://urashita.com/archives/8158#Google_Custom_Search_100)

## ソースコード
* [LINE Notifyが使いやすそうなので、Lambda(python)から何か通知させてみる](http://tech.innovation.co.jp/2016/10/14/Try-Line-Notify.html)
* [Google Custom Search APIを使って画像収集](https://qiita.com/onlyzs/items/c56fb76ce43e45c12339)
* [LINE Notify API ドキュメント](https://notify-bot.line.me/doc/ja/)

こちらを参考にLambdaに実装していきます。



```lambda_function.py
# -*- coding:utf-8 -*-

import os
import urllib.parse
import urllib.request
import json
import random

def get_word():
    word_list = ['筋トレ','マッチョ','細マッチョ','肉体美']
    num = random.randrange(len(word_list))
    return word_list[num]


def get_image(word):
    img = []
    query_img = "https://www.googleapis.com/customsearch/v1?key=" + os.environ['GOOGLE_API_KEY'] + "&cx=" + os.environ['CUSTOM_SEARCH_ENGINE'] + "&q=" + urllib.parse.quote(word) + "&searchType=image"
    
    res = urllib.request.urlopen(query_img)
    data = json.loads(res.read().decode('utf-8'))
    num = random.randrange(len(data["items"]))
    img.append(data["items"][num]["image"]["thumbnailLink"])
    img.append(data["items"][num]["link"])

    return img

def send_line(message,image):
    LINE_NOTIFY_URL = 'https://notify-api.line.me/api/notify'
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': 'Bearer ' + os.environ['LINE_NOTIFY_TOKEN']
    }
    body = {
        'message': message,
        'imageThumbnail':image[0],
        'imageFullsize':image[1],
    }
    data = urllib.parse.urlencode(body)

    req = urllib.request.Request(LINE_NOTIFY_URL, data=data.encode('utf-8'), method='POST', headers=headers)
    with urllib.request.urlopen(req) as res:
        response_body = res.read().decode("utf-8")

def lambda_handler(request, context):
    word = get_word()
    image = get_image(word)
    message = '筋トレしませんか？'
    send_line(message,image)
```

## テスト動作

<img width="375" alt="IMG_7781.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/208648/2c3a96dd-9006-dd82-7542-00ead5f8cbc2.jpeg">
<img width="375" alt="IMG_7782.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/208648/5bcf1d0f-d9f6-4876-7492-d40c4cae7293.jpeg">

Googleカスタム検索結果をランダムで送っているので、
たまにマッチョ以外の画像も送られてきますが、想定通りに動いています。

## 決まった時間に通知が来るようにする
あとはcron機能を使って定時で動かすだけ。

* [AWS Lambda と LINE Notify で毎朝のゴミ出しを促す](http://kimulla.hatenablog.com/entry/2018/03/12/223750)

CloudWatch Eventで決まった時間に関数を実行することができるようなので、
これを使って決まった時間にマッチョ画像を送り付けることができます。

## 使ってみた感想
* 特に筋トレのモチベーションは上がらなかった

## おまけ
好きなキャラクターや推しのアイドルの目覚ましbotにも使えるかも？
<img width="375" alt="IMG_7783.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/208648/7370089d-5ca3-2251-7b8b-eb3bd39fe508.jpeg">