2011-10-24 6 views
1

私は本当にあなたの助けが必要です。twitterの許可を使用してPHPのHttp_request

私は、cURLを使用しないでPHPでTwitterからリクエストトークンを取得しようとしています。

私の最初の試みはfsockopenを使用していました。

$fp = fsockopen("ssl://api.twitter.com", 443) or die ("unable to open socket"); 

次に、以下のようにHTTP POSTヘッダーを作成しました。

$auth = "oauth_callback="http%3A%2F%2Fmydomain.org%2F~myID%2Ftwt-oauth%2Fcallback.php", oauth_consumer_key="ExmfrhvgMkUmwzGKCg5FQw", oauth_nonce="da4dfa747b27d83c9bbda69452a87bee", oauth_signature="L9ucYZUfKQ%2BRkp1FQNbzEXXrl1w%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1319451330", oauth_version="1.0" "; 


$msg = "POST /oauth/request_token HTTP/1.1 \r\n"; 
$msg .= "Host: api.twitter.com \r\n"; 
$msg .= "Authorization: Oauth " . $auth . "\r\n"; 
$msg .= "Connection:Keep-Alive \r\n\r\n"; 
$bytes = fwrite($fp, $msg); 

結果は、私にはわからない

HTTP/1.1 401 Unauthorized 
Date: Mon, 24 Oct 2011 10:15:30 GMT 
Server: hi 
Status: 401 Unauthorized 
X-Transaction: 1319451330-75511-27215 
X-Frame-Options: SAMEORIGIN 
Last-Modified: Mon, 24 Oct 2011 10:15:30 GMT 
X-Runtime: 0.00602 
Content-Type: text/html; charset=utf-8 
Content-Length: 44 
Pragma: no-cache 
X-Content-Type-Options: nosniff 
X-Revision: DEV 
Expires: Tue, 31 Mar 1981 05:00:00 GMT 
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0 
X-MID: 6301c02e82f43071b60e91cc31326d5354818c83 
Set-Cookie: k=143.248.234.102.1319451330738600; path=/; expires=Mon, 31-Oct-11 10:15:30 GMT; domain=.twitter.com 
Set-Cookie: guest_id=v1%3A131945133074814112; domain=.twitter.com; path=/; expires=Wed, 23-Oct-2013 22:15:30 GMT 
Set-Cookie: _twitter_sess=BAh7CDoPY3JlYXRlZF9hdGwrCL2IbTUzAToHaWQiJWEyZDlhNjMzYWJmMmNh%250ANmE2NDU1OTMyMzQ2MWY4MTkxIgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVy%250AOjpGbGFzaDo6Rmxhc2hIYXNoewAGOgpAdXNlZHsA--f5d5dc205f414bd74c0270e9610712ad1e04d2ee; domain=.twitter.com; path=/; HttpOnly 
Vary: Accept-Encoding 
Keep-Alive: timeout=15, max=100 
Connection: Keep-Alive 

Failed to validate oauth signature and token 

た理由...私はBASE64_ENCODEかでurlencodeする$認証する必要がありますか? (その後、どうですか?)
上記の$ authの値は、ログからコピーして貼り付けたものです。 ( ""で問題がありますか?)

私はHttp_requestをかなりシンプルにしようとしました。

$httpReq = new HTTP_Request("https://api.twitter.com/oauth/request_token"); 
$httpReq->setMethod(HTTP_REQUEST_METHOD_POST); 
$httpReq->addHeader("Authorization", $auth); 
$res = $httpReq->sendRequest(); 

は、次いで、$res->getMessage()は、上記最初の試みと同様 「OAuthの署名トークンの検証に失敗しました」です。

何が問題ですか?

私はここに非常に長い時間がこだわって...本当に助けが必要..

私はカール使用されるバージョンのコードを追加しました..私はそれを同じ結果をしたい...

function http($url, $method, $postfields = NULL) { 

// 
    $this->http_info = array(); 
    $ci = curl_init(); 
    // Curl settings 
    curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent); 
    curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout); 
    curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout); 
    curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE); 
    curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:')); 
    curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer); 
    curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader')); 
    curl_setopt($ci, CURLOPT_HEADER, FALSE); 

    switch ($method) { 
     case 'POST': 
     curl_setopt($ci, CURLOPT_POST, TRUE); 
     if (!empty($postfields)) { 
      curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields); 
     }  
     break; 
     case 'DELETE': 
     curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE'); 
     if (!empty($postfields)) { 
      $url = "{$url}?{$postfields}"; 
     }  
    }  

    curl_setopt($ci, CURLOPT_URL, $url); 
    $response = curl_exec($ci); 
    $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE); 
    $this->http_info = array_merge($this->http_info, curl_getinfo($ci)); 
    $this->url = $url; 
    curl_close ($ci); 
    // 

    return $response; 
    } 

    /** 
    * Get the header info to store. 
    */ 
    function getHeader($ch, $header) { 
    $i = strpos($header, ':'); 
    if (!empty($i)) { 
     $key = str_replace('-', '_', strtolower(substr($header, 0, $i))); 
     $value = trim(substr($header, $i + 2)); 
     $this->http_header[$key] = $value; 
    }  
    return strlen($header); 
    } 

答えて

1

fsockopen()を使用しているmy HTTP request classを使用している場所にいるかどうかを確認してください。徹底的に試してテストされています。現在のところOauthのネイティブサポートはありませんが、手動でヘッダをHTTPRequest::setRequestHeader()に設定する必要があります。 HTTPRequestネイティブクラスがインストールされている場合は、クラスの名前を変更する必要があります。元々は、ストリームサポートがなく、インストールされている拡張機能を制御できないPHP4環境で使用するために書きました。

コメントはファイルの先頭に記載されています。

+0

こんにちは、お世話になりました。私は突然、oauthの暗号化に問題があることを発見しました...パラメータの1つが間違っていました...あなたのクラスは私の役に立つかもしれません。再度、感謝します! :) – kong

関連する問題