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() và 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);
sẽ không dễ sử dụng và sdk cho php với oauth? – chepe263
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
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