はじめに
LINEの話が、ちょこちょこ来たので調べてみた・・
この手のは、facebook,Twitterとかと同じなので・・バージョン変わったりすると動かなくなるかも・・
まずは、LINE Notifyを使ってみる・・
これは、管理者に登録通知などに使用できそうです。メールフォームの管理者への通知とか・・
LINE Notifyは無料で登録できる上に、1時間に1000通以上送らなければ無料らしいし。個人アカウントでテストできる感じ・・
メールアドレスをLINEに登録していない場合は、スマートフォン(Android・iPhone)版LINEの[友だち]タブ>setting>[アカウント]から登録しておきます。
登録は下記から・・
https://notify-bot.line.me/ja/
LINE Notify API Documentは下記から・・昔は英語しかなかった気がするんですが・・・やりたくない病?
https://notify-bot.line.me/doc/ja/
LINE Notifyへログイン後、マイページへアクセスします。
下記は無視して。マイページへ移動します。
マイページに下記があるのでトークン発行をします。
トークン名をわかりやすいのでとりあえず登録します、
通知を送信するトークルームを選択します。自分ですねとりあえず・・
発行するボタンを押します。
アクセストークンが表示されるのでコピーします。
テストプログラム。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は、アカウントないので・・・試してません。。
では・・・メモでした・・・