Android: 使用Http Client和Webview自动登录(wordpress站点)

Android: Using Http Client and Webview to automate logging in (wordpress site)

这是我第一次制作 Android 应用程序,也许是我第 5 次左右接触 Java,所以请耐心等待..我的目标是制作手机将用户登录到 wordpress(我们在学校使用的网站,因此他们不是管理员,只是有效用户)的应用程序,但这是我遇到障碍的登录.

此外,我从我发现的以前的 SO 问题中借用了代码,如果我能再次找到它们,我将 link 贯穿始终。

问题:我的方法(感谢 google,以及该站点上的许多 posts)包括使用 HttpClient 发出 http Post 请求并登录网站,然后我的目标是将 cookie 传输到 Webview,这样我的用户就不必手动登录了。

全局变量:myWebView 和 httpClient

为了测试 purposes,我在 os 主线程上覆盖了网络 exception/error

Most 我的代码来自这里:()

与上述相关的一些代码:

AppSettings class(来自 SO post)来操作 cookie

public class AppSettings extends Application
{
  private static final DefaultHttpClient client = createClient();

  @Override
  public void onCreate()
  {
  }

  public static DefaultHttpClient getClient()
  {
    return client;
  }

  private static DefaultHttpClient createClient()
  {
    BasicHttpParams params = new BasicHttpParams();
    SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory();
    schemeRegistry.register(new Scheme("https", sslSocketFactory, 443));
    ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
    DefaultHttpClient httpclient = new DefaultHttpClient(cm, params);
    httpclient.getCookieStore().getCookies();
    return httpclient;
  }
}

现在在使用 WebView 的文件中,我放了这个,它支持os进行大量的 cookie 操作

        myWebView.setWebViewClient(new WebViewClient()
                             {

                                 @Override
                                 public void onPageStarted(WebView view, String url, Bitmap favicon)
                                 {
                                     super.onPageStarted(view, url, null);
                                     Log.w(null, "onPage Started url is" + url);



                                     Cookie sessionInfo;

                                     List<Cookie> cookies = httpClient.getCookieStore().getCookies();
                                     if (!cookies.isEmpty())
                                     {
                                         CookieSyncManager.createInstance(DisplayMessageActivity.this);
                                         CookieManager cookieManager = CookieManager.getInstance();

                                         for (Cookie cookie : cookies)
                                         {
                                             sessionInfo = cookie;
                                             String cookieString = sessionInfo.getName() + "=" + sessionInfo.getValue()
                                                     + "; domain=" + sessionInfo.getDomain();

                                             Log.w(null, "cookie string is " + cookieString);
                                             cookieManager.setCookie("http://www.corpsofcadets.net", cookieString);

                                             CookieSyncManager.getInstance().sync();
                                             Log.w(null, "cookie loop " + cookie.getName());
                                         }
                                     }
                                     else
                                     {
                                         Log.w(null, "no cookies");

                                     }
                                 }
                             });

这里是我 post 数据的地方。快速说明一下,这似乎有效,或者至少有所改进,因为在我手动设置 headers 之前,wordpress 发回了 HTTP 406 错误。现在 responseBody 似乎等同于登录页面的 HTML (http://pastebin.com/smLJrziz),但我也看到我正在分配 wordpress' "test_cookie" 所以一定发生了什么,对吧? !

    public void postData() throws IOException, ClientProtocolException {
    httpClient = AppSettings.getClient();
    HttpPost request = new HttpPost("http://corpsofcadets.net/wp-login.php");
    request.setHeader("Accept", "*/*");
    request.setHeader("Content-Type", "application/x-www-form-urlencoded");
    request.setHeader("User-Agent", "Mozilla/5.0");
    request.setHeader("Accept-Encoding", "gzip/deflate");
    List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
    postParameters.add(new BasicNameValuePair("user_login", "obscured"));
    postParameters.add(new BasicNameValuePair("user_pass", "obscured"));


    try {
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(postParameters);
        request.setEntity(entity);

        HttpResponse response= httpClient.execute(request);

        if (response != null)
        {
            String responseBody = EntityUtils.toString(response.getEntity());
            Log.w(null, "responseBody " + responseBody);

        }
        else
        {
            Log.w(null, "FAIL");
        }

    } catch (Exception e)
    {
        Log.w(null, "Error sending data");
        e.printStackTrace();
    }

这可能被认为是一个意见问题,因此是题外话,但我只是偶然发现了这个 SO 问题 (),这与 httpurlconnection 一起可以成为一个更简单的解决方案吗?最后,我可以以任何方式使用 XML-RPC 吗?

万分感谢

无效的方法:Webview.loadData、Webview.posturl、使用 javascript 和 Webview.loadurl 提交表单,当前设置和类似迭代

希望这可以帮助别人,我找到了一个很好的、简单的解决这个问题的方法。

尽管我曾尝试过 javascript 路线并使它名誉扫地,但我又尝试了一下,它运行良好。

我所做的不同之处在于重写了 onPageLoaded 函数,就像我在上面学到的那样,但失败了 ^ 并在其中做了 javascript 工作。我还有一个静态变量(我相信是 loadCount),确保每个实例只登录一次,以免拖慢页面加载时间。

我之前遇到过问题,我相信,因为它没有等待页面加载并且 javascript 正在搜索尚未加载的元素(也许?)。

所以这里是工作代码:

    myWebView.setWebViewClient(new WebViewClient() {
                               public void onPageFinished(WebView view, String url) {

                                   loadCount = 0;
                                   if (loadCount == 0) {
                                           myWebView.loadUrl(
                                                   "javascript:document.getElementById('user_login').value = '" + prfs.getString("Username", "Incorrect credentials") + "';" +
                                                   "javascript:document.getElementById('user_pass').value = '" + prfs.getString("Password", "Incorrect credentials") + "';" +
                                                   "javascript:document.getElementById('wp-submit').click();"

                                           );
                                           loadCount++;
                                       } else if (loadCount == 1) {
                                           myWebView.loadUrl(url);

                                       }
                                   }
                               });