自分が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 myquery
myqueryには普通の文字列の他,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までお願いします