uzullaがブログ

uzullaがブログです。

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:毎回やるので多少うんざりしますけど

LINE DEVELOPER DAY 2016良かったですね!特にタンブラー良いですね!

linedevday.linecorp.com

昨日開催されたLINE DEV DAYの引き出物(ではなくて、お土産)、中身が異常に豪華で各方面において話題になっております。

話題の中心はあきらかにBTのなにやらなのですが、もうね、このタンブラーに注目しないといけないわけですよ。

カッコイイタンブラー

うむ、かっこいいですね。そしてカッコイイロゴを生かし、テキストを配置しない、この余裕、この自信。

結構大容量なのも良い感じです。

f:id:uzulla:20160930144458p:plain

口の所がとがってないので、さわりがよいタイプです。ぼくもこのタイプ好き。

f:id:uzulla:20160930144548p:plain

しかしぬかりない

ここですよね、僕が一番びっくりしたのは。底に加工がしてある!!なにこれ!くやしい!これはくやしい!(このくやしがりポイントは何なんだ)

f:id:uzulla:20160930144516p:plain

ベタッとテキストを側面においたらダサイ、しかしやはりテキストはいれないといけない、そこでこの解決策ですよね…。

これをみつけてしまったので、このエントリを書きました。

よってここで言いたい事は終わりです、有り難うございました。

これをやった人は何41さんなんだ…。

以下は蛇足です。

永く使いましょう

ぐうぜんにも、私も2015年にこういった似たノベルティを作成にかかわっておりまして、非常に長くつかえることを確認しております。

f:id:uzulla:20160930144623p:plain

やはり、レーザー刻印されたロゴは見込み通りかすれにくく、金属製のボディは何度落としても割れないので最高ですね。

f:id:uzulla:20160930144633p:plain

なお、我が家においてはこれは奥さん用となっているので、今後はこのLINE DEV DAYのタンブラーを私は活用していきたいと思います。

タンブラー以外のLINE DEV DAY 2016の感想

一言で言って、すごいすごさを感じた。

「ココがすごかった!」

  • 「発表内容が勿論良い」
    • 色々な新規機能の発表があって飽きない
    • 現実でつかっている事例・設計の発表が多くて為になる
    • わりとカジュアルに具体的なサーバー台数とかもはなしていて興味深い
    • 登壇者のみなさまの、いままでになくプロっぽいしゃべり
      • スポットライトだし、ハンズフリーマイクだし、PCの向こう側じゃないし
    • 勿論社内紹介もへーってなる
  • 「クオリティ」
    • 当日だけの消え物に手をぬかない行き届いたクオリティ
    • 会場装飾にコダワリがすごくて、聞かないとわからないレベル
    • 「これ設備レンタルでいくらするんや…」とクラクラする
      • 同時通訳系色々
      • つり下げディスプレイ
      • 多カメラ、スイッチング
      • プロのカメラマン、そしてプロの映像カメラマンの派遣
      • 11Fカフェ貸し切り
    • 専用ノベルティ?のビール、お菓子など
    • LINEを用いた総合的なシステム(受付、通知、アンケート、タイムテーブルへのリンク…等々、具体的なデモになっていて大変に参考になる)
    • 冒頭のタンブラーを含めたお土産
      • お土産のハコ、これがやばい(真顔)ハコがカッコイイとテンションあがるよね。*1
    • (下世話ですけど)お食事券すごい…、ごちそう様でした
  • 「コミュニケーション感」
    • 懇親会でLINE社員はTシャツをきており、見分けができるので色々話かけられる。
    • 「こんなにLINE社員っているんだ…」と思った
    • 懇親会がちょっとだけ長くてゆっくりしゃべれた(気がしたw)
    • 参加者は日本人だけではないので、同時通訳で日本語→英語もちゃんとやられていた

f:id:uzulla:20160930145552p:plain

プレートかっこいいですね。

f:id:uzulla:20160930145633p:plain

かわいい。

f:id:uzulla:20160930145658p:plain

あの大物エンジニアもくつろぐ11F貸し切りカフェ

カロリーもすごい()

f:id:uzulla:20160930145016p:plain

(コダワリのある受付(の天井装飾)の様子)

f:id:uzulla:20160930150405p:plain

技術デモも兼ねたのであろうLINEをつかった受付システムもなかなかカッコイイ

f:id:uzulla:20160930150330p:plain

話題のビーコンがはいった?オブジェ、こういうのもちゃんと立体で作っちゃうのすごいぞ…。

f:id:uzulla:20160930145331p:plain

レイヤー?をイメージした壁の装飾も、つり下げLEDモニタも、奥の壁の超ワイドスクリーン(壁一面)もすごい。*2

f:id:uzulla:20160930145103p:plain

広い会場が満員の懇親会

まとめ

すごくよかった。

また来年もいっちゃおうかなー。

関連記事

uzulla.hateblo.jp

*1:ハコがださくて5日落ち込んだ俺が言うから間違いない(?)

*2:ワイドスクリーンに色々やるには、それだけでも色々な専用機材が必要だろうし、すごいってなった…