メモ: LINE Messaging API でプッシュ通知、オウム返し、画像を送るサンプル

## 新規登録

* https://developers.line.me/ja/ にて、LINEのメールアドレス・パスワードで新規登録。
* `Messaging API`を選択する。
* [Messaging API](https://developers.line.biz/ja/reference/messaging-api/#get-number-of-followers)

### APIの準備

channel_secret （少し長い文字）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/fb2bc93d-2c05-8e1d-9984-da17ee3f9cdb.png)

channel_access_token （長い文字）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/b0dc5cee-f698-63e4-ae35-9a6f193e767f.png)

---

## 応答メッセージ

### php

```
mkdir linebot && cd linebot

composer require linecorp/line-bot-sdk
```

### オウム返し

```php
<?php

$channelSecret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$channelToken  = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

require_once __DIR__ . '/vendor/autoload.php';

$httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient($channelToken);
$bot = new \LINE\LINEBot($httpClient, ['channelSecret' => $channelSecret]);
$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)) {
        continue;
    }
    $bot->replyText($event->getReplyToken(), $event->getText());
}
```

### 画像を送るサンプル 

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

use LINE\LINEBot;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot\MessageBuilder\ImageMessageBuilder;
use LINE\LINEBot\MessageBuilder\MultiMessageBuilder;

$channelSecret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$channelToken  = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

$bot = new LINEBot(new CurlHTTPClient($channelToken), [
    'channelSecret' => $channelSecret
]);

$body  = file_get_contents('php://input');
$json  = json_decode($body);
$event = $json->events[0];

$total = mt_rand(1, 5);
$imageRoot = 'https://s3-ap-northeast-1.amazonaws.com/noplan1989-demo/line';
$messageBuilder = new MultiMessageBuilder();

for ($i = 0; $i < $total; $i++) {
    if ($i === 4 && mt_rand(1, 5) === 1) {
        $path = 'sushi';
    } else {
        $path = "alive/{$i}";
    }
    $messageBuilder->add(new ImageMessageBuilder(
        "{$imageRoot}/{$path}/original.png",
        "{$imageRoot}/{$path}/preview.png"
    ));
}

$bot->replyMessage($event->replyToken, $messageBuilder);
```



### LINE Bot Designer

* LINE Bot Designer というのものある。windowsとmacに用意されている。

>  LINE Bot Designerを使えば、プログラミングの知識がなくても簡単かつ短時間でLINE Botのプロトタイプを作成できます。ご希望のシナリオに沿って、自由にチャットボットを設計できます。

* https://developers.line.biz/console/tools


### push通知

* [LINE Messaging APIで phpから Pushメッセージを送信する – 出雲川開発](
https://ultimai.org/php/line-messaging-api%e3%81%a7-php%e3%81%8b%e3%82%89-push%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%82%92%e9%80%81%e4%bf%a1%e3%81%99%e3%82%8b.html)

userID

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/f037d84c-d664-66a1-0d9b-49137ca32f70.png)


```php
<?php
$channel_access_token  = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

// Your user ID
// Messaging API 管理画面で確認 これくらいながいやつ
$LINE_USER_ID = "Uxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

// LINE Messaging API プッシュメッセージを送る
$LINE_PUSH_URL = "https://api.line.me/v2/bot/message/push";


// 送信するメッセージ
$message_1 = date("Y-m-d H:i:s");
$message_1.= "です";

// リクエストヘッダ
$header = [
	'Authorization: Bearer ' . $channel_access_token,
	'Content-Type: application/json'
];

// 送信するメッセージの下準備
$post_values = array(
	[
		"type" => "text",
		"text" => $message_1
	],
);

// 送信するデータ
$post_data = [
	"to" => $LINE_USER_ID,
	"messages" => $post_values
];

// デバグ確認用のログ：送信データ
$file = './post_data.txt';
file_put_contents($file, json_encode($post_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), FILE_APPEND);
file_put_contents($file, PHP_EOL.PHP_EOL, FILE_APPEND);

// cURLを使った送信処理の時は true
// file_get_contentsを使った送信処理の時は false
$USE_CURL = true;

if ($USE_CURL) {
	// cURLを使った送信処理
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, $LINE_PUSH_URL);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
	curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($post_data));
	$result = curl_exec($curl);
	curl_close($curl);
}
else
{
	// file_get_contentsを使った送信処理
	$context = stream_context_create(array(
		'http' => array(
			'method' => 'POST',
			'header' => implode("\r\n", $header),
			'content'=>  json_encode($post_data),
			'ignore_errors' => true
		)
	));

	$result = file_get_contents(
		$LINE_PUSH_URL,
		false,
		$context
	);
}

// デバグ確認用のログ：受信レスポンス
$file = './result.txt';
file_put_contents($file, $result, FILE_APPEND);
file_put_contents($file, PHP_EOL.PHP_EOL, FILE_APPEND);
```

### 友達数を取得

```sh
channel_access_token='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'


curl -v -X GET https://api.line.me/v2/bot/insight/followers?date=20220920 \
-H 'Authorization: Bearer '$channel_access_token
```

### 友達のuserID一覧を取得

* 初期のアカウント権限では取得ができなかった。（認証済みアカウントまたはプレミアムアカウントのみで可能）

> {"message":"Access to this API is not available for your account"}

```sh
channel_access_token='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

curl -v -X GET https://api.line.me/v2/bot/followers/ids \
-H "Authorization: Bearer ${channel_access_token}" \
-d 'limit=1000' \
-G
```

```
友だち数と一致しない場合があります。

対象のLINE公式アカウントを友だち追加した後にブロックしたユーザー
プロフィール情報の取得に同意していないユーザー
```

### アカウント連携

* [ユーザーアカウントを連携する | LINE Developers](https://developers.line.biz/ja/docs/messaging-api/linking-accounts/#implement-account-link-feature)


##  LINE Notify

* [コマンドラインから LINE にメッセージを送れる LINE Notify](https://engineering.linecorp.com/ja/blog/using-line-notify-to-send-messages-to-line-from-the-command-line/)
* [access tokenの取得](https://access.line.me/oauth2/v2.1/login?loginState=7tZ1G6y9luh8DxibFJhCQK&loginChannelId=1476232700&returnUri=%2Foauth2%2Fv2.1%2Fauthorize%2Fconsent%3Fscope%3Dprofile%2Bopenid%2Bbot.add%26response_type%3Dcode%26redirect_uri%3Dhttps%253A%252F%252Fnotify-bot.line.me%252Flogin%252Fcallback%26state%3DIfctOyE2CPsuxefdWErNug%26nonce%3DMyP8Mp0kwhX4puny8XGlPO%26client_id%3D1476232700#/)

```sh
curl -X POST -H 'Authorization: Bearer [access_token]' \
   -F 'message=foobar' \
   https://notify-api.line.me/api/notify
```