Twitter系のサービスJaikuのAPIの使い方メモ。Jaiku APIでは、情報の取得については、他のサービスを同じような感じでできるのですが、新規の投稿にはXML-RPCを使うみたい。 必要になったので、PHPでXML-RPCを使うときのメモ。
次のページを参考にした。
どうやら、XML-RPCは、HTTP-POSTリクエストで、XMLをやり取りするもののようです。
PEARのXML_RPCを使えば、クライアント側も、サーバー側も簡単に実装できるみたいなので、まずこれを使いました。
以下、PHPのサンプルスクリプトです。
$personal_keyと、$userを正しく入力して、$textに投稿したい文字を入れれば、次のスクリプトでJaikuに投稿できます。
<?php
require_once 'XML/RPC.php';
define('JAIKU_SERVER', 'api.jaiku.com');
define('JAIKU_PATH', '/xmlrpc');
$text="Test テスト";
$personal_key="personal_key";
$user="user";
$params = array(new XML_RPC_Value(array(
//"generated" => new XML_RPC_Value(false, 'boolean'),
//"icon" => new XML_RPC_Value(300, 'int'),
//"location" => new XML_RPC_Value('', 'string'),
"message" => new XML_RPC_Value($text, 'string'),
"personal_key" => new XML_RPC_Value($personal_key, 'string'),
"user" => new XML_RPC_Value($user, 'string'),
),'struct'),);
$msg=new XML_RPC_Message('presence.send',$params);
//print $msg->serialize();
$client=new XML_RPC_Client(JAIKU_PATH,JAIKU_SERVER);
$response=$client->send($msg);
if(!$response->faultCode()){
print "ok";
}else{
print $msg->serialize();
print '<br />Fault Code:' . $response->faultCode() ;
print '<br />Fault Reason:' . $response->faultString();
}
?>
XML_RPC_Value()や、XML_RPC_Message()で、Jaikuのサーバー側に送るXMLを組み立てています。 実際の中身は、serialize()で見ることができます。
serialize()で送信するXMLを見ると、
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>presence.send</methodName>
<params>
<param>
<value><struct>
<member><name>message</name>
<value><string>Test テスト</string></value>
</member>
<member><name>personal_key</name>
<value><string>personal_key</string></value>
</member>
<member><name>user</name>
<value><string>user</string></value>
</member>
</struct></value>
</param>
</params>
</methodCall>
のようになっているはずです。
後は、XML_RPC_Client()で、上のXMLをsend()すれば、 Jaikuに新しい記事がポストされます。
(日本語が文字化けして、なかなか、ちゃんと表示されなかった。
php.iniとか,.htaccessも見たけれども、よくわからない。
XML_RPCを新しく入れて、php.iniのinclude_path="~"の順番を変えたら、
なんとか動くようになった。XML_RPCのバージョンが古いとうまくいかないのかも。)
XML_RPCを使わないで、何とかする場合。 前回のDrupalのJaikuモジュール の中身とほとんど同じです。モジュールの方では、drupal_http_request()を使いましたが、 下のサンプルでは、 PEARのHTTP_Request()を使いました。
ここでは、ヒアドキュメントで、送信するXMLを組み立てています。
<?php
require_once "HTTP/Request.php";
$req =& new HTTP_Request();
$text="Test テスト";
$personal_key="personal_key";
$user="user";
$RequestURL="http://api.jaiku.com/xmlrpc";
$data = <<< CALL_DATA
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>presence.send</methodName>
<params>
<param>
<value><struct>
<member><name>message</name>
<value><string>$text</string></value>
</member>
<member><name>personal_key</name>
<value><string>$personal_key</string></value>
</member>
<member><name>user</name>
<value><string>$user</string></value>
</member>
</struct></value>
</param>
</params>
</methodCall>
CALL_DATA;
$req->setURL($RequestURL);
$req->setMethod(HTTP_REQUEST_METHOD_POST);
$req->addHeader('Content-Type' ,'text/xml; charset=UTF-8');
$req->addRawPostData($data);
$response = $req->sendRequest();
if (!PEAR::isError($response)) {
print $req->getResponseBody();
print_r($req->getResponseHeader());
}else{
print $response->getMessage();
}
?>
$req->addRawPostData($data, false)で、urlencode()が効くようにもできるのですが、これを 使うと、うまくいかない。
あとは、ブログの記事が、新規投稿か、過去記事更新かを区別できる部分があれば、 これでJaikuとブログの両方にポストできる。
Drupalでは、 jaiku_nodeapi(&$node, $op)の$opに、'insert'とか、'update'が渡されるので、 これを使えばいいらしい。
|
|
1.
|
|
|
2.
|
|
|
3.
|
|
|
4.
|
|
|
5.
|
|
|
6.
|
|
|
7.
|
このエントリーのトラックバックURL: