uzullaがブログ

uzullaがブログです。

続、LINEのMessaging APIを使うメモ:PHP-SDKでbotをつくるぞ

はっきりいって説明不要というか、よくできたSDKがあるのでそれをつかえば完成します。

github.com

Tokenを取得

LINE Developers

からchannel secret, channel tokenを取得します。

(なんかちがうアカウントがでてきてしまう…などの場合は前日のエントリを参照)

SDKをDLしてComposerする

$ mkdir my_bot
$ cd my_bot
$ php composer.phar require linecorp/line-bot-sdk
$ mkdir wwwroot
$ cd wwwroot

とかします。

最低限このような雑なコードを書きます

(たとえば)wwwroot以下に、自分がLINEに登録したcallback URLになるようにファイルを設置します。

(くわしくは前日のエントリをみてください)

<?php // callback.php
define("LINE_MESSAGING_API_CHANNEL_SECRET", 'your channel secret');
define("LINE_MESSAGING_API_CHANNEL_TOKEN", 'your channel token');

require __DIR__."/../vendor/autoload.php";

$bot = new \LINE\LINEBot(
    new \LINE\LINEBot\HTTPClient\CurlHTTPClient(LINE_MESSAGING_API_CHANNEL_TOKEN),
    ['channelSecret' => LINE_MESSAGING_API_CHANNEL_SECRET]
);

$signature = $_SERVER["HTTP_".\LINE\LINEBot\Constant\HTTPHeader::LINE_SIGNATURE];
$body = file_get_contents("php://input");

$events = $bot->parseEventRequest($body, $signature);

foreach ($events as $event) {
    if ($event instanceof \LINE\LINEBot\Event\MessageEvent\TextMessage) {
        $reply_token = $event->getReplyToken();
        $text = $event->getText();
        $bot->replyText($reply_token, $text);
    }
}

echo "OK";

このコードは色々とエラー処理を端折っていますが、何を返しても向こう側はなにかしてくれるわけでもないのでここでは省略します。

SDKのexample以下のKitchenSinkをみればあらゆるものがあります。

line-bot-sdk-php/Route.php at master · line/line-bot-sdk-php · GitHub

SDKのサンプルは非常にちゃんとしてますので、受け取り方、メッセージの組み立て、大体全部の例があります、すごい。このエントリでなくそちらをまねましょう。実際の所、僕も上のコードは結構端折っており、実際にはそっちをマネてます。

これで完成です

botにはなしかけると、おうむがえしします。

            $text = $event->getText();
            $bot->replyText($reply_token, $text);

ここらへんかきかえると、自由に返事のテキストを組み立てできます。

オウム返しされない場合、エラーログなどをみてみましょう。多分なんかおかしいのでしょう。

まとめ

よくできたSDKなので説明することがありません。 サンプルがよくできすぎてるので、雑に書きなおしただけな気がします。

なお、PHP5.6以上が必要なので、気を付けましょう。

余談

当方はAzure App ServiceというPaaSがイケてるし安いので、PHP7がつかえるのでそれでやりました。

(その場合、curlの罠があるので、SSLのエラーがでたら一つ前のエントリをみてみてください)

uzulla.hateblo.jp

こちらからは以上です。

Azure App ServiceのPHPつかっていてcurlがSSLのエラーを吐くので対処

github.com

LINEのMessaging APIをたたくSDKがあり、今これをつかったアプリをかいておりますが、Azure App Serviceでうごかしてみています。

で、App ServiceにはいってるPHPにはca証明書の指定がないようで、以下の様なエラーがでました。*1

PHP Fatal error:  Uncaught LINE\LINEBot\Exception\CurlExecutionException: SSL certificate problem: unable to get local issuer certificate in D:\home\site\vendor\linecorp\line-bot-sdk\src\LINEBot\HTTPClient\CurlHTTPClient.php:110
Stack trace:
#0 D:\home\site\vendor\linecorp\line-bot-sdk\src\LINEBot\HTTPClient\CurlHTTPClient.php(73): LINE\LINEBot\HTTPClient\CurlHTTPClient->sendRequest('POST', 'https://api.lin...', Array, Array)
(以下略)

皆さんご存じでしょうが、これはSDKが悪いのではなくてcurlhttps通信の検証が出来ないエラーです。

解決策

証明書を指定しましょう。これが自分で書いたコードなら

curl_setopt($c, CURLOPT_CAINFO, __DIR__.'cacert.pem');

みたいなことをかけばOKなんですが、今回はSDKの中なので、そういった雑なことはしたくない。

