LINE通知機能

らら
らら

はじめに

LINEの話が、ちょこちょこ来たので調べてみた・・

この手のは、facebook,Twitterとかと同じなので・・バージョン変わったりすると動かなくなるかも・・

まずは、LINE Notifyを使ってみる・・

これは、管理者に登録通知などに使用できそうです。メールフォームの管理者への通知とか・・

LINE Notifyは無料で登録できる上に、1時間に1000通以上送らなければ無料らしいし。個人アカウントでテストできる感じ・・

メールアドレスをLINEに登録していない場合は、スマートフォン(Android・iPhone)版LINEの[友だち]タブ>setting>[アカウント]から登録しておきます。

登録は下記から・・

https://notify-bot.line.me/ja/

LINE通知機能

LINE Notify API Documentは下記から・・昔は英語しかなかった気がするんですが・・・やりたくない病?

https://notify-bot.line.me/doc/ja/

LINE Notifyへログイン後、マイページへアクセスします。

下記は無視して。マイページへ移動します。

LINE通知機能

マイページに下記があるのでトークン発行をします。

LINE通知機能

トークン名をわかりやすいのでとりあえず登録します、

通知を送信するトークルームを選択します。自分ですねとりあえず・・

LINE通知機能

発行するボタンを押します。

アクセストークンが表示されるのでコピーします。

LINE通知機能

テストプログラム。LINE Notify API Documentをみてなんとなく作成。UTF8で保存してください

保存したアクセストークンを記載して、実行すると。LINE Notifyからメッセージが届きます・・

まぁ、REST API (RESTful API) ぽいのでまた、perlで・・

エラーチェックとかしてないです。。はい・・


#!/usr/bin/perl
use Encode;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
use HTTP::Request;
	$AccessToken = "取得したアクセストークン";
	my $ua = LWP::UserAgent->new;
	$ua->default_header('Authorization' => "Bearer $AccessToken");
	my $uri = 'https://notify-api.line.me/api/notify';
	#項目ふえそうなので連想配列で・・
	my %LINE_DATA = ();
	$LINE_DATA{'message'} = "テスト漢字";
	my $req  = POST($uri, [%LINE_DATA]);
	my $res = $ua->request($req)->as_string;

LINE Messaging APIを使ってみる

こちらは、LINE for Businnessの対応です・・ユーザーに通知できるらしいです。。

LINE Messaging APIは無料メッセージ通数、月1000通で利用できるらしい。

https://www.linebiz.com/jp/service/line-official-account/plan/

公式アカウント

https://www.linebiz.com/jp/service/line-official-account/

LINE Developersへアクセスし、Messaging APIを作成します

https://developers.line.biz/ja/services/messaging-api/

LINE Developersへアクセス

LINEログインAPIを作成します。

チャンネルの種類をLINEログイン

アプリタイプはウェブアプリを指定

コールバックURLを登録

ログインのフロー

https://developers.line.biz/ja/docs/line-login/integrate-line-login/#login-flow

ユーザーに認証と認可を要求する

https://developers.line.biz/ja/docs/line-login/integrate-line-login/#making-an-authorization-request

流れと。引数メモ

LINEにログインするための引数


response_type	codeは認可コードの発行を求めていることを示す。
client_id		クライアントを識別するID。あらかじめ発行されている。
redirect_uri	認可コード発行後にリダイレクトするURL。あらかじめLINE側で登録しておく。
state			クライアントがランダムな英数字文字列を生成する。CSRF対策に使用
scope			クライアントが要求するスコープを記載。今回はprofile

ユーザーにラインログインしてもらい。

codeをもらってoauth2してアクセストークンをもらい

ユーザープロファイルを取得してuseridを取得してそこにメッセージする

ダイレクトするURLに返される引数

$redirect_uri?code=xxxxx&state=xxxxxxx


code	LINEが発行した認可コード。これをもとにアクセストークンを取得する
state	クライアントが発行したランダムな文字列。CSRF対策に使用。

チャネルアクセストークンv2.1を発行する

grant_type=authorization_code

&code=xxxxxxxx

&redirect_uri=xxx

&client_id=xxx

&client_secret=xxx


grant_type		authorization_codeは認可コードグラントによるリクエストであることを知らせる
code			取得した認可コードの値を設定する
redirect_uri	認可リクエスト時と同じredirect_uriパラメータを指定
client_id		クライアントを識別するID。LINEで発行されたもの。
client_secret	クライアントを認証するためのシークレット。LINEで発行されたもの。

