HTTPって大変だね

Category : PHP < ウェブ開発

Tags : HTTP php

HTTPリクエスト

class TinyHttp
{
    public $header;
    public $body;
    public $error;
    public function __construct($url, $context = null)
    {
        if ( !empty($context) ) {
            $this->body   = @file_get_contents($url, false, $context);
        } else {
            $this->body   = @file_get_contents($url);
        }
        $this->header   = $http_response_header;
        $this->error    = !((bool) $this->body);
    }
    public function getStatusCode()
    {
        if ( preg_match('@^\s?HTTP\/([0-9].[0-9x])\s+([0-9]{3})\s+([0-9a-zA-z\s]*)$@', $this->header[0], $match) )
        {
        $status = array(
                        'version'   => $match[1],
                        'code'      => $match[2],
                        'status'    => $match[3],
                        );
        }
        return !empty($status) ? $status : false;
    }
}
//contextはなくてもいい。
$http = new TinyHttp($request, stream_context_create($context));
//ヘッダー
print_r $http->header;
if ( $http->error ) {
    //しっぱい
} else {
    //どれどれボディを見せてもらおうか
    print_r $http->body;
}

こんなん書いてみたわけさ。API宛てに手軽にリクエスト撃ちたかったので。

したら、不都合ありありで苦戦した次第。

PHPの組み込み関数は200 OK以外のレスポンスボディを取ってこない

※レスポンスボディは、HTTPでどっかのサーバーをぺちっと叩いて、返ってきたモノのメイン部分。前半分のサーバー同士のやり取りに使われる取り決められた情報は、レスポンスヘッダーらしい。

file_get_contentsとかstream_get_contentsのファイルやらストリームの関数は、正常にリクエストできないとWarnning噴くわボディは取ってこないわ潔すぎる感じ。

Twitter APIの場合、401 Not Authorizedとか、400 Bad Requestが返ってきたときにボディまで読まないと真の理由が分からなかったりする。(ボディ読んでも適当なことのほうが多いけど)

下記の情報によると、PHP5.3からはコンテキストにignore_errorsを混ぜるといいらしい。でも5.3って、仕事では、いまだにお目に掛かったことない罠。あと、既存の関数共も、正確には2xxなときに取ってくるみたい。200限定ではないらしい。

参考:HTTP ストリーム ignore_errors オプション in PHP 5.3 - 親方、空から覚え書きが!

$http_response_headerはよい子

何らかのHTTP的な動作の直後に、このhttp_response_headerという変数にレスポンスヘッダーが格納されるみたい。配列型で。$はついてるけど、定数的な動作?

上のコードでも、コレのおかげでレスポンスヘッダーだけは何となく取得できるので良い感じ。

file_get_contentsでもPOSTできる

やれば出来る子ですねー。上のコードも、file_get_contentsに適当に依存してるので、context混ぜればPOSTします。

参考:file_get_contentsでPOSTデータ送信 - PHPはやれば出来る子

車輪のナントカ?

というような発見と悩みを抱えながら、ソケット接続からHTTPリクエストして、レスポンスヘッダーもボディもちゃんと取ってくる、API叩く君を書いてました。いまだに、gzipの処理とか、chunkedなデータの扱いとかが納得いかないできばえ。もうちょっと頑張ります。



Twitter API&OAuthと戯れる

Twitter API つーか OAuthと格闘

Twitter APIと遊ぶ機会があったので、もそもそと調べたり書いたりしてみました。OAuth部分の処理を書くのに少し時間がかかったり。既存品を使っても良かったのですが「その場の環境で動けば正義」というわけにもいかないので、処理を自分の制御下におくべく、OAuth部分の実装もゼロから書いてみました。

参考:APIアクセス権を委譲するプロトコル、OAuthを知る − @IT

そんときの調べごとをスピンアウト的にメモ

TwitterではOAuthでの認証を推奨?

