自分がAndroid Marketに公開しているアプリへのコメントをごそっとダウンロードしてみたかったのです.
session.getContext().setDeviceAndSdkVersion("crespo:8");修正版をここにアップしたいとは思っていますが,今は他で手一杯なもので...
以下のようなことができる,google codeで公開されているJava APIだそうです. Android端末からでなくても,PCからでも利用できました.
これはあくまで,初心者的・個人的な意見ですが,このAPIには下記のような残念なことがあります.
ということで改良版を作ってみました. 繰り返しになりますが,私は,AndroidもJavaも初心者なので,筋悪な可能性が大です.御容赦下さい.
補足:androidmarketapi-0.4.jarがリリースされましたが,上述のBase64の問題はfixされていませんでした.なので,trunkのRevision 0.37ベースの改良版を作りました.iconやscreenshotのダウンロードが改善されている模様です.
できあがったもの
MarketSession.java private byte[] executeRawHttpQuery(byte[] request) { ... // String request64 = Base64.encodeBytes(request); String request64 = Base64.encodeBytes(request, Base64.URL_SAFE); ... }
MarketSession.java public MarketSession() { ... // context.setAndroidId("0000000000000000"); context.setAndroidId("0123012301230123"); ... }必要があれば,APIを呼び出す側などで指定して下さい.
コマンドラインから使う場合 java -jar androidmarketapi-X.Y.jar myemail mypassword myquery [android ID] APIから呼び出す場合 session.getContext().setAndroidId("0123012301230123"); Android端末で取得するのは android.provider.Settings.System.ANDROID_ID のようです拙作の駄アプリ「メニュー0」をAndroid端末に入れても見えます.
MarketSession.java public MarketSession() { ... //context.setDeviceAndSdkVersion("sapphire:7"); context.setDeviceAndSdkVersion("passion:8"); ... }必要があれば,APIを呼び出す側などで指定して下さい.
APIから呼び出す場合 session.getContext().setDeviceAndSdkVersion("passion:8");Revision 0.37では下記の変更もされてました.
public MarketSession() { ... context.setVersion(1002012); ... }
MarketSession.java ... public void login(String email, String password, String accountType) { ... System.out.println("HTTP error code = " + httpEx.getErrorCode() + ", Response Message = " + httpEx.getErrorData()); System.exit(1); //if(httpEx.getErrorCode() != 403) //throw httpEx; //String data = httpEx.getErrorData(); //StringTokenizer st = new StringTokenizer(data, "\n\r="); //String googleErrorCode = null; //while (st.hasMoreTokens()) { //if (st.nextToken().equalsIgnoreCase("Error")) { //googleErrorCode = st.nextToken(); //break; //} //} //if(googleErrorCode == null) //throw httpEx; // //throw new LoginException(googleErrorCodew); ... } ... private byte[] executeRawHttpQuery(byte[] request) { ... //if(cnx.getResponseCode() >= 400) { // throw new RuntimeException("Response code = " + cnx.getResponseCode() + // ", msg = " + cnx.getResponseMessage()); //} if (cnx.getResponseCode() >= 400) { System.out.println("HTTP error code = " + cnx.getResponseCode() + ", Response Message = " + cnx.getResponseMessage()); System.exit(1); return null; } ... }
java -jar androidmarketapi-X.Y.jar myemail mypassword myquerymyqueryには普通の文字列の他,pname:<package名>やpub:<開発者名>なども使えます.
javadocとかもないので,android-market-apiのwikiとか,
このAPIのソースとかを見るしかないです....
このAPIのgoogle groupも良く読んでいけば,参考になるでしょう...
ということでは少しひどすぎるので,このページをもうちょっと先まで読んで下さい m_O_m
ソースを見ると,このAPIはなぜか,T-Mobileの端末として検索する実装になっているようです.
このためか,公開先地域や公開先通信キャリアを制限しているアプリは
検索にヒットしませんでした(泣)
私が作った駄アプリは日本語表示しか実装していなかったので,
日本にしか公開してなかったのです.
そこで,Developer consoleにアクセスして,一時的に全世界公開にしたら
検索にヒットしました.コメントのダウンロードに必要なアプリケーションIDも
取れました.
結果オーライだったのですが,今後のことも考え,なんとかしたい....
やむなく,javaでプログラムを書くことにしました.
android-market-apiのページに載っているサンプルソースに,
下記のコードを追加したら,日本にだけ公開している私の駄アプリも
ヒットするようになりました.Localeの設定だけではだめでした.
また,上述のBase64メソッドの問題を直していないオリジナルのjarでは
以下のコードを追加すると,400 Bad Requestになってました(とほほ)
Locale locale = new Locale("ja","JP"); session.setLocale(locale); session.setOperator("NTT DOCOMO", "44010"); session.getContext().setDeviceAndSdkVersion("passion:8");キャリア名とMCCは,ここらへんに載っています. くどい宣伝ですが(笑), 拙作の駄アプリ「メニュー0」をAndroid端末に入れても見えます.
Bug Fixed!! (IndexOutofBoundsのエラー対策しました)
androidmarketapi-0.3.7a.jarベースのものに入れ換えました
まず,サンプルソースのjarの使い方の説明の前に, android-market-apiというか,android marketの制限事項があります. android-market-apiのFAQとか,このAPIのgoogle groupとかに載っています.
主なことは以下のとおりです.
では,それぞれのjarの使い方の説明です.
キーワードやpackage名,開発者名でアプリを検索するためのjarです.
コマンドラインでの使い方
java -jar getAppInfo.jar email password query_str_file startIndex numbers [androidID]email, passwordはgoogleアカウントのものを指定して下さい.
出力例 (startIndex=0, numbers=1で検索しています)
query: メニュー0 startIndex = 0 entriesCount = 1 totalcount = 32 count = 1 ---------------------------------------------------------------------------------------- 0: ---------------------------------------------------------------------------------------- title: メニュー0 appType: APPLICATION category: ツール rating: 3.0 ratingsCount: 1 count: 0 countText: 50〜100 creator: gungun256 creatorId: gungun256 id: 515341127644247448 packageName: net.kokozo.android.menu0 version: 1.1 versionCode: 2 price: priceMicros: 0 priceCurrency: contactEmail: contactPhone: contactWebsite: http://www.kokozo.net/menu0/ screenshotsCount: 2 installSize: 9087 permissionIdList: [android.permission.READ_PHONE_STATE, android.permission.ACCESS_NETWORK_STATE] promotoText: ガラケーのメニュー+0を押したときに電話番号が出ますが、それと同じようなことをAndroidでするためのアプリです。 その他の情報も合わせて表示されます。 description: ガラケーのメニュー+0を押したときに電話番号が出ますが、それと同じようなことをAndroidでするためのアプリです。 その他の情報も合わせて表示されます。 スクロールしてみてください。全体の件数はtotalcount=32となっていますので,全件取得したい場合には, 下記のように繰り返す必要があります.
java -jar getAppInfo.jar email password query_str_file 0 10 java -jar getAppInfo.jar email password query_str_file 10 10 java -jar getAppInfo.jar email password query_str_file 20 10 java -jar getAppInfo.jar email password query_str_file 30 2
特定のアプリのコメントを取得するためのjarです.
コマンドラインでの使い方
java -jar getAppComments.jar email password appid startIndex numbers [androidID]email, passwordはgoogleアカウントのものを指定して下さい.
出力例 (appid=515341127644247448,startIndex=0, numbers=10で検索しています)
1,"nomiura","2010/11/19","金","01:16:04","JST",3,"テスト","09583040655570099370",CSV形式です.
android marketのいろいろな制約の関係で,下記のように不完全な方法しか できないようです.
startIndex=0,numbers=10 startIndex=10,numbers=10 startIndex=20,numbers=10 startIndex=30,numbers=10 ...と繰り返し,コメントを収集する.
パッケージ名をキーに以上を一気に行うスクリプトを用意する必要があります. 私が作ったperlスクリプトはあるのですが,まだ評価中ですし,ソースもキチャナイので, 今のところは公開は勘弁してください.興味がある方は,下記のtwitterに フォローして頂けたら,反応するかもしれません.
@gungun256までお願いします