Android: 使用Http Client和Webview自动登录(wordpress站点)
Android: Using Http Client and Webview to automate logging in (wordpress site)
这是我第一次制作 Android
应用程序,也许是我第 5 次左右接触 Java
,所以请耐心等待..我的目标是制作手机将用户登录到 wordpres
s(我们在学校使用的网站,因此他们不是管理员,只是有效用户)的应用程序,但这是我遇到障碍的登录.
此外,我从我发现的以前的 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);
}
}
});
这是我第一次制作 Android
应用程序,也许是我第 5 次左右接触 Java
,所以请耐心等待..我的目标是制作手机将用户登录到 wordpres
s(我们在学校使用的网站,因此他们不是管理员,只是有效用户)的应用程序,但这是我遇到障碍的登录.
此外,我从我发现的以前的 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);
}
}
});