13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-23

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

13
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?