上記をもとになんとなく書いたもの・・

動作は不明です・


#!/usr/bin/perl
use Encode;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
use HTTP::Request;
use JSON;
$LINE_MSGPUSH_URI	= "https://api.line.me/v2/bot/message/push";
$LINE_PROFILE_URI	= "https://api.line.me/v2/profile";
$LINE_AUTHTOKEN_URI	= "https://api.line.me/oauth2/v2.1/token";
$LINE_AUTHLOGIN_URI	= "https://access.line.me/oauth2/v2.1/authorize";
#lineで取得したものを設定
$LINE_CLIENT_ID		= "";
$LINE_CLIENT_SECRET	= "";
$LINE_ACCESS_TOKEN	= "";
$LINE_REDIRECT_URI	= "";
	#state作成
	srand($$|time);
	$state = int(rand(60000));
	$state = unpack("H*",pack("Nnn",time,$$,$state));
###実際は、ここには記載しませんよ。。
	<form action="$LINE_AUTHLOGIN_URI">
		<input type="hidden" name="response_type" value="code">
		<input type="hidden" name="client_id" value="$LINE_CLIENT_ID">
		<input type="hidden" name="redirect_uri" value="$LINE_REDIRECT_URI">
		<input type="hidden" name="state" value="$state">
		<input type="hidden" name="scope" value="profile">
		<input type="hidden" name="bot_prompt" value="aggressive">
		<button>line login</button>
	</form>
###
	#ログインで設定したstateと戻りのLINEが発行した認可コードcodeをチェックする
	if($FORM{'code'} && $FORM{'state'} eq $state) {
		#チャネルアクセストークンv2.1を発行する
		my $ua = LWP::UserAgent->new;
		my $uri = $LINE_AUTHTOKEN_URI;
		my %_LINE_POST = ();
		$_LINE_POST{'code'}				= $code;
		$_LINE_POST{'grant_type'}		= 'authorization_code';
		$_LINE_POST{'redirect_uri'} 	= $LINE_REDIRECT_URI;
		$_LINE_POST{'client_id'}		= $LINE_CLIENT_ID;
		$_LINE_POST{'client_secret'}	= $LINE_CLIENT_SECRET;
		my $req  = POST($uri, [%_LINE_POST]);
		my $res = $ua->request($req);
		my $json = decode_json($res->content);
		$get_access_token = $json->{'access_token'};
		if($get_access_token) {
			#取得したアクセストークンでユーザー情報取得
			$ua = LWP::UserAgent->new;
			$ua->default_header('Authorization' => "Bearer $get_access_token");
			$uri = $LINE_PROFILE_URI;
			$req = HTTP::Request->new(GET => $uri);
			$req->referer($url);
			$res = $ua->request($req);
			$json = decode_json($res->content);
			$get_userId			= $json->{'userId'};
			$get_displayName	= $json->{'displayName'};
			$get_pictureUrl		= $json->{'pictureUrl'};
			#実際はすぐにおくらないので、ファイルに覚えておくなどする・・
			if($get_userId) {
				#取得したユーザーIDでメッセージ送信
				my $to		= $get_userId;
				my $msg		= "おくるよ";
				$ua = LWP::UserAgent->new;
				$ua->default_header('Authorization' => "Bearer $LINE_ACCESS_TOKEN");
				$ua->default_header('Content-Type' => "application/json");
				$uri = $LINE_MSGPUSH_URI;
				my $json_base = {
					"to" => $to,
					"messages"   => [
						{"type"  => "text", "text" => $msg},
					]
				};
				my $json_data = $json->utf8(0)->encode($json_base);
				my $req= HTTP::Request->new(POST => $uri);
				$req->content($json_data);
				my $result = $ua->request($req)->as_string;
			}
		}
	}

最後の方で perlのライブラリを発見・・cpan,githubに存在しています。

もともと、LINEって、perlで作られてたみたいですね。。このライブラリもLINEが作成したもののようです。

バージョンアップ時もこちらを差し替えることで対応できるので、よさげ・・

LINE::Bot::API;

https://github.com/line/line-bot-sdk-perl

さいごに

LINE for Businnessは、アカウントないので・・・試してません。。

では・・・メモでした・・・

関連記事