とりあえずLINE BOT APIうごかす

- [ベースのコード](#ベースのコード)
- [受信時以外の動き](#受信時以外の動き)
- [一方的にメッセージを送る](#一方的にメッセージを送る)
- [友達一覧](#友達一覧)
- [プロフィール取得](#プロフィール取得)


世界的ですもんね
乗るしかない　このビックウェーブに

今夏？にBOT STOREオープンするらしいので
いまのうちに把握しておきたいということで。

ざっと見た感じ気をつける点は

- SSL
- コールバックURLがなかなか認識されない
- WhiteList

[ミニバード](http://www.minibird.jp) で使えたので
ネットオウル系のレンタルサーバーの共有SSLは使えるようです。

前述の通り、
コールバックURLがなかなか認識されず、ログも取れないので
最初に固定IPオプションで試しましたが結局できるかどうか不明。

[LINE BOT APIでリクエストが飛んでこない（SSL関係）](http://qiita.com/git6_com/items/008404506836011af33b)
上記で情報がまとめられているので参考に。


# ベースのコード

```php
class LINE_BOT {
	private $end_point      = 'https://trialbot-api.line.me';
	private $channel_id     = '***';
	private $channel_secret = '***';
	private $mid            = '***';
	private $event_type     = '138311608800106203';
	private $to_channel     = '1383378250';
	private $result;
	private $content;
	private $post;
	function post($path) {
		$curl = curl_init("{$this->end_point}{$path}");
		curl_setopt($curl, CURLOPT_POST, true);
		curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($this->post));
		curl_setopt($curl, CURLOPT_HTTPHEADER, [
        	"Content-Type: application/json; charset=UTF-8",
        	"X-Line-ChannelID: {$this->channel_id}",
        	"X-Line-ChannelSecret: {$this->channel_secret}",
        	"X-Line-Trusted-User-With-ACL: {$this->mid}"
    	]);
		$output = curl_exec($curl);
		curl_close($curl);
		//error_log($output);
	}
	function set() {
		$text = '';
		switch ( $this->result['eventType'] ) {
			case '138311609000106303'://受信
				$text = 'ンゴ？';
				break;
			default:
				$text = 'おうふ';
				break;
		}
		$this->content = [
			'toType' => 1,
			'contentType' => 1,
			'text' => $text,
		];
		$this->post = [
			'to' => [$this->result['content']['from']],
			'toChannel' => $this->to_channel,
			'eventType' => $this->event_type,
			'content' => $this->content,
		];
	}
	function get() {
		$json  = file_get_contents('php://input');
		$data = json_decode($json, true);
		$this->result = $data['result'][0];
	}
}
$LB = new LINE_BOT();
$LB->get();
$LB->set();
$LB->post('/v1/events');
```

~~友達追加時にもメッセージ送りたいけどeventTypeが取れないのでそのうち探る。~~
↑
ブロック解除時と同じみたい。
ただ友達削除して再び追加しても取れないので新規のみか。



# 受信時以外の動き

メッセージ受信時以外でメッセージ送る場合。

- ブロック時

`$this->result['content']['opType']`
が `8` の場合。
もちろんブロックされているのでメッセージは送れない。
ただ内部的になにかしら処理することは可能なもよう。

- ブロック解除時

`$this->result['content']['opType']`
が `4` の場合。

メッセージ受信時は
`$this->result['content']['opType']`
はないのと中身も違うので`isset()`で判定か。


# 一方的にメッセージを送る

コールバックを叩くだけで動く。
この場合は最初の
```file_get_contents('php://input')```
がnullなんでそれで判定。



# 友達一覧

`/v1/profiles`でBotのmid指定したけど友達一覧は取れない。
メッセージ受信時のfromを都度保持しておくしかないのか・・？

```php
function addFriend($mid) {
	$friends = $this->getFriends();
	if ( !in_array($mid, $friends) ) {//新規の場合追加
		$friends[] = $mid;
		file_put_contents($this->friends_filepath, json_encode($friends));
	}
}
function getFriends() {
	$json = file_get_contents($this->friends_filepath);
	return json_decode($json, true);
}
```
こんなかんじで。
友達追加時のイベント取れればいいけどいまだに取れず。

#### 追記

友達追加時のイベントもどうやらブロック解除と同じみたい。
ただ一旦削除して、その後追加しても取れないので
新規の場合しか取れないと思われ。


# プロフィール取得

`/v1/profiles`の結果

```js
contacts: [
     {
         displayName: *名前* (string)
         ,mid: *mid* (string)
         ,pictureUrl: *プロフィール写真*(string)
         ,statusMessage: *ステータス* (string)
    }
]
```

早く１アカウントで複数Botが作れるようにならんかの