6

特定のトピックに関するライブ ツイートを記録する予定です。同じように、PHP で cURL を使用して Twitter ストリーム API を使用しています。

コードは次のとおりです。

<?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);
?>

私の問題は、CURLOPT_RETURNTRANSFER を 0 に設定すると、端末でツイートが表示されることです。しかし、変数 $jsonOBJ に保存して印刷することはできません。

助けてください!

4

4 に答える 4

4

更新: メッセージの最後にある新しいコードを参照してください。これは実際には cURL を使用すると非常に簡単に実行できましたが、最初は間違って実行しました。

cURL と a を併用して Twitter ストリーム API を動作させることはできませんでしたが、CURLOPT_READFUNCTIONfsockopen ()fread(). 以前に使用して成功したため、 readfunction が機能しなかった理由はわかりませんが、応答データが「ストリーミング」されており、HTTP チャンクエンコーディングを使用して送信されていないという事実に関係しているに違いありません。基本的に、読み取り関数が呼び出されなかったため、データを処理できませんでした。

私が使用した方法は現在機能しています:

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

数時間実行しましたが、接続が切断されることはなく、30,000 件を超えるメッセージを処理しましたが、まだエラーは発生していません。

基本的にはコールバック システムを実装して、バッファから完全なメッセージが読み取られるたびに、json メッセージを使用してユーザー定義のコールバックを呼び出し、アプリケーションがメッセージに対して必要なこと (データベースへの挿入など) を実行できるようにしました。

ここに投稿する短いスニペットはまだありませんが、必要に応じて、プロフィールに記載されている Web サイトにアクセスし、連絡先フォームに記入してメッセージを送信してください。共有させていただきます. 興味のある方がいらっしゃればご一緒できるかもしれません。私は楽しみのためにこれをやっただけです.私はTwitterに興味がなく、経済的な理由で使用していません. おそらく最終的には GitHub に配置します。

編集:

ストリーミング 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);
于 2012-04-27T00:26:09.510 に答える
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 に追加されています。

于 2012-04-27T16:51:39.867 に答える
1

私も同じ種類のことに取り組んでいます:)問題は、ターミナルでそれを行うと、それがストリームであるため、強制終了するまで接続が存続することです。(つまり、curl_exec() は終了しません)

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

于 2012-04-26T17:10:42.477 に答える
0

その日のために出発するので、あなたに答えを急いでいます。それはうまくいくはずです。

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

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;
    }
于 2012-04-26T17:24:44.557 に答える