「webapi」タグアーカイブ

【開発】楽天WebAPIが6月にリニューアルだそう?

sc20120701173100

いま見たらなんだかリニューアルとか言ってます。

拙作サイトでも利用していましたが、既存アプリはなにか変更が必要なのか?と急いで調べてみましたが、とりあえず大丈夫そう?

アプリを配布している場合、アプリ紹介がされるようですね。

自分のは自分専用なので、紹介されても困るのでスルー。

http://webservice.rakuten.co.jp/

【もしも】取得した商品XMLデータが壊れてます

sc20120127185217

以前からある一部のカテゴリで、なんでか、XMLパースエラーになっていたので、調べてみました。

エラーのあるXML文書をファイル化して開いてみると、確かに他ソフトのパースでもエラーになります(写真は、Chrome)

文字コード0x03が含まれているとの事。

sc20120127185447テキストエディタで開いたら、確かに0x03が文字列中に存在してました。


0x03ってなんだ?と思って調べたら、ETXテキスト終了というコード。過去の遺物ですよね。なんで、こんなのが入ってるんだ?

うむむ、XML文書で許されるのか?いまさらXML仕様書眺める訳にもいかんし・・。

メンドイが、APIからXML取得後、こういった文字コードを破棄するコードを仲介させなきゃならない(´・ω・`)

//xd.Load(wc.OpenRead(clsCommon.c_moshimo_api_item2));
wc.Encoding = Encoding.GetEncoding("utf-8");
string strXML = wc.DownloadString(clsCommon.c_moshimo_api_item2);
strXML = Regex.Replace(strXML, @"[u0000-u0008]", "", RegexOptions.Compiled | RegexOptions.Singleline);
xd.Load(new StringReader(strXML));

そういや以前RSSリーダー作った時も、XMLの壊れって結構見かけました。本文のところは、どこからか持ってきて(そのまま)生成しているパターンが多いからなんでしょうねぇ。

やばそうな制御文字は他にもありそうですが、一応0x00-0x08まで破棄。string.replaceでも良かったんですが、今後個数が多くなった時のために、regexにて処理。こんな事するだけに、リソース食い過ぎか・・?うむ

1行で綺麗に済むはずだったんですが、4行に。

追記:

と思ってデータを取得しまくってたら、0x0Bも登場しやがった。これは本気で取り組まないと・・

【開発】もしもドロップのカテゴリ取得

sc20120104202102

もしもドロップのWebAPIを試してました。

これまで各社WebAPIを触ってきましたが、もしものカテゴリ数が尋常では無いほどの数です。

所詮カテゴリなどと舐めてかかってました。いきなりのアクセス禁止されちゃた。

今度は礼儀よく2秒ほどウェイトをかけて、ちょっとづつ読み出してる最中です(あまりに時間が掛かるので、ブログ書いてるところ(;^ω^))

取得したカテゴリの内容は、こんな感じです。

010C02カップ焼きそば
010C0201日清食品
010C02FFその他のカップ焼きそば
010C03カップそば
010C0301日清食品
010C0302エースコック
010C03FFその他のカップそば
010C04カップうどん
010C0401日清食品
010C0402エースコック
010C04FFその他のカップうどん
010C05カップパスタ
010C06カップスープ
010C0601クノール
010C0602ポッカ
010C06FFその他のカップスープ
010CFFその他のカップ食品
010D水・ミネラルウォーター
010D01Evian
010D02Contrex
010D03CRYSTAL GEYSER

カテゴリっていうか、商品名とかメーカー名すらも入ってしまってるじゃまいかヽ(;゚д゚)ノ

いまの時点で、既に200は超えてるし、まだ半分来てそうに無いぞ・・。なんつー数だ。

大したコードではないですけど、C#での実験コードはこんな感じです。その都度、子カテゴリがあるか見に行ってます(再帰呼出)

このメソッドから抜けたら、DataTableをAcceptChangeして取得完了となります。

/// <summary>
/// もしもAPIカテゴリ取得(内部で再起呼出)
/// </summary>
/// <param name="strAuthID">認証コード</param>
/// <param name="ParentID">親カテゴリID</param>
/// <param name="dt">格納先DataTable</param>
/// <returns></returns>
bool GetMoshimoCategories(string strAuthID,string ParentID,moshimo.dtCategoryDataTable dt)
{
    WebClient wc = new WebClient();
    wc.QueryString.Add("authorization_code", strAuthID);
    wc.QueryString.Add("article_category_code", ParentID);
    XmlDocument xd = new XmlDocument();
    Thread.Sleep(1000*2);
    xd.Load(wc.OpenRead(clsCommon.c_moshimo_api_cat2));

    string res = xd.SelectSingleNode("//Result/Status").InnerText;    //error
    if (!res.Equals("OK")) return false;

    string cnt = xd.SelectSingleNode("//Rows").InnerText;    //rows

    XmlNodeList nodes = xd.SelectNodes("//Children/Child");
    foreach (XmlNode xn in nodes)
    {
        moshimo.dtCategoryRow row = dt.NewdtCategoryRow();
        row.ID = xn.SelectSingleNode("Code").InnerText;
        row.Name = xn.SelectSingleNode("Name").InnerText; 
        row.ParentID = ParentID;
        dt.AdddtCategoryRow(row);

        Debug.WriteLine(row.ID + row.Name);

        //子カテゴリの取得
        GetMoshimoCategories(strAuthID, row.ID, dt);
    }
    return true;
}

これがある程度できたら、商品データ取得をしてみます。

追記:

やっと取得完了。1413件もありましたよ。ダントツにトップレベルなカテゴリ数です。

追記:

う~む。文字化けを1件確認しました。例のごとく「~」です。「お~いお茶」の「~」ではないかと推測しますが。

01110101お?い お茶

もしもの方で、Macで管理されてたりすると「~」では無く、「~」として入力されるのが問題のようです。さて、どうすんべか。Macでなんかデータ管理に使うなよッと言うのはさておき、どこぞのタイミングで対応しないといけない。