2011.02.02 achamaro
えへへ
うふふ
ヒデタロ先輩にご紹介にあずかりました、
acha_maroことアチャマロです!
早速ですが、
前にPHPでTwitterからストリーミングを中継して、 flashで受け取るというのをやりました。
まずは、Twitterからのストリーミングを各クライアントのソケットに流し込むところまで。
AMS.php(AchamaroMediaServer)
<?php
// Twitter User ID
$id = "userid";
// Twitter User Pass
$pass = "password";
// Twitter Streaming API
$streamingAPI = "http://stream.twitter.com/1/statuses/filter.json";
// Listenポート
$port = 5080;
// APIパラメータ
$context = stream_context_create
(
array(
'http' => array(
'method' => "POST",
'header' => "Authorization: Basic " . base64_encode($id . ":" . $pass) . "\r\n" .
"Content-type: application/x-www-form-urlencoded" . "\r\n",
'content' => http_build_query(
array(
'track' => "#achamaro"
// #achamaroを含むツイートを受信
)
)
)
)
);
// Listen開始
$serversocket = socket_create_listen($port);
socket_set_nonblock($serversocket);
// クライアントソケット格納用配列
$clients = array();
// ストリーミング受信開始
$stream = fopen($streamingAPI, 'r', false, $context);
while ($json_text = fgets($stream)) {
// 新規クライアント接続
while (false !== ($tmp_socket = @socket_accept($serversocket))) {
$clients[] = $tmp_socket;
}
// JSONデコード
$json = json_decode($json_text, true);
if (!$json) continue;
// とりあえずツイートを各クライアントへ送信
foreach ($clients as $client) {
@socket_write($client, $json['text'], strlen($json['text']));
}
}
?>
$php AMS.php
$telnet localhost 5080
import flash.display.MovieClip;
import flash.net.Socket;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
public class socket extends MovieClip
{
// ソケットオブジェクト
private var sk:Socket;
/**
* コンストラクタ
*/
public function socket()
{
// AMSに接続
this.sk = new Socket("192.168.1.31",5080);
// 接続確立イベントハンドル
this.sk.addEventListener(Event.CONNECT,connectHandler);
// セキュリティエラーイベントハンドル
this.sk.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
// 受信イベントハンドル
this.sk.addEventListener(ProgressEvent.SOCKET_DATA,progressHandler);
}
/**
* セキュリティイベントハンドラー
*/
private function securityErrorHandler(event:SecurityErrorEvent)
{
// デバッグ
this.tBox.appendText("securityError: " + event);
}
/**
* 接続確立イベントハンドラー
*/
private function connectHandler(event:Event)
{
// デバッグ
this.tBox.appendText("connect:" + event);
}
/**
* 受信イベントハンドラー
*/
private function progressHandler(event:ProgressEvent)
{
// デバッグ
this.tBox.appendText("progress: " + event);
// 受信内容表示
readResponse();
}
/**
* 受信内容表示
*/
private function readResponse()
{
var str:String = this.sk.readUTFBytes(this.sk.bytesAvailable);
this.tBox.appendText(str);
}
}
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" to-ports="5080"/>
</cross-domain-policy>
<?php
$xml = file_get_contents('poricy.xml');
$port = 843;
$server = socket_create_listen($port);
while (true) {
$client = @socket_accept($server);
@socket_write($client, $xml, strlen($xml));
@socket_close($client);
}
socket_close($server);
?>
$php poricy.php