2012-04-26 5 views
6

ライブのつぶやきを特定のトピックで録音する予定です。同様に、私はPHPのcURLでtwitterストリームAPIを使用しています。私は0にCURLOPT_RETURNTRANSFERを設定している場合cURLの出力を使用する

<?php 

$username = "xxxxx"; 
$password = "xxxxx"; 


$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, 'https://stream.twitter.com/1/statuses/filter.json?   track=SEARCH_PARAMETER'); 
curl_setopt($ch, CURLOPT_USERPWD, $username.":".$password); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
$result = curl_exec($ch); 
$jsonOBJ = json_decode ($result); 

curl_close($ch); 

print_r($jsonOBJ); 
?> 

私の問題があり、私は、端末上のつぶやきを見ることができます:ここで

はコードです。しかし、変数$ jsonOBJに格納して印刷することはできません。

助けてください!

+0

oauthを使用してphpのsdkを使用する方が簡単でしょうか? – chepe263

+0

$ resultを出力して、デコードしようとする前にどのように見えるかを確認します。 – MrCode

+0

今、私はこの "echo $ result;"を直接行っています。 しかし、このスクリプトの実行では何も表示されません。 – Gooner

答えて

1

私は同じようなことにも取り組んでいます:)問題は、ターミナルでそれを行うとストリームなので、接続はあなたがそれを殺すまで生き続けるということです。 (curl_exec()が終了しない)

CURLOPT_PROGRESSFUNCTIONとCURLOPT_READFUNCTIONを見てみてください。彼らはあなたにいくつかのヒントを与えるかもしれません。

+0

"curl_setopt($ ch、CURLOPT_TIMEOUT、30);"を追加しました。 curl_exec()を殺す。しかし、変数にはまだデータが格納されていません。 – Gooner

+0

その30秒間につぶやいたつぶやきはありますか? –

+0

はい。私はそれらを端末に印刷して見ることができます。 – Gooner

0

あなたはその日のために出発して答えを急いでいます。それはうまくいくように見えます。

以下は、URLといくつかのXMLデータを渡すときに使用する関数です。成功の場合はtrueまたはfalse、文字列のretuen値を表す連想配列を返します。

function do_curl($url, $data) 
    { 
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    $result = curl_exec ($ch); 

    $curl_return=array(); 

    if (!is_string($result)) 
     { 
     $curl_return['STATUS'] = FALSE; 
     $curl_return['ERRMSG'] = curl_error($ch); 
     } 
    else 
     { 
     $curl_return['STATUS'] = TRUE; 
     $curl_return['RESPONSE'] = $result; 
     } 
    curl_close($ch); 
    return $curl_return; 
    } 
4

UPDATE:これはcURLのを行うのは、実際にはかなり簡単だったが、私は間違ってそれについて初めて行きました、メッセージの最後に新しいコードを参照してください。

CURLOPT_READFUNCTIONと一緒にcURLを使用してTwitterストリームAPIを使用することができませんでしたが、fsockopen()fread()を使用して成功しました。なぜ私は成功の前にそれを使用しているのでreadfunctionが動作していないのか分かりませんが、レスポンスデータが "ストリーミング"であり、HTTPチャンクエンコーディングを使用して送信されていないという事実と関係があります。基本的には、私の読み取り機能が呼び出されたことがないので、データを処理できませんでした。

私は今働いている使用方法:

  • 接続fsockopenのを使用してssl://stream.twitter.com
  • からfputs
  • を使用してストリームデータのための基本的なHTTPリクエストを発行し、HTTPレスポンスヘッダを消費し、確認があったしますエラーなし
  • 無限ループでfreadを使用して金額データを読み取る
  • データのチャンクが読み取られるたびに、私は(我々が1つの以上の完全なメッセージを持っている場合)には、それぞれを処理として、その後
  • バッファ内のすべてのメッセージを処理しようとすると、バッファ機能がバッファ
  • バッファ機能に新しいデータを追加
  • 内部バッファ機能を呼び出しますメッセージは、バッファが空になるまで減らされ、関数が戻り、データが再び読み込まれます。

私は2時間前に実行していましたが、接続が切断されていませんでした。まだエラーなしで30,000件以上のメッセージを処理しました。

基本的には、完全なメッセージがバッファから読み込まれるたびに、アプリケーションがjsonメッセージでユーザ定義のコールバックを呼び出すようにコールバックシステムを実装しました。データベースへ)。

私はここにまだ短い記事を掲載していませんが、希望すれば私のプロフィールに記載されたウェブサイトに行き、連絡フォームに記入してメッセージしてください。もし誰かが興味があれば、私たちは一緒に働くことができます。私は楽しいためにこれをしただけです、私はTwitterに興味がなく、財政上の理由でそれを使用していません。私は最終的におそらくGitHubに入れます。

EDIT:

ここでは、ストリーミングAPIに接続し、それらが利用できるようコールバック関数にJSONメッセージを渡しますいくつかのcURLのコードです。この例では、帯域幅を節約するためにgzipエンコーディングを使用します。

<?php 

$USERNAME = 'youruser'; 
$PASSWORD = 'yourpass'; 
$QUERY = 'nike'; 

/** 
* Called every time a chunk of data is read, this will be a json encoded message 
* 
* @param resource $handle The curl handle 
* @param string $data The data chunk (json message) 
*/ 
function writeCallback($handle, $data) 
{ 
    /* 
    echo "-----------------------------------------------------------\n"; 
    echo $data; 
    echo "-----------------------------------------------------------\n"; 
    */ 

    $json = json_decode($data); 
    if (isset($json->user) && isset($json->text)) { 
     echo "@{$json->user->screen_name}: {$json->text}\n\n"; 
    } 

    return strlen($data); 
} 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, 'https://stream.twitter.com/1/statuses/filter.json?track=' . urlencode($QUERY)); 
curl_setopt($ch, CURLOPT_USERPWD, "$USERNAME:$PASSWORD"); 
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'writeCallback'); 
curl_setopt($ch, CURLOPT_TIMEOUT, 20); // disconnect after 20 seconds for testing 
curl_setopt($ch, CURLOPT_VERBOSE, 1); // debugging 
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate'); // req'd to get gzip 
curl_setopt($ch, CURLOPT_USERAGENT, 'tstreamer/1.0'); // req'd to get gzip 

curl_exec($ch); // commence streaming 

$info = curl_getinfo($ch); 

var_dump($info); 
+0

お寄せいただきありがとうございます。 今のところ、検索Twitter APIを使用して回避策を見つけました。 もう一度ストリーミングAPIを使用すると、私は必ずあなたに連絡します。 – Gooner

+0

@Rubie_Newbie cURLを使用してストリーミングAPIの実例を追加しました。私もC#で動作するバージョンを持っています。このphpクラス[phirehose](https://github.com/fennb/phirehose/)も興味深いかもしれませんが、gzipはサポートしていません。 – drew010

1

@Reza Sanaieなどがこの情報を参考にしてくれます。

私はSEARCH TWITTER APIを使用してライブツイートを取得しました。これは参考になるかもしれません。ここで コードです:

<?php 
$query = "SEARCH_PARAMETER"; 
$request = "http://search.twitter.com/search.json?q=".urlencode($query); 
$response = file_get_contents($request); 
$jsonobj = json_decode($response); 
print_r($jsonobj); 
?> 

私はまた、データベースにそれをプッシュするためにMySQLの接続設定を持っていると、このスクリプトは、プロセス全体を自動化するためのcrontabに追加されます。

関連する問題