2009-11 << 2009-12 >> 2010-01

2009-12-06 (日)

TODO:hspprint

*mixiアプリの遊び方

Webブラウザ以外のクライアントを作ったりしたくなったときのために.

もしかしたら,ちゃんとしたAPIが用意されてるのかもしれませんが,簡単そうだったのでHTML見て調べてみました.

アプリのページにアクセス

「/run_appli.pl?id=[アプリのID]」

アプリ本体はiframeで読み込まれるので,iframeタグのsrcを見ます.「app_content_[アプリのID]」というidが付いているiframeです.

「st」というパラメータが付いてますが,何かするときは,これをサーバに渡す必要があります.中身はまだ良く見てないです.

Remote Data Requests

アプリケーションサーバと通信したい場合,OpenSocialのRemote Data Requestsで通信します.mixiは,/gadgets/makeRequest経由で通信するみたいですね.よく知らないのですが,jsが投げるリクエストの内容は実装に依存するのかも.

少なくとも,mixiの場合のパラメータはこんな感じ

  • url 通信先のURL
  • httpMethod GETかPOSTか
  • headers リクエストヘッダ
  • postData POSTするデータ
  • authz 認証が必要(=signed)
  • st 何かのデータ(iframeのURLで取ったst)
  • getSummaries true/false
  • contentType TEXTとか
  • numEntries エントリの数
  • signOwner true/false オーナーの署名を付けるか
  • signViewer true/false ビューアの署名を付けるか
  • container=default つけなくても良さそう
  • bypassSpecCache よく分からないけど,付けないで良さそう
  • gadget ガジェットXMLのURL

いまやっているブラウザ三国志だとこんな感じ.

#include <iostream>
#include "../cppfl/http.h"
#include "../cppfl/stringex.h"
using namespace std;
using namespace Net;

#include <regex>
using namespace tr1;

int main(int argc,int argv[])
{
    map<string,string> params;

    params["email"] = "*****@example.com";
    params["password"] = "********";
    params["next_url"] = "/home.pl";

    HttpClient hc;
    hc.load("http://mixi.jp/login.pl",params);

    string cookie;
    for (int i=0;i<hc.headers["Set-Cookie"].size();i++) {
        cookie += (hc.headers["Set-Cookie"][i]*split(" "))[0];
    }
    if (cookie.size()<=0) {
        cout << "Error: login failed." << endl;
        return 1;
    }
    cout << cookie << endl;

    hc.clear();
    hc.req_header["Cookie"] =  cookie;
    hc.load("http://mixi.jp/run_appli.pl?id=6598");

    smatch match;
    if (!regex_search(hc.body, match, regex("<iframe src=\"(http://[^\"]+)\" id=\"app_content_"))) {
        cout << "Error: iframe." << endl;
        return 1;
    }

    string url = string( match[1].first, match[1].second ) ;

    if (!regex_search(url, match, regex("http://([^/]+)/[^#]+#st=([^&]+)"))) {
        cout << "Error: url parse error." << endl;
        return 1;
    }

    string host = string( match[1].first, match[1].second ) ;
    string st = urldecode(string( match[2].first, match[2].second ) );
    cout << host << endl;
    cout << st << endl;

    params.clear();
    params["url"]="http://m1.3gokushi.jp/user/mixi_if.php";
    params["httpMethod"]="POST";
    params["postData"]="mixi_id=********";
    params["authz"]="signed";
    params["st"]=st;
    params["signOwner"]="true";
    params["signViewer"]="true";
    params["gadget"]="http://m1.3gokushi.jp/canvas.php";

    hc.clear();
    hc.method = HttpClient::GET;
    hc.req_header["X-Mixi-Platform-IO"] = "1";
    hc.load( "http://" + host + "/gadgets/makeRequest" ,params);

    cout << hc.body << endl;

    return 0;
}

という,プログラムを書く夢を見ました.

実行したら,謎の文字列が出てきましたが,なんのことかさっぱりわかりません.