今日のおかずをランダムに配信するLINE BOTを作ってみた

だいぶ昔ですが、今日のおかずをランダムに配信するLINE BOTを作ったので、今更ながら紹介します。

<img width="375" alt="IMG_4724.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93963/858ceb62-4b9e-e6fe-7bda-3dd98d0a9e60.png">

# 概要

今日のおかずをランダムに配信するLINE BOTです。
おかずというのは食べ物ではなく、男にはかかせないアダルトな方のおかずです笑

使い方はすごく簡単で、ただ「おかず」とメッセージを送るだけです。
「今日のおかず」とか、「おかずください」といった風に、「おかず」というキーワードが含まれていればOKです。

<img width="375" alt="IMG_4725.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93963/e0e9ccc8-16a0-2165-ff63-c566ca26fa26.png">

「おかず」というキーワードが含まれていなかったり、スタンプを送ると、"「おかず」って言ってくれたらいいものあげるよ♪"というメッセージを返します。

<img width="375" alt="IMG_4727.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93963/a7f591f5-a410-1c44-47cf-5a2499aefcaf.png">

QRコードはこちらです。

![Ju4ORXqieI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93963/7541a3fe-1264-491b-adda-675140577d3f.png)

今のところ改修の予定はありませんが、もし反響多ければ、改修を加えることも考えています。

# 開発した経緯

上記で挙げたおかずですが、ネットを漁れば無料でいくらでも見つかります。
ですが探すのが大変だったり、特にお気に入りのおかずがないという人のために、自動でランダムにおかずを決めてくれたら便利なのではと思い作りました。
またLINE BOT作りに興味もあり、かつPHPも勉強中だったので、それを活かせればと思い、開発に踏み切った次第です。

# 開発環境

- [Heroku](https://jp.heroku.com/)
- PHP
- [SDK of the LINE BOT API for PHP](https://github.com/line/line-bot-sdk-php)

# 実装について

具体的な開発手順（HerokuやLINE Developersへの登録など）は、参考URLにいくつかサイトを挙げてますので、そちらを参照してください。基本的にはそちらと変わりはありません。
ここではオリジナルで実装した部分について紹介します。

```php:index.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/OkazuGenerator.php';

$httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient(getenv('CHANNEL_ACCESS_TOKEN'));
$bot = new \LINE\LINEBot($httpClient, ['channelSecret' => getenv('CHANNEL_SECRET')]);
$sign = $_SERVER["HTTP_" . \LINE\LINEBot\Constant\HTTPHeader::LINE_SIGNATURE];
$events = $bot->parseEventRequest(file_get_contents('php://input'), $sign);

foreach ($events as $event) {
    if (!($event instanceof \LINE\LINEBot\Event\MessageEvent)
    || !($event instanceof \LINE\LINEBot\Event\MessageEvent\TextMessage)) {
        $bot->replyText($event->getReplyToken(), OkazuGenerator::replyPromptOkazu());
    }

    // おかずと言えばおかずが出てくる
    if (preg_match("/おかず/", $event->getText())) {
        $bot->replyText($event->getReplyToken(), OkazuGenerator::replyOkazu());
    } else {
        $bot->replyText($event->getReplyToken(), OkazuGenerator::replyPromptOkazu());
    }
}
?>
```

index.phpはメイン処理を記載しています。
注目すべきは、foreach文以降の処理です。
最初のif文では、テキスト以外のメッセージが来た場合は全て無視し、催促の文言を返すようにしています。
また、テキストが来た場合に、「おかず」というキーワードが含まれているかも判定して、含まれていればランダムにURLを返し、含まれていなければ先ほどと同様の催促の文言を返します。

```php:OkazuGenerator.php
<?php

    /**
     * おかず生成クラス
     */
    class OkazuGenerator
    {
        const URL_ERRY = 'http://erry.one/video/';
        const URL_SUGIRL = 'https://sugirl.info/video/';
        const URL_SEPARATOR = '/';
        const PROMPT_OKAZU = '「おかず」って言ってくれたらいいものあげるよ♪';

        /**
         * おかずをランダムに返す
         */
        public static function replyOkazu()
        {
            if (rand(0, 1) === 0) {
                return OkazuGenerator::URL_SUGIRL . rand(23000, 25515) . OkazuGenerator::URL_SEPARATOR;
            } else {
                return OkazuGenerator::URL_ERRY . rand(16000, 18770) . OkazuGenerator::URL_SEPARATOR;
            }
        }

        /**
         * おかずの催促
         */
        public static function replyPromptOkazu()
        {
            return OkazuGenerator::PROMPT_OKAZU;
        }
    }

?>
```

OkazuGenerator.phpは、ランダムにURLを生成したり、催促の文言を定義した、キモとなる処理を記載しています。
仕組みは単純で、アダルトサイトのURLの最後が数字になっているものに対し、ランダムな数字をくっつけているだけです。また、よりバリエーションを増やすため、複数のアダルトサイトに対応させています。

# GitHub

https://github.com/hiesiea/Okazu

# 参考URL

- [PHP版の公式SDKを使ってLINE Messaging APIベースのBotを作ってみた](https://qiita.com/yositosi/items/87a0ee54ab88b934b1cb)
- [[LINE Bot] 位置情報から食べログ3.5以上の優良店を検索するbot作った](https://qiita.com/NARI_Creator/items/f29112e6f604c86b3c0d)
- [【PHP】LINE Messaging APIをつかってオウム返し BOT つくってみた](https://qiita.com/at_1016/items/9f97dc1c561182c18182)