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); ListlinkElements = 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 件のコメント:
コメントを投稿