正しい解決策としては、curl.cainfophp.iniにかけばOKですね。ただ、このcurl.cainfoは置くだけでつかえる.user.iniでは指定できないPHP_INI_SYSTEMの範囲なので、もう一手間かけます。

公式ドキュメントにも記載があります。

azure.microsoft.com

上記URLから抜粋すると、以下のような感じです。

1. アプリの設定 (キー PHP_INI_SCAN_DIR、値 d:\home\site\ini) を Web アプリに追加する
2. d:\home\site\ini ディレクトリに settings.ini ファイルを作成します。
3. 設定を settings.ini ファイルに追加します。たとえば
curl.cainfo="%ProgramFiles(x86)%\Git\bin\curl-ca-bundle.crt"
4. 変更内容を読み込むには、Web アプリを再起動します。


ただ、やってみて午前四時の脳にウケたんですが、%ProgramFiles(x86)%\Git\bin\curl-ca-bundle.crtこれは無いです。

なので、d:\home\siteとかに

https://curl.haxx.se/ca/cacert.pem

をダウンロードして保存し、settings.phpには

curl.cainfo=d:\home\site\cacert.pem

などと記述しましょう。これで正しく通信できるはずです。

まとめ

PHP_INI_SYSTEMも変更できるAzure の App Service最高! これくらいは最初から設定されててほしいな!

こちらからは以上です。

*1:これは多分PHP7の話なので、それより前にすれば(げふん)

LINEのMessaging APIを使うメモ:事前知識と登録編

雑に行きます。

DISCLAIMER

この記事の情報は、一切の保証も補償もしません。

ただ、間違っているところがございましたら、是非ご指摘下さい。

前提知識

LINE の Messaging API は平たく言えば BOT を作るための API です。Web API経由で自分のアプリケーションサーバとLINEのAPIでやりとりできます。

そのBOTアカウントと友だちになったLINEユーザーはメッセージのやりとりができます。そのメッセージのやりとりと、自分のアプリケーションをつなぎこむ為のAPIです。

