Ikeda->Weblog();

Ikedaの徒然雑記。

[TIPS] PHPでAndroidMarketから情報を取得する

| 0件のコメント

[TIPS] PHPでAndroidMarketから情報を取得する大変ご無沙汰しております、、、
前回のエントリが7/31ですから、4ヶ月強の放置となってしまいましたm(_ _)m
#いやでも記事を書かなかっただけでサーバの中身をいじってたんですよですよですよ(言い訳)



さておき、以前・・・いや遠い昔・・・の記事で、RHETOLO関連サービスである「あぷり握り」をご紹介しました。
このサービス内に、iPhoneアプリ・AndroidアプリをそれぞれAppStore・AndroidMarketから検索し情報を取得する、という機能を実装しているのですが、これの「AndroidMarket検索」がここ数日前から動かない(検索できない)という不具合を起こしていました。

特にコードへの変更は行なっていなかったので、AndroidMarket側の仕様変更か、、と思っていたのですが、、、




今回のシステムでは、PHPからAndroidMarketへのアクセスを行うライブラリ「Android Market API for PHP」を利用しています。
AppStoreは検索APIが公開されているので専用のライブラリ等は使っていませんが、両ストアに対してできるだけ同じ手順で検索を行いたかったため、SearchAppStore/SearchAndroidMarket というドライバクラスに細かな部分を集約し、同一インタフェースで呼び出しが行えるようなラッパークラスを作成してあります。

まず、ざくっとAndroid Market API for PHPの使い方をご紹介しておきますね。

ライブラリはgithubからダウンロードできます。

git clone するなり zip で落として展開するなりしましょう。

そうするとこのようなディレクトリとファイルができあがります。

  • Market/MarketSession.php
    AndroidMarketとの通信制御を行うクラスライブラリ群
  • examples/*.php
    サンプルコード群
  • proto/local.php
    アカウント情報等の定義
  • proto/market.proto.php
    AndroidMarketとやり取りするデータのフォーマッティングを行うクラスライブラリ群
  • proto/protocolbuffers.inc.php
    通信データとPHPオブジェクトの相互変換を行うクラスライブラリ群(だと思う)
サンプルコードを動作させるためには、幾つか修正が必要です。


  • examples/local.php

1 <?php
2 //Rename this file local.php and change the constants to match your Google Account credentials
3 define(‘GOOGLE_EMAIL’, ‘YOUR-GOOGLE-ACCOUNT@gmail.com’);
4 define(‘GOOGLE_PASSWD’, ‘YOUR-GOOGLE-PASSWORD‘);
5 define(‘ANDROID_DEVICEID’, ‘000000000000000‘);

ここのYOUR-GOOGLE-ACCOUNT、YOUR-GOOGLE-PASSWORDをそれぞれGoogleアカウント・パスワードに修正します。
続いてANDROID_DEVICEIDを設定するんですが、オールゼロだとエラーになりますので最後だけ1とかにしてみるといいでしょう。


  • Market/MarketSession.php

1 <?php
2 /**
3  * @author Niklas Nilsson
4  *
5  *
6  */
7 class MarketSession {
8     public $context = NULL;
9     public $authSubToken = “”;
10
11     /**
12      *
13      */
14     function __construct () {
15         $this->context = new RequestContext();
16         $this->context->setUnknown1(0);
17         $this->context->setVersion(1002012);
18         $this->context->setDeviceAndSdkVersion(“passion:8”);
19 //      $this->context->setDeviceAndSdkVersion(“crespo:8”);
20
21         $this->context->setUserLanguage(“ja“);
22         $this->context->setUserCountry(“JP“);
23
24         $this->setOperatorTmobile();
25     }
26
27     function setOperatorTmobile() {
28 //      $this->setOperator(“T-Mobile”, “310260”);
29 //      $this->setOperator(“NTT DOCOMO”, “44010”);
30         $this->setOperator(“KDDI“, “440127“);
31     }

変更点は主に4箇所です。

  • setVersion()
    “2009011”となっていたら”1002012“と変更
  • setUserLanguage(), setUserCountry()
    今回は日本マーケットを対象としたいので、Languageを”ja“、Countryを”JP“としました。
    ちなみに韓国版では”kr”と”KR”にしています。
  • setOperator*
    ここで通信キャリアを指定します。デフォルトではT-Mobileとなっているので、直接書き換えるなりメソッドを増やすなりしましょう。
    上のコードでは直接書き換えてKDDIを指定しています。DoCoMoにしたい場合は “44010” を指定してください。

これでサンプルコードは動くはずです。
っと、MarketSession内部でのHTTP通信方法として cURL を呼び出していますので、PHPのcURL拡張は必須ですね。

こちらのブログにもっと詳しく解説されていますのでご参照下さい。
doroidpanic.com
実際に検索できるサンプルも設置されていますね。


さてさて、ここからが本題。


「あぷり握り」では

define(‘ANDROID_DEVICEID’, ‘000000000000000‘);

の部分に、僕自身が使っていたAndroid機のIMEIを設定していました。もちろんGoogleアカウントもきちんと取得しているもので、それで問題なく動作していました。
昨日、検索できない不具合が発見され、そこからさんざんググりまくり試しまくったんですが、どうやってもBad Requestかレスポンスが空っぽか、という状態でした。

GithubのISSUEにも

ハーイ!\(^o^)/

最近、なんだかアプリ検索がおかしいんだ! “maps” でもなにもヒットしないんだよ!
誰か何か知らない!?(´・ω・`)」

なんて書き込みがあったりして、「あー困ってるの俺だけじゃないんだなー」と安心したりして。

そもそもこのライブラリは「Unofficial」なものなので、Googleに仕様変更をあらかじめ周知してFAQを置いて、、なんて義務はありません。
動かなくなったとしても文句は言えないので、誰か「神」が降りてくるのを待つしか無いわけですね。
 
 

今回も神待ちかぁ・・・
 
 
と諦めかけていた時、ふと「デバイスID 変えてみたらどだ?」という囁きが(頭の中で)聞こえたんです。
 
 
ま、無駄だとは思うけどこれ以上おかしくなることはないさ、ってことで、幾つかデバイスIDを変えて試してみました。

  • “00000000000”(全てゼロ) → Bad Request
  • “00000012345”(適当)   → Bad Request
まーだめだよねー、実機のIMEIでダメなんだもん。

  • “000000000001”(最後が1) → 3 hits

・・・・・・・・・・・・・・・・・え?(@_・)

再度試す・・・・ 3hit ・・・・いやいやもう一度・・・・ 3hit ・・・・サーバ変えてみよう・・・・3hit


動いたよorz


動いたのは動いたけど。。。。嬉しいけど。。。。


なんだこの釈然としない気持は(´・ω・`)



ということで、もし同様の現象にここ数日で悩まされている方、


試しに最後が1のデバイスIDで試してみてください



あ、Googleアカウントはきっちり入れないと認証通りません。また、この方法が未来永劫OKという保証もありません。その時は


また一緒に悩みましょう(´・ω・`)







コメントを残す