8
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

LINE Messaging API を使って LaTex を送れるようにしてみた。

LINE で数式を送る

LINE で人と数学の話をするとき、どうしても数式を送りたいときがありますよね。

相手が生の LaTex を読める人ならいいのですが、そうもいかないことも多々あります。
Tex を送ると画像を返してくれる bot がないかと思って探してみましたが、なかったので作ってみました。

動作イメージ

LaTexIt!

以下の機能があります。

  • 1対1トークで Tex コマンドを送信すると、画像を返す
  • グループトークで先頭にt:をつけて Tex コマンドを送信すると、画像を返す

ソース

index.php
<?php
$line=array(
    'accessToken' => 'YOUR ACCESS TOKEN',
    'channelSecret' => 'YOUR CHANNEL SECRET'
);

$request = file_get_contents("php://input");
$json = json_decode($request,true);

//SIGNATURE CHECK
$signature = $_SERVER['HTTP_X_LINE_SIGNATURE'];
if($signature!==base64_encode(hash_hmac('sha256',$request,$line['channelSecret'],true))){
    error_log('Signature check failed');
    http_response_code(400);
    exit(0);
}
//PASSED!
$image_base="https://chart.apis.google.com/chart?cht=tx&chs=50&chl=";

foreach($json['events'] as $e){
    $tex = '';
    switch($e['type']){
        case 'message':
        if($e['message']['type'] === 'text'){
            switch($e['source']['type']){
                case 'user':
                $tex = $e['message']['text'];
                break;
                case 'room':    //「招待」を使ったトーク
                case 'group':   //グループを作成したトーク
                if(stripos($e['message']['text'],'t:') === 0){
                    $tex = substr($e['message']['text'],2);
                }
                break;
            }
        }
        break;
    }

    $header = array(
        'Content-Type: application/json',
        'Authorization: Bearer ' . $line['accessToken']
    );

    //SEND IT!
    if($tex !== ''){
        $url = $image_base . urlencode('\displaystyle '.$tex);
        $body = array(
            'replyToken' => $e['replyToken'],
            'messages' => array(
                array(
                    'type' => 'image',
                    'originalContentUrl' => $url,
                    'previewImageUrl' => $url
                )
            )
        );
        $context = stream_context_create(array(
            'http' => array(
                'method' => 'POST',
                'header' => implode("\r\n",$header),
                'content' => json_encode($body)
            )
        ));

        $result = file_get_contents("https://api.line.me/v2/bot/message/reply",false,$context);
         if (strpos($http_response_header[0], '200') === false) {
            http_response_code(500);
            error_log("Request failed: " . $result);
        }
    }
}

あえてフルスクラッチで作りましたが、特に深い意味はありません。

ローカル開発環境を一切使わずに、 App Service Editor だけで開発しましたが、
小規模な BOT などであれば、充分実用できると思いました。

LINE の場合は、変更を確かめるのに自分でメッセージを送らないといけないので、
編集後即座に保存・適用されるのがよかったです。
※ ローカルでテストもできるぜ!という方法をご存知の方、教えてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
8
Help us understand the problem. What are the problem?