【PHP】LINE Messaging API の絵文字（emoticon）送信方法

以前、LINE Messaging APIでプッシュメッセージしていたときに絵文字（emoticon）も送りたいという話になり、[公式ドキュメント](https://developers.line.me/ja/docs/messaging-api/reference/)を見たが、

```
以下の絵文字を含むテキストメッセージを送信できます。
 ・ Unicodeで定義された絵文字
 ・ LINEが独自に定義した絵文字。LINE独自の絵文字のUnicodeコードポイント表を参照してください。
```

という内容でいまいち送信のやり方がわからなかったので、送信方法を備忘録として記載しようと思います。


## LINE Messaging APIで使用可能な絵文字（emoticon）
![emoticon.png](https://qiita-image-store.s3.amazonaws.com/0/60279/62512f64-76f7-edc4-d583-d773559aa7a5.png "emoticon.png")

引用：[公式ドキュメント、LINE独自の絵文字のUnicodeコードポイント表](https://developers.line.me/media/messaging-api/emoji-list.pdf)


## PHPでの送信方法
調べたところ、[line-bot-sdk-php](https://github.com/line/line-bot-sdk-php/issues/54)に情報があったので、
試したところプッシュメッセージに絵文字（emoticon）を送信できた。

```php
// 0xを抜いた数字の部分
$code = '100078';
// 16進エンコードされたバイナリ文字列をデコード
$bin = hex2bin(str_repeat('0', 8 - strlen($code)) . $code);
// UTF8へエンコード
$emoticon =  mb_convert_encoding($bin, 'UTF-8', 'UTF-32BE');

//配列などに格納して使う
$text[] =  array("type" => "text","text" => $emoticon);
```

## プッシュメッセージ結果
※ 数字の部分をテキストで送り、絵文字を先程の処理で返信する仕組みを作ってみました。
　下記がその画像になります。

![6621.png](https://qiita-image-store.s3.amazonaws.com/0/60279/86642075-3915-2abc-06c8-c415de636437.png "6621.png")

### 返信処理のソース公開（参考程度）

文字だけをピックアップして返信するので、
スタンプとかは、既読スルーします。。。


```PHP:reply.php
  $httpRequestBody = file_get_contents('php://input');
  $jsonObject = json_decode($httpRequestBody,true);
  $replyToken = $jsonObject["events"][0]["replyToken"];

  //X-Line-Signature Request Headerに入っているSignature検証で、LINE Platformから送信確認
  $hash = hash_hmac('sha256', $httpRequestBody, $this->ChannelSecret, true);
  $signature = base64_encode($hash);
  // 拡張ヘッダからAPI側から設定されているSignatureを取得
  $compSig = $_SERVER['HTTP_X_LINE_SIGNATURE'];

  // LINEからの送信であれば実行
  if ($signature == $compSig) {
    $topType = $jsonObject["events"][0]["type"];//　follow,unfollow,message　イベントタイプ
    $userId  = $jsonObject["events"][0]["source"]["userId"]; //LINEユーザID
    $groupId  = $jsonObject["events"][0]["source"]["groupId"]; //LINEユーザID

    //メッセージ受信の処理
    if($topType == "message"){
      $type = $jsonObject["events"][0]["message"]["type"];
      $text = $jsonObject["events"][0]["message"]["text"];

      //テキスト受信
      if($type =="text"){

        //絵文字を返信する処理
        $code = $text;
        $bin = hex2bin(str_repeat('0', 8 - strlen($code)) . $code);
        $emoticon =  mb_convert_encoding($bin, 'UTF-8', 'UTF-32BE');

        $textArr[] =  array("type" => "text","text" => $emoticon);
      //テキスト受信
      }
    }//メッセージ受信の処理

    //返信処理
    if(count($textArr) > 0){
      $this->ReplyMessage($replyToken,$textArr);
    }
  }// LINEからの送信であれば実行


/**
* 返信処理
*/
public function ReplyMessage($replyToken,$textArr){
  $ChannelAccessToken = チャンネルアクセストークン;

  $post["replyToken"] = $replyToken;
  $post["messages"] = $textArr;

  $url = "https://api.line.me/v2/bot/message/reply";
  $ch = curl_init();
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_POST, true);
  curl_setopt($ch,CURLOPT_CUSTOMREQUEST,'POST');
  curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch,CURLOPT_POSTFIELDS, json_encode($post));
  curl_setopt($ch,CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json; charser=UTF-8',
    'Authorization: Bearer ' . $ChannelAccessToken
  ));
  $res = curl_exec($ch);
  $obj = json_decode($res,true);
  curl_close($ch);
}

```