むしろ、Basic認証はそのうち非推奨&サポートしなくなるみたいですね。OAuthのほうがセキュアな気もしますけど、スパムにあっさり引っかかる人間の不注意がなくなるまではBasic認証のほうがセキュアじゃないんすか疑惑。

参考:Twitter APIのBASIC認証は2010年6月に「廃止予定」 - 頭ん中

APIの制限が150回ではない?

APIの回数制限がネックになるだろうなー、って思いましてAPIを叩ける回数について調べていました。したらば、公称の150回を超える回数で、回数制限対象のタイムライン系API( statuses/home_timeline.format, statuses/friends_timeline.format )を叩いていたら、150回を超えても一過性のタイムアウトを除いてちゃんと応答が返ってきている謎。

account/rate_limit_status という、現在の制限状態(残り回数とか制限がリセットされる時間とか)を教えてくれるAPIも並列で叩いてみたところ数字の推移が明らかにおかしいのです。

んで。

httpリクエストしてからレスポンスのヘッダーをとってみたら以下のような不思議な記述(抜粋)が。

string 'X-RateLimit-Limit: 450'
string 'X-RateLimit-Remaining: 306'

そしてその瞬間に account/rate_limit_status い問い合わせたところ

object(stdClass)[15]
  public 'reset_time' => string 'Tue Jan 12 12:23:27 +0000 2010'
  public 'remaining_hits' => int 102
  public 'hourly_limit' => int 150
  public 'reset_time_in_seconds' => int 1263299007

150回を超えてAPIを叩いてもちゃんと反応してくれたという事実を加味すると、どうも今の制限回数は公称値の3倍である450回に設定されているようです。remainingの値も、account/rate_limit_statusの値 *3 = http_request_headerの値 で安定しているので裏付けとなっているでしょう。

補足的に下の記事も、自分の仮説を支持してくれているようなので、ひとまず450回の制限を軸に考えていきます。もちろん、途中で150回に戻る可能性も考えなければいけませんが。

参考:Twitter API の Rate Limit が一部緩和? - trial and error

おまけ@TwitterとOAuth用のphpをかいたので

業務的にはきっと、a-blog cmsの中の組み込みシステムとして吸収されてしまうので、まだ独立性を保っているうちにコア部分だけ単品ファイルにして用意してみます。もう処理は書けてるので、サンプルファイル作ったら公開してみますね。

今度、ソレを使ってa-blog cmsでつくるTwitter BOTの作り方でも書いてみましょうか。もっと実用的にTwitter連携のGETモジュールでも書けたらそれでいいかな。

おまけ2@a-blog cms でつくる Twitter BOT

今使っているロリポとかcron(指定プログラムを指定スケジュールで実行するヤツ)がないので、GETモジュールとしてBOTプログラムを起動させたらいいんじゃないかな、と。

検索エンジンのクローラーがアクセスしてくれれば、最低限の回数ぐらいは起動してくれるはず。逆にアクセス過多な場合でも、キャッシュの残存時間を調整すればいいんじゃないかしら。



日間賀島観光ホテル

Category : 食べもの

Tags : ふぐ

とにかく河豚でした。初てっさ!

昨年の忘年会のことです。載せ忘れ続けていたら年を越していました。キャア。



  • 先出(ナマコとイカの何か)
  • てっさ(ふぐの刺身)
  • かに+ ふぐの唐揚げ
  • てっちり(ふぐの鍋物)
  • ふぐ雑

 炊入社してからかねがね伺っていた忘年会の河豚を堪能してきました。すすめられるがままに、大皿から刺身を箸で豪快にすくいとってみたりゴージャス気分を堪能しました。

 ひれ酒も美味しかったー。食後は海を臨むテラスでコーヒーのみながら休憩。昼間から酒飲んでのんびりするとか、贅沢な時間を過ごせた気がします。また来年もきたいですね。次は伊勢海老付きの上位メニューを頼めるように期待して頑張ります!稼ぐぞ!!