2020年8月末頃から Trello API 経由のデータ取得が失敗する

経緯

Trello API 経由でデータを取得するプログラムが2020年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

そろそろ Guzzle 等を使った方法に書き換えましょうかね……。

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。