OpenPNE API 仕様
最終更新日:2006/09/03
目次
1. OpenPNE API とは?
- OpenPNE APIとは、
- SNSサーバ上にある認証情報およびSNSのデータを、外部サーバに対してHTTP通信により提供するためのAPIである。
- 認証情報とは、
- SNSサーバでユーザが認証済みである事を示す情報である。
- SNSのデータとは、
- OpenPNE SNS側のサーバのデータベースに保存されているデータを指す。 例えば、「ニックネーム」「プロフィール写真のURL」「フレンドリスト」などである。
- 外部サーバとは、
- SNSサーバから認証情報とSNSのデータを取得し、SNSとは独立したサービスを提供するサーバである。
2. 概要
2.1. 通信主体
SNSサーバ(APIサーバ) ⇔ 外部サーバ(APIクライアント) 間のサーバ間通信
2.2. プロトコル
XML-RPCの仕様に準拠。文字コード系はUTF-8とする。
2.3. セキュリティ
SNSサーバ、外部サーバ間のAPI通信に対しては、SNSサーバ側(OpenPNEアプリケーション)でIP制限を行う
3. 認証情報の受け渡し
3.1. 概要
- SNSサーバ側で認証済みのユーザに対して、以下の値を埋め込んだ外部サーバへのリンクを生成する
- セッションID(後述)
- メンバーID
- リンク生成日時(YYYYMMDDHHMMSS形式)
- 外部サーバ側は、受け取ったリクエストをSNSサーバへAPI通信で送る (リンク生成日時が古いものは外部サーバ側で弾いてもよい)
- SNSサーバ側は、外部サーバから受け取ったリクエストを検証し結果を返す
3.2. セッションIDの生成方法
- APIトークン(SNS側の設定ファイで設定した文字列)
- メンバーID
- メンバートークン(後述)
- リンク生成日時(YYYYMMDDHHMMSS形式)
$session_id = md5($api_token . $c_member_id . $c_member_token . $datetime);
3.3. メンバートークン
メンバーに紐付く値で、SNSサーバが保持する。
値はメンバーがSNSにログインする毎に変更する。
3.4. 外部サーバへのURL
URL例http://app.example.net/entry?sid=b51a44e6a82cc0d6be9ecadea513c618&mid=237&dt=20060326032450
3.5. 認証API通信
| URI | http://sns.example.com/?m=api&a=do_xmlrpc | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| encoding | UTF-8 | ||||||||||||
| methodName | 000_auth | ||||||||||||
| parameters |
|
リクエスト例
- POST URI
- http://sns.example.com/?m=api&a=do_xmlrpc
<?xml version="1.0" encoding="UTF-8"?> <methodCall> <methodName>000_auth</methodName> <params> <param> <value><struct> <member><name>sid</name> <value><string>b51a44e6a82cc0d6be9ecadea513c618</string></value> </member> <member><name>mid</name> <value><int>237</int></value> </member> <member><name>dt</name> <value><string>20060326032450</string></value> </member> </struct></value> </param> </params> </methodCall>
PHPコード例
<?php
require_once "XML/RPC.php";
...
$params = array(
"sid" => strval($sid),
"mid" => intval($mid),
"dt" => strval($dt),
);
$params = array(XML_RPC_encode($params));
$msg = new XML_RPC_Message("000_auth", $params);
$cli = new XML_RPC_Client("/?m=api&a=do_xmlrpc", "sns.example.com");
$cli->send($msg);
...
?>
レスポンス例(成功)
メンバーIDを返す。
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value><int>237</int></value>
</param>
</params>
</methodResponse>
レスポンス例(失敗)(ユーザが正常登録状態にない場合)
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>51</int></value>
</member>
<member>
<name>faultString</name>
<value><string></string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
4. データ取得
4.1. メソッド名
| methodName | 説明 |
|---|---|
| 001_get_c_member | メンバー情報取得 |
| ... | ... |
4.2. データ取得例
4.2.1. メンバー情報取得
リクエスト
| URI | http://sns.example.com/?m=api&a=do_xmlrpc | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| encoding | UTF-8 | |||||||||
| methodName | 001_get_c_member | |||||||||
| parameters |
|
リクエスト例
3番のメンバーが10番のメンバーを見た場合
<?xml version="1.0" encoding="UTF-8"?> <methodCall> <methodName>001_get_c_member</methodName> <params> <param> <value><struct> <member><name>target_c_member_id</name> <value><int>10</int></value> </member> <member><name>my_c_member_id</name> <value><int>3</int></value> </member> </struct></value> </param> </params> </methodCall>
PHPコード例
<?php
require_once "XML/RPC.php";
...
$params = array(
"target_c_member_id" => intval($target_c_member_id),
"my_c_member_id" => intval($my_c_member_id),
);
$params = array(XML_RPC_encode($params));
$msg = new XML_RPC_Message("001_get_c_member", $params);
$cli = new XML_RPC_Client("/?m=api&a=do_xmlrpc", "sns.example.com");
$cli->send($msg);
...
?>
レスポンス
| 要素名 | 型 | 説明 | |
|---|---|---|---|
| c_member_id | int | メンバーID | |
| nickname | string | ニックネーム | |
| image_url | string | 画像URL(SNSサーバ上の画像の絶対パス) | |
| birth_year | int | 誕生年(公開設定による) | |
| birth_month | int | 誕生月 | |
| birth_day | int | 誕生日 | |
| access_date | string(date) | 最終ログイン日時 | |
| r_date | string(date) | SNS登録日時 | |
| profile | ---以下プロフィール項目(SNS設定により可変) | ||
| sex | string | 性別 | |
| blood_type | string | 血液型 | |
| pre_addr_pref | string | 現住所(都道府県) | |
| old_addr_pref | string | 出身地(都道府県) | |
| self_intro | string | 自己紹介 | |
date: YYYYMMDDHHMMSS
レスポンス例
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>c_member_id</name>
<value><int>10</int></value>
</member>
<member>
<name>nickname</name>
<value><string>ハチス</string></value>
</member>
<member>
<name>image_url</name>
<value>
<string>http://sns.example.com/img.php?filename=m_10_1133710936.jpg</string>
</value>
</member>
<member>
<name>birth_year</name>
<value><int>1982</int></value>
</member>
<member>
<name>birth_month</name>
<value><int>2</int></value>
</member>
<member>
<name>birth_day</name>
<value><int>15</int></value>
</member>
<member>
<name>access_date</name>
<value><string>20060116113706</string></value>
</member>
<member>
<name>r_date</name>
<value><string>20050817000000</string></value>
</member>
<member>
<name>profile</name>
<value>
<struct>
<member>
<name>sex</name>
<value><string>男性</string></value>
</member>
<member>
<name>blood_type</name>
<value><string>o</string></value>
</member>
<member>
<name>pre_addr_pref</name>
<value><string>東京都</string></value>
</member>
<member>
<name>old_addr_pref</name>
<value><string>埼玉県</string></value>
</member>
<member>
<name>self_intro</name>
<value><string>演劇サークルに入りました。12/14-18に初舞台です。
毎日稽古で忙しいです。合間をぬって出社します。</string></value>
</member>
</struct>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
5. ポイント
5.1. ポイント加算(減算)通信
リクエスト
| URI | http://sns.example.com/?m=api&a=do_xmlrpc | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| encoding | UTF-8 | |||||||||||||||
| methodName | 101_add_point | |||||||||||||||
| parameters |
|
レスポンス
- 成功した場合、総ポイント残高を返す。
- 失敗した場合、エラーコードとエラーメッセージを返す。
5.2. ポイント残高照会通信
リクエスト
| URI | http://sns.example.com/?m=api&a=do_xmlrpc | ||||||
|---|---|---|---|---|---|---|---|
| encoding | UTF-8 | ||||||
| methodName | 002_get_member_point | ||||||
| parameters |
|
レスポンス
- 成功した場合、総ポイント残高を返す。
- 失敗した場合、エラーコードとエラーメッセージを返す。
6. エラーの場合
6.1. エラーコード一覧
| 種別 | faultCode | faultString | 意味 |
|---|---|---|---|
| XML-RPC | 1 | Unknown method | サーバが関知しないメソッドの実行を要求された際に返されます。 |
| 2 | Invalid return payload | このエラーは、実際のところサーバやコードではなくクライアント側で 発生します。しかし、これはサーバが自分で理解できない何かを返したことを 示します。 | |
| 3 | Incorrect parameters | サーバがメソッドに対応したシグネチャを保持しており、クライアントから 渡されたパラメータがいずれのシグネチャにも一致しなかった際に発生します。 | |
| 4 | Can't introspect: method unknown | このエラーは、組み込みの system.*() メソッドから 発生するもので、サーバ上で未定義のメソッドを実行しようとした際に起こります。 | |
| 5 | Didn't receive 200 OK from remote server | このエラーは、サーバからの応答として HTTP/1.1 200 OK が戻ってこなかった際に クライアント側で発生します。エラーの詳細な情報は、上のメッセージの最後に 付け加えられます。 | |
| 6 | The requested method didn't return an XML_RPC_Response object. | ||
| 7 | Invalid request payload | ||
| OpenPNE | 51 | '' | ユーザが正常登録状態にない |
| 52 | '' | ユーザが特定できない | |
| 53 | '' | データベースに接続できない | |
| 54 | '' | リクエストコマンドコードが不正 | |
| 55 | '' | リクエストパラメータに不足がある | |
| 56 | '' | データベースに存在しないデータを取得しようとしている | |
| 57 | '' | データの取得権限がない | |
| 58 | '' | サーバ側不特定エラー、もしくはメンテナンス中 | |
| 59 | '' | クライアント側不特定エラー | |
| XML | 100 | ? | XML_ERROR_NONE |
| 101 | ? | XML_ERROR_NO_MEMORY | |
| 102 | ? | XML_ERROR_SYNTAX | |
| 103 | ? | XML_ERROR_NO_ELEMENTS | |
| 104 | ? | XML_ERROR_INVALID_TOKEN | |
| 105 | ? | XML_ERROR_UNCLOSED_TOKEN | |
| 106 | ? | XML_ERROR_PARTIAL_CHAR | |
| 107 | ? | XML_ERROR_TAG_MISMATCH | |
| 108 | ? | XML_ERROR_DUPLICATE_ATTRIBUTE | |
| 109 | ? | XML_ERROR_JUNK_AFTER_DOC_ELEMENT | |
| 110 | ? | XML_ERROR_PARAM_ENTITY_REF | |
| 111 | ? | XML_ERROR_UNDEFINED_ENTITY | |
| 112 | ? | XML_ERROR_RECURSIVE_ENTITY_REF | |
| 113 | ? | XML_ERROR_ASYNC_ENTITY | |
| 114 | ? | XML_ERROR_BAD_CHAR_REF | |
| 115 | ? | XML_ERROR_BINARY_ENTITY_REF | |
| 116 | ? | XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF | |
| 117 | ? | XML_ERROR_MISPLACED_XML_PI | |
| 118 | ? | XML_ERROR_UNKNOWN_ENCODING | |
| 119 | ? | XML_ERROR_INCORRECT_ENCODING | |
| 120 | ? | XML_ERROR_UNCLOSED_CDATA_SECTION | |
| 121 | ? | XML_ERROR_EXTERNAL_ENTITY_HANDLING |
6.2. レスポンス例
リクエストパラメータに不足がある場合
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>3</int></value>
</member>
<member>
<name>faultString</name>
<value><string>Incorrect parameters passed to method: Signature permits 1 parameters but the request had 0</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
7. 参考URL
- XML-RPC Specification http://www.xmlrpc.com/spec
- 同日本語版 http://lowlife.jp/yasusii/stories/9.html
- PEAR::XML_RPC http://pear.php.net/manual/ja/package.webservices.xml-rpc.php