Gfootというアプリをマーケットにリリースした。
アプリをリリースしたけど、何をやったのか?調べたのか?
書き残しておかないと忘れてしまいそうなので、
そろそろまとめてみる。
・ブラウザを利用しないでCookieを解決する
・RSSのパース
がメインかな?
GoogleのWeb履歴を見る際のCookieの扱いについては、ここを参照しました。
このサイトによると、履歴を見るためにログインするわけだが、そのためのCookieをログイン画面の
HTMLをGETで取得することで、解決していることがわかる。
また、ログインする際にformの情報をPOSTするわけだが、その情報も同時に取得している。
ただ、これだけだとAndroid上でどうやってログイン処理すればよいのかが
具体的にはわからないので、ここを参考にしてみた。
上記二つのサイトを参考に組み合わせてAndroidからGoogle Web履歴にアクセスしている。
以下は、説明に要らない部分など削っているので、変なところもあるかと思うが、
基本的には下記で得られた_HttpClient(DefaultHttpClientクラス)を利用すれば、履歴の取得が可能だ。
ちなみにHTMLをパースしてinput部分を取得するために
jericho-html-3.1.jarを利用しています。(LGPLなので使うだけならソースの公開義務はないはず。)
それと当然ですが、ネットワーク系の処理をするときにUIスレッドで処理すると
操作性が悪くなるので、AsyncTaskを利用してます。
@Override
protected DefaultHttpClient doInBackground(String... params) {
String email = params[0];
String passwd = params[1];
_HttpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);
_HttpClient.getParams().setParameter("http.connection.timeout", 5000);
_HttpClient.getParams().setParameter("http.socket.timeout", 3000);
HttpGet httpget = new HttpGet(https://www.google.com/accounts/ServiceLogin?hl=ja&nui=1&service=hist);
HttpResponse response;
String result = null;
try {
response = _HttpClient.execute(httpget);
int status_code = response.getStatusLine().getStatusCode();
Log.v("Gfoot","status_code="+status_code);
if (status_code < 400){
InputStream istream = response.getEntity().getContent();
InputStreamReader reader = new InputStreamReader(istream);
BufferedReader objBuf = new BufferedReader(reader);
StringBuilder builder = new StringBuilder();
String sLine;
while((sLine = objBuf.readLine()) != null){
builder.append(sLine);
}
result = builder.toString();
istream.close();
} else {
_HttpClient = null;
}
} catch (ClientProtocolException e) {
_HttpClient = null;
e.printStackTrace();
} catch (IOException e) {
_HttpClient = null;
e.printStackTrace();
}
if (result == null) {
return null;
}
String name;
String value;
Source source = new Source(result);
List linkElements = source.getAllElements(HTMLElementName.INPUT);
int count = linkElements.size();
List nameValuePair = new ArrayList(count);
for (Element linkElement : linkElements) {
name = linkElement.getAttributeValue("name");
value = linkElement.getAttributeValue("value");
if ("Email".equals(name)) {
value = email;
}
if ("Passwd".equals(name)) {
value = passwd;
}
nameValuePair.add(new BasicNameValuePair(name, value));
}
// この段階でPOSTするために必要な情報は、nameValuePairに含まれている。
HttpPost httppost = new HttpPost(https://www.google.com/accounts/ServiceLoginAuth?service=hist);
try {
httppost.setEntity(new UrlEncodedFormEntity(nameValuePair));
response = _HttpClient.execute(httppost);
} catch (UnsupportedEncodingException e) {
_HttpClient = null;
e.printStackTrace();
} catch (ClientProtocolException e) {
_HttpClient = null;
e.printStackTrace();
} catch (IOException e) {
_HttpClient = null;
e.printStackTrace();
}
return _HttpClient;
}
ここでログインの際に
https://www.google.com/accounts/ServiceLogin?service=hist
というのを利用して、ログインのためのCookieを取得しているが、
これはどうやって知るのか?履歴以外はどうなのか?
気になるところだと思う。
このサイトがかなりいろいろな情報をもたらしてくれる。
service=histは履歴をさしているわけだ。
次回は、履歴やBookmarkをRSS形式で取得する部分と
パースについて。
また、おまけでアプリケーション全体において永続的なデータを作る方法。
0 件のコメント:
コメントを投稿