はじめに
LINE Messaging API for PHPでbotを作り、それをどうしてもherokuで動かしたかったのですが、どうにもこうにも反応してくれない。ふと、Fixieのプロキシを通してないからだと気付き、SDKを少しだけ改修する必要があることに気がつきました。ちなみにLINE Messaging API for PHPのライセンスは「Apache License v2.0」なので改修OKです。
LINE BOT API Trialで作られたbotの記事などでは、こうしたことにはほとんど触れられてないので気にせず動かせたのだと思いますが、LINE Messaging APIになってからは、恐らくこの修正をしないとherokuでは動かせないのではないかと思います。
そこでこの記事では、heroku上でどうしてもLINE Messaging API for PHPを動かしたい人のためのヒントになればと思いまとめてみました。
herokuの設定
この記事に興味を持ってくれた人は言われなくてもわかるかと思いますが、まずherokuでIPを固定にするためにアドオンのFixieを導入してください。導入後、FixieのプロキシURLが自動的にherokuの環境変数に登録されますが、ポート番号は削除しておきます。
修正前
FIXIE_URL http://fixie:**********.usefixie.com:80
修正後
FIXIE_URL http://fixie:**********.usefixie.com
またFixieのアカウント設定の画面に表示される二つのIPを控えておいてください。
LINE BUSSINESS CENTERの設定
アカウント一覧に表示れている制作中のボットのカラムから「LINE developers」の画面に移動し、サイドメニューの「Server IP Whitelist」を選択してください。表示されているフォームにFixieで控えておいた二つのIPを登録しておきます。ちなみにポート番号は不要なようです。
SDKの改修
/vendor/linecorp/line-bot-sdk/src/HTTPClient/CurlHTTPClient.php
改修前:90行目
$headers = array_merge($this->authHeaders, $this->userAgentHeader, $additionalHeader);
$options = [
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_BINARYTRANSFER => true,
CURLOPT_HEADER => true,
];
改修後:90行目
$headers = array_merge($this->authHeaders, $this->userAgentHeader, $additionalHeader);
$options = [
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_BINARYTRANSFER => true,
CURLOPT_HEADER => true,
// 以下を追加します。
CURLOPT_HTTPPROXYTUNNEL => true,
CURLOPT_PROXYPORT => '80',
CURLOPT_PROXY => getenv('FIXIE_URL'),
];
プロキシのURLは直接記述せず、登録してある環境変数を参照した方がスマートかと思います。
最後に
自分の場合は、このことに気がつくまでに何時間も無駄にしてしまいました。。。どうしてもherokuでLINEボットを動かしたいと思っている人のヒントになれば幸いです。それともこんなことをしなくても動かすことができるのでしょうか。何かご存知でしたら教えていただければと思います。LINE BOT AWARDSにわたしもエントリーしてみたのですが、さてさて結果はどうなるんでしょうか。
それでは、このへんで。