LINEのトークをメールで自動転送するボットを作った

#はじめに
プログラミング初心者の投稿者は完成に1ヶ月を要しました（）
が、この記事を読んでいる皆さんは、もっと短期間で作れると思います（たぶん）。
ほかの記事、サイトを調べれば分かるところ、書くのが面倒くさいところは簡潔に説明します。
投稿者はQiitaも初心者ですのでお手柔らかに…
ネット上にはいろいろ記事がありますが、できるだけ新しいものを見つけるようにしてください。

#仕組み
LINE botを作り、トークを転送したいグループに招待します。
誰かがグループに（テキストメッセージ、写真、動画、スタンプ、ファイルなど）を送ると、LINEは、それらを予め設定しておいたところ(Webhook URL)に送ってきます。
受け取り先(heroku)に、送られてきた内容をメールで送るプログラムを書いておけば、メッセージが送られてくるたびに自動でメール転送できるようになります。

#LINE Developers 登録
LINE botを作るには、LINE Developersに登録する必要があります。
無料プランで大丈夫です。

登録方法は下で説明します
#Messaging API
>Messaging APIは、あなたのサービスとLINEユーザーの双方向コミュニケーションを可能にする機能です。
https://developers.line.biz/ja/services/messaging-api/

#LINE Developers & Messaging API　の設定
まず、[LINE公式サイト Messaging APIを利用するには](https://developers.line.biz/ja/docs/messaging-api/getting-started/#%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90)を読んで、その通りにやってください

つぎに、[LINE公式サイト ボットを作成する](https://developers.line.biz/ja/docs/messaging-api/building-bot/#%E5%A7%8B%E3%82%81%E3%82%8B%E5%89%8D%E3%81%AB)

1.チャンネルアクセストークンの発行
長期をおすすめします。

2.チャンネルシークレットキー
LINE Developersコンソールの［チャネル基本設定］ページで確認

3.WebHook URLの設定
「https://{HEROKU_APP_NAME}.herokuapp.com/callback」というURL形式注：{HEROKU_APP_NAME}はこれからHerokuで作るアプリ名です。

1,2,3のアプリ名は控えておいてください。

#Heroku
Herokuは今回「受取先」になり、プログラムを実行するところです。
Herokuとは何か？、詳しくは割愛させていただきますが、簡単に言えばサーバです。
イメージ→[herokuとPHPでオウム返しlinebotを作る(Windows10)](https://qiita.com/rintaro9147/items/f96b81e769648bdff3a8)

#####まずは、Herokuの登録をお願いします
[Heroku](https://jp.heroku.com/)

（参考サイト）※今回はクレジットカードの登録は必要ありません。
[Herokuを使いこなすのに必要な術](https://qiita.com/fuwamaki/items/f7752eb7a2727660239f)
https://webbibouroku.com/Blog/Article/heroku-getting-started

#####つぎに、Heroku CLIをインストールしてください
Heroku CLIは、お使いのパソコンのコマンドラインで、Herokuのアプリのログを見るのに使います。

```
heroku login //ログイン
heroku logs -a アプリ名 -t　//ログ常時表示
```

あとは、[Herokuを使いこなすのに必要な術](https://qiita.com/fuwamaki/items/f7752eb7a2727660239f)をご覧ください

#####つぎに、HerokuでWeb Appを作ってください
[Herokuを使いこなすのに必要な術 アプリケーションの作成](https://qiita.com/fuwamaki/items/f7752eb7a2727660239f#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90)
アプリの名前は、先ほどWebHook URLの設定のところで使ったものにしてください。

#####さいごに、HerokuでConfig_Varを設定してください
要するに環境変数です。コードにこれらの秘密情報を記載しないことで、安全性を高めます。
Heroku CLIから設定する↓
[Herokuで環境変数を設定する方法](https://qiita.com/kazuhikoyamashita/items/2c3c31155e98675f780f)

Dashboardから入力する↓　（こちらのほうが直感的）
[HHeroku公式 Configuration and Config Vars](https://devcenter.heroku.com/articles/config-vars#using-the-heroku-dashboard)

＜入力する環境変数＞
CHANNEL_ACCESS_TOKEN　→　さっき調べたもの
CHANNEL_SECRET　→　さっき調べたもの
FROM_ADRESS　→　送信元アドレス（別途用意してください）　
TO_ADRESS　→　送信先アドレス
BCC_ADRESS　→ 送信先BCCアドレス
APP_PASSWORD →　Gmail　※

※は「Gmailから送る」で書きます。申し訳ないですが、いまその設定をするか、あとでもう一度環境変数を追加してください。

#Git Hub
投稿者はHerokuにGithubのリポジトリを参照させるようにしました。
こうすることで、コードの変更が簡単になるからです。
Git Hub desktop もあると便利。

#Visual Studio Code
投稿者はGit hub DesktopからコードをVisual Studio codeで開いていましたが、コードエディタは何でもいいと思います。

#LINE SDK
line-bot-sdkというのを利用します（受取先のプログラムに丸ごと組み込みます。後述します）。これはLINEが、開発者がよく使う機能を実装しておいてくれたものです。例えば、開発者(私や読者の皆さん)は、難しいプログラムを一から書く必要はなく、そこに含まれている関数を自分のプログラムの中で呼び出すだけで、メッセージを受け取ったり送ったりできるのです。
Composerで入れます。

#PHPmailer
PHPでメールを送信するときに使います。システム上これを使わなくてもメールを送れますが、Gmailは暗号化されているメールしか送信?受信?しないので、これが必要です。
Composerで入れます。

#PHPとComposer
PHPをインストールするのは、調べてもらえればできると思います。

コードエディタで編集していて、エラーが出たときは、構成設定「php.ini」で使いたいものがコメントアウトされていないか調べてください。

あと、そもそもPHPのコードが使えないという場合は「パスが通っていない」可能性があります。[PATHを設定する](https://www.javadrive.jp/php/install/index3.html)

#####ComposerはPHPを使う上では必需品らしいです。
これも調べていただければと思います。
簡単に言うと、SDKの更新を簡単にすることができます。投稿者はPHP初心者なので、ここで躓きました。もしどうしてもうまくいかない場合は、Composerを使うことをあきらめ、「line-bot-sdk」と「PHPmailer」を直接Githubからダウンロードして入れてしまってもいいと思います()

[Composerの導入＆使い方（初心者の復習用）](https://qiita.com/suke/items/770bccf8a43f9247daf5)

Composerを使える人は、パソコン上で↓のプログラム（Composer.json）があるところをコマンドプロンプトで開き、

```
composer install
```

してください

#Heroku（参照しているGithub)に記載するプログラム
Composerする前は、callback.php　と　composer.json　のみ必要です。

![全体像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659770/6961c445-9094-68dd-03f5-30a5d5a5603d.png)

```text:vender
composerしたあとで自動生成される
```

```php:callback.php
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

// Composerでインストールしたライブラリを一括読み込み
require_once __DIR__ . '/vendor/autoload.php';

//エラーメッセージ用日本語言語ファイルを読み込む
require 'vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php';

//環境変数の読み込み
$CHANNEL_ACCESS_TOKEN=getenv('CHANNEL_ACCESS_TOKEN');
$CHANNEL_SECRET=getenv('CHANNEL_SECRET');
$FROM_ADRESS=getenv('FROM_ADRESS');
$TO_ADRESS=getenv('TO_ADRESS');
$BCC_ADRESS=getenv('BCC_ADRESS');//BCC要らない場合は消す
$APP_PASSWORD=getenv('APP_PASSWORD');

$contents = file_get_contents('php://input'); //POSTの生データを読み込む
$json = json_decode($contents); //生のJSONデータをデコードして変数jsonに格納
$event = $json->events[0]; //変数jsonの中のevent配列の0番目を取り出し、変数eventに格納
$httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient($CHANNEL_ACCESS_TOKEN); // アクセストークンを使いCurlHTTPClientをインスタンス化
$bot = new \LINE\LINEBot($httpClient, ['channelSecret' => $CHANNEL_SECRET]);    //CurlHTTPClientとシークレットを使いLINEBotをインスタンス化

$responseProfile = $bot->getProfile($event->source->userId);
if ($responseProfile->isSucceeded()) {
$profile = $responseProfile->getJSONDecodedBody();
      $user_display_name = $profile['displayName'];
      
}else{
  error_log("fail to get profile");
}

//タイムゾーン設定
date_default_timezone_set('Asia/Tokyo');

//mailを送っていく
//mbstring の日本語設定
mb_language("Japanese"); 
mb_internal_encoding("UTF-8");

// インスタンスを生成（引数に true を指定して例外 Exception を有効に）
$mail = new PHPMailer(true);

$mail->CharSet = "iso-2022-jp";
$mail->Encoding = "7bit";

//エラーメッセージ用言語ファイルを使用する
$mail->setLanguage('ja', 'vendor/phpmailer/phpmailer/language/');

try{
  //サーバの設定
  $mail->SMTPDebug = SMTP::DEBUG_SERVER;  // デバグの出力を有効に（テスト環境での検証用）
  $mail->isSMTP();   // SMTP を使用
  $mail->Host       = 'smtp.gmail.com';  // ★★★ Gmail SMTP サーバーを指定
  $mail->SMTPAuth   = true;   // SMTP authentication を有効に
  $mail->Username   = $FROM_ADRESS;  // ★★★ Gmail ユーザ名
  $mail->Password   = $APP_PASSWORD;  // ★★★ Gmail パスワード ←アプリパスワード
  $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // ★★★ 暗号化（TLS)を有効に 
  $mail->Port = 587;  //★★★ ポートは 587 

  //差出人アドレス, 差出人名 
  $FROM_NAME = "【自動転送】";
  $mail->setFrom($FROM_ADRESS, mb_encode_mimeheader($FROM_NAME)); 
  
  // 受信者アドレス, 受信者名（受信者名はオプション）
  $TO_NAME="名前";
  $mail->addAddress($TO_ADRESS, mb_encode_mimeheader($TO_NAME));  
  $mail->addBCC($BCC_ADRESS);//BCC要らない場合は消してください
 
  //コンテンツ設定
  $mail->isHTML(true);   // HTML形式を指定
  
  //タイムスタンプのミリ秒を時間に変換。　
  $SendTime = date("y/m/d H:i:s",($event->timestamp)/1000);

  //現在の日付
  $nowdate =  date("m/d");

switch($event->message->type) {
case 'text':
  //メール表題（タイトル）
  $mail->Subject = mb_encode_mimeheader($nowdate);

  //本文（HTML用）
  $bodytext = $SendTime.'//'.$user_display_name.'//'.$event->message->text;
  $mail->Body  = mb_convert_encoding($bodytext,"JIS","UTF-8"); 

  $mail->send();  //送信
  break;

case 'image':
  //メール表題（タイトル）
  $mail->Subject = mb_encode_mimeheader($nowdate);

  //本文（HTML用）
  $bodytext = $SendTime.'//'.$user_display_name.'//'."Image";
  $mail->Body  = mb_convert_encoding($bodytext,"JIS","UTF-8"); 

  $response = $bot->getMessageContent($event->message->id);

  if ($response->isSucceeded()) {
   //バイナリデータをjpgに変換
  $im=imagecreatefromstring($response->getRawBody());
  $filename = date("Ymd-His") . '-' . mt_rand() . '.jpg';
  imagejpeg($im, $filename,10);//10はクオリティ低
  }else {
    error_log($response->getHTTPStatus() . ' ' . $response->getRawBody());
  }

  //画像添付
  $mail->addAttachment($filename);

  $mail->send();  //送信
break;

case 'video':
//処理をここに書く
break;

case 'audio':
//処理をここに書く
break;

case 'file':
//処理をここに書く
break; 

case 'sticker': 
//処理をここに書く
break;

default:
}  

} catch (Exception $e) {
  error_log("Message could not be sent. Mailer Error: {$mail->ErrorInfo}");
}
?>
```

```json:callback.json
{
    "require": {
        "linecorp/line-bot-sdk": "^4.3",
        "ext-gd": "*",
        "ext-mbstring": "*",
        "phpmailer/phpmailer": "^6.1"
    }
}

```

```lock:composer.lock
composerすると自動生成される
```

#Gmailから送る
メールを送信するには、送信元アドレスが必要です。
Herokuを送信元アドレスにすることはできない(多分)ので、別のメールアドレスを使います。投稿者はGmailを使いました。↑のプログラムは、Gmail用です。
[Gmail(SMTP)経由でメール送信する](https://qiita.com/kassy51/items/7a6dc2683862e6da3aa7)を見て、
ボットにメッセージを送って、一度↑のプログラムを実行させたあと、
アプリのパスワードを生成してください。
「Heroku」の「環境変数設定」のところへ戻って、アプリのパスワードを設定してください。

ちなみにメールは
>差出人→【自動転送】
タイトル→　日付
本文→送信時刻//送信者名//メッセージ

となります。送信者名は、送信者がボットと友だちになってないと取得できませんが、エラーはでません。

#写真は転送できなかった
Herokuの無料プランを使った場合、写真の重い処理に耐えられずに、Heroku側がプログラムを途中中断してしまうみたいです。
ものすごくサイズが小さい写真(数KB)は転送できますw

動画やファイルはさらに重い処理が要求されると思われますので、今回プログラムは書きませんでしたが、必要でしたらプログラムに組み込めるようにコメントを入れておきました。

#ここまでやればOKなはず…
エラーログは、↓で見れます。コマンドプロンプト上で実行してください。

```
heroku login //ログイン
heroku logs -a アプリ名 -t　//ログ常時表示
```


#さいごに
記述不足で本当に申し訳ありません。
どういう風にやったか思い出しながら書いたので、抜けている作業があるかもしれませんが、これで精いっぱいです。すみません！
皆さんのお役に立てば幸いです。