経緯
Trello API 経由でデータを取得するプログラムが2020年8月末頃からコケていたので原因を調査しました。
というのも、これによって
- Slack の登録から Slack のbotを作るまで(途中) (2018/9/3)
- Trello のタスクを監視し、完了したら Slack で褒めてくれる雷bot(2018/9/8)
- Trello のタスクを監視し、完了したら Slack で褒めてくれる雷bot 2(2018/10/8)
このbotが動作不良に陥ってしまったためです。
調査
まず API の URL をブラウザで直に叩いて取得できるか確認しました。これはOK。
次にプログラムのメソッドを叩いてみましたが、これはダメでした。
ただ、プログラムを実行した際に画面に以下の Warning が出ていました。
Warning: file_get_contents(https://trello.com/1/boards/xxxxxxxxxxxxxxxxxxxxxxxx/cards?key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx): failed to open stream: HTTP request failed! HTTP/1.1 426 Upgrade Required in PATH/TO/Project/DIRECTORY/program.php on line xxx
PHP の file_get_contents
で取得していたのですが、それが 426 Upgrade Required
で弾かれている模様。
そこで 426 Upgrade Required
をキーワードに追加して検索。情報は少なかったですが、以下のスレッドがヒットしました。
同じ現象ですね。2020/8/20に投降されたものなので、時期的にも一致。
この投稿に対して、質問者が自己解決して以下のレスが付いていました。
Forcing the call to use 1.1 seems to resolve for now. Something must have changed in the last couple of days.
対処
上述のレスを頼りに HTTP のプロトコルバージョンを1.1に強制してみます。
変更前は以下のようにシンプルに file_get_contents
を呼ぶプログラムでした。
// get request
$json = file_get_contents('https://trello.com/1/board/' . $board_id . '/cards?key=' . $api_key . '&token=' . $access_token);
これに、以下のようにコンテキストを組み立てる前処理を追加しました。
// make request header
$options = [
'http' => [
'method' => 'GET',
'protocol_version' => 1.1,
'header' => "Connection: close\r\n"
]
];
$context = stream_context_create($options);
// get request
$json = file_get_contents('https://trello.com/1/board/' . $board_id . '/cards?key=' . $api_key . '&token=' . $access_token);
これでもう一度メソッドを叩いて Warning が出ずに取得できるようになったことを確認。
ということで、いつから変更されたのか等の詳しい情報は追い切れていませんが、ひとまず対処することはできました。
参考
426 Upgrade Required
PHP
- PHP: file_get_contents – Manual
- PHP: stream_context_create – Manual
- PHP: HTTP コンテキストオプション – Manual
- HTTPリクエストのカスタマイズ | PHP プログラミング解説
- APIなどにfile_get_contents()を使うのはオススメしない理由と代替案 – Qiita
そろそろ Guzzle 等を使った方法に書き換えましょうかね……。