2012-04-26 43 views
6

Tôi đang lập kế hoạch để ghi lại các tweet trực tiếp về một chủ đề cụ thể. Đối với cùng, tôi đang sử dụng API dòng twitter với cURL trong PHP.Sử dụng đầu ra cURL

Đây là mã:

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

Vấn đề của tôi là, nếu tôi đặt CURLOPT_RETURNTRANSFER 0, tôi có thể thấy các tweet trên thiết bị đầu cuối. Nhưng tôi không thể lưu trữ trong biến $ jsonOBJ và in nó.

Vui lòng trợ giúp!

+0

sẽ không dễ sử dụng và sdk cho php với oauth? – chepe263

+0

In ra kết quả $ để xem kết quả trông như thế nào trước khi bạn cố gắng giải mã nó. – MrCode

+0

Bây giờ, tôi trực tiếp thực hiện điều này "echo $ result;". Nhưng không có gì hiển thị khi thực thi tập lệnh này. – Gooner

Trả lời

1

Tôi đang làm việc trên cùng một loại điều :) Vấn đề là khi bạn làm điều đó trong thiết bị đầu cuối, đó là một dòng, do đó, kết nối vẫn còn sống cho đến khi bạn giết nó. (ví dụ: curl_exec() không kết thúc)

Hãy thử xem CURLOPT_PROGRESSFUNCTION và CURLOPT_READFUNCTION. Họ có thể cung cấp cho bạn một số gợi ý.

+0

Tôi đã thêm "curl_setopt ($ ch, CURLOPT_TIMEOUT, 30);" để giết curl_exec(). Nhưng vẫn không có dữ liệu được lưu trữ trong biến. – Gooner

+0

Có tweet nào được tweet trong 30 giây đó không? –

+0

Có. Tôi có thể thấy chúng bằng cách in nó ra thiết bị đầu cuối. – Gooner

0

Chỉ cần đưa bạn câu trả lời khi rời đi trong ngày. Có vẻ như nó sẽ hoạt động. Dưới đây là một chức năng tôi sử dụng, nơi tôi vượt qua nó một URL và một số dữ liệu XML và nó trả về một mảng kết hợp nói đúng hay sai cho thành công và giá trị retuen như một chuỗi.

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

CẬP NHẬT: Xem mã mới vào cuối của thông điệp, điều này đã thực sự khá dễ dàng để làm với cURL nhưng tôi đã đi về nó sai lần đầu tiên.

Tôi không thể nhận API luồng Twitter hoạt động bằng cURL kết hợp với CURLOPT_READFUNCTION nhưng đã thành công khi sử dụng fsockopen()fread(). Tôi không chắc tại sao readfunction không hoạt động như tôi đã sử dụng nó trước đây với thành công, nhưng nó phải có một cái gì đó để làm với thực tế là các dữ liệu phản ứng là "streaming" và không được gửi bằng cách sử dụng HTTP chunked encoding. Về cơ bản, chức năng đọc của tôi không bao giờ được gọi nên tôi không thể xử lý dữ liệu.

Phương pháp tôi sử dụng mà đang làm việc tại:

  • Connect sử dụng fsockopen để ssl://stream.twitter.com
  • Issue yêu cầu HTTP cơ bản cho dòng dữ liệu sử dụng fputs
  • Tiêu thụ các tiêu đề HTTP response và chắc chắn rằng đã có không có lỗi
  • Đọc dữ liệu số tiền bằng cách sử dụng fread trong vòng lặp vô hạn
  • Mỗi lần đọc một đoạn dữ liệu, Tôi gọi một chức năng đệm nội
  • Chức năng đệm gắn thêm dữ liệu mới vào một bộ đệm
  • chức năng đệm sau đó cố gắng để xử lý tất cả các thư trong bộ đệm (nếu chúng ta có 1 hoặc tin nhắn hoàn chỉnh hơn)
  • Vì nó xử lý mỗi tin nhắn, bộ đệm được giảm cho đến khi nó trống và sau đó hàm trả về và dữ liệu được đọc lại

Tôi đã chạy nó trong một vài giờ và chưa có kết nối bị ngắt và tôi đã đã xử lý hơn 30.000 tin nhắn mà không có lỗi nào.Về cơ bản, tôi đã triển khai một hệ thống gọi lại để mỗi lần một tin nhắn đầy đủ được đọc từ bộ đệm, nó gọi cuộc gọi lại do người dùng xác định bằng thông điệp json để ứng dụng có thể thực hiện bất cứ điều gì cần thực hiện với thông báo (ví dụ: chèn vào cơ sở dữ liệu).

Tôi chưa có bất kỳ đoạn trích ngắn nào để đăng ở đây, nhưng nếu bạn muốn, hãy nhắn tin cho tôi bằng cách truy cập trang web được liệt kê trên tiểu sử của tôi và điền vào biểu mẫu liên hệ và tôi rất sẵn lòng chia sẻ. Có lẽ chúng ta có thể làm việc cùng nhau nếu có ai quan tâm. Tôi chỉ làm điều này cho vui, tôi không có hứng thú với Twitter và không sử dụng nó vì lý do tài chính. Tôi sẽ đưa nó vào GitHub cuối cùng có lẽ.

EDIT:

Dưới đây là một số mã cURL sẽ kết nối với các dòng API và vượt qua các thông điệp JSON để một chức năng gọi lại khi có sẵn. Ví dụ này sử dụng mã hóa gzip để tiết kiệm băng thông.

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

Cảm ơn rất nhiều vì đề xuất của bạn. Hiện tại, tôi đã tìm được một công việc xung quanh bằng cách sử dụng API tìm kiếm twitter. Tôi chắc chắn sẽ liên hệ với bạn khi tôi tiếp tục phát lại API. – Gooner

+0

@Rubie_Newbie Tôi đã thêm một ví dụ làm việc về API truyền trực tuyến bằng cách sử dụng cURL. Tôi cũng có một phiên bản làm việc trong C#. Lớp php này [phirehose] (https://github.com/fennb/phirehose/) cũng có thể được bạn quan tâm, mặc dù nó không hỗ trợ gzip. – drew010

1

@Reza Sanaie và những người khác có thể thấy điều này hữu ích.

Tôi đã sử dụng API TÌM KIẾM TWITTER và nhận các tweet cũng trực tiếp. Vì vậy, điều này có thể hữu ích. Đây là mã:

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

Tôi cũng có những thiết lập kết nối MySQL để đẩy nó vào cơ sở dữ liệu và kịch bản này được thêm vào trong crontab để tự động hóa toàn bộ quá trình.

Các vấn đề liên quan