(Messaging APIはLINE@とよばれるビジネス向けLINE機能の一部とおもえばよいはずなのですが、LINE@から後付けでこの機能を有効にできたり、いまいちサービスメニューが整理されてるとは言えないのでウッカリ嘘を書きそうです。公式をみましょう。 https://business.line.me/ja/

(過去にBOT Trialやってる人は結構混乱すると思います(後述))

お金はかかるの?

LINE@には色々な機能があるのですが、BOTに関係ある点は以下です。

  • BOTからユーザーにメッセージを送る仕組みは、PushとReply二種類がある
  • 自由なタイミングでユーザーに通知できるPushはお金がかかる
  • 例外として、Developer TrialのBOTアカウントは、友だち数上限50人の代わりにPushが無料
  • Replyは(実質的に)無料*1。しかしユーザーがメッセージを送ってきた直後しかレスできない

とりあえずこれだけで十分でしょう。

Pushについて

Pushは相手にいつでもウェブアプリ側の任意のイベントでメッセージを送れるもので、キャンペーン通知とかDMとかで万人が使いたいやつです。

万人が使いたいのはお見通しなので、ここがLINEが課金する重要ポイントのようです。使うなら毎月3万以上*2払う必要があります。ビジネスならいいですけど個人では敷居が高いですね。

とはいえ、前述の通り、50人までの友だち範囲なら開発アカウントでPushは無料でつかえます。

※ここでのPushはMessaging APIの話であり、先日書いたNotification APIとは別のものです、ご注意ください

Replyについて

ユーザーがBOTにメッセージをおくると、即座にLINEから登録したWebhook URLにJSONがとどきます。JSON内にReply用Tokenがあり、それを30秒以内につかうと一度だけメッセージ返信できます。*3

このReplyはPushと違って無料でつかえますが、ユーザーアクションから30秒以内に1度だけなので、サービス設計としてなかなか考えないといけないですね。

ということで、前提終わり。

アカウント作成

すでにLINEやってる人は不要ですが、まずはスマホにLINEをいれてアカウントをつくり、ID/PASSを設定しておきましょう。

Developer Trialに登録する

登録の流れは以下URLにあります。英語ですが、動画なので比較すればわかると思います。

https://developers.line.me/messaging-api/getting-started

兎に角以下のURLをひらいて、「Developer Trialを始める」をクリック。

https://business.line.me/ja/services/bot

LINEアカウントでログインして所定の情報を入力しましょう。*4

動画にもありますが、Developer Trialに登録すると、LINE@のBOT(?)アカウントを開設できます。適当につくりましょう。

その後、BOTアカウントの設定にて、「APIを利用」を押すと、なんか「1:1トーク」とか「LINE@アプリ」とかが色々つかえなくなるぞ!っていわれますけど、別にそういった機能はBOTではいらないとおもいますので了承しましょう。これでこのアカウントはBOTのアカウントになります。

会社事業者などを登録する

動画にはでてきませんが、LINE@は一応法人向け(?)のサービスなので、初回は色々聞かれます。(道義的にも)本名をいれないといけないのですが、この本名は友だち登録時に表示される事を認識しておきましょう。

プルダウンなどには「個人」ともあるので、法人向けのサービスではありますが、個人でも問題はないようです。(特に法人格を確認される事もないし…)

過去にBOT APIを触った人向けの情報

過去のBOT APIトライアルをやったことがある人は、しばしば今回つくったBOTアカウントではなく、過去につかったBOTAPIがでてきて混乱します。

たとえば、以下URLの右上のchannnelsをひらいても「昔のbotのアカウント」がでてきて「今のMessaging APIをつかうBotアカウント」にいけないことがあります。

https://developers.line.me/

その場合、以下URLを開いてヘッダーのアカウントリストひらいて、そこのアカウント一覧から、LINE DEVELOPERSをえらぶとよいです。

https://business.line.me/ja/

初見では非常に分かりづらいですが、一度やればおぼえます*5

この昔のBotアカウントをけしたいのですが、現在は消す方法なさげです。

https://devdocs.line.me/ja/?php#common-spec

話を戻して、とりあえず自分のLINEからBOTを登録します

QRコードからボットを登録しておきましょう。

ここで、(QRコードから追加する友だちが)アプリであること、アプリ(というよりアカウント)の名前、事業者の名前などが表示されます(自分の名前を登録したら、ここに自分の名前がでます)。

ためしにはなしかけてみると…

アプリを実装しなくても友だち登録はできるし、BOTにも話しかけられます。

BOTにメッセージを送ると「レスができないよ!」みたいな事を返してきますが、これはLINE@のオートリプライ機能です。BOTでオートリプライされると不便なので、オフにしましょう。

これはLINE@の機能なので以下のURLから設定していきます。

https://admin-official.line.me/

アカウント一覧から、BOTアカウントを選び、

左メニューから、アカウント設定>Bot設定。詳細設定のところに、「自動応答メッセージ」と「友だち追加時あいさつ」の設定をかえて保存しましょう。

Webhook URLを登録する

適当な公開サーバーにコールされるAPIを用意しましょう。とりあえず様子見で以下のようなPHPを作成しました。

これはLINE APIが送信してくるJSONをファイルにかきだしているだけです。

<?php
ob_start();
$raw = file_get_contents('php://input');
var_dump(json_decode($raw,1));
$raw = ob_get_clean();
file_put_contents('/tmp/dump.txt', $raw."\n=====================================\n", FILE_APPEND);

echo "OK";

※PHPer向け注意:POSTで来る、といってもapplication/x-www-form-urlencodedじゃないんで、$_POSTとかにははいってきません。php://inputで、リクエストボディをみましょう

これを仮に https://hoge.example.com/callback.php として作成したらそれをwebhook URLに登録します。ここはhttps必須です。

ボットに向かってメッセージを送ってみましょう。

すると上のコードでは /tmp/dump.txt におくられてきたJSONが保存されていきます、なるほどな、と言いましょう。

上のファイルはちょっとした動作確認をしたら捨てます(。もっとちゃんとしたライブラリがありますので。

この時、(オートリプライを切っていれば)はなしかけた側のLINEにはなんの返事もありません。上でOKとかechoしてますが、これは意味ないです。ステータス200をおくればOKもいらないようです。 返事をするのは、別途ちゃんとMessaging APIをつかう必要があります。

管理画面をちゃんと見た人向け情報

IPのWhite listがありますが、ここは「設定しなければ」、あらゆるIPを受け入れるようです。

続く

あとは以下をみてうまいことやっていきたいとおもいます。

https://devdocs.line.me/ja/

多分つづきます。

俺用メモリンク

*1:メッセージ配信数上限はある

*2:いまはCP中で2万

*3:新しくメッセージがとどけばまたTokenは発行されます

*4:LINEに認証用の4桁トークンがとんでこない時が希にありました、その場合は一回閉じてやりなおして、LINEアプリをひらきなおしましょう

*5:毎回やるので多少うんざりしますけど