首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

如何获取网页的一部分并在gui界面中显示

2013-12-09 
怎么获取网页的一部分并在gui界面中显示一个投票页面,我想用程序读出验证码,把那段代码在图形界面显示出来

怎么获取网页的一部分并在gui界面中显示
一个投票页面,我想用程序读出验证码,把那段代码在图形界面显示出来,然后手动输入进去,选项什么的用程序自动选好,然后再post过去。
因为我看网上说的好多验证码破解不了,所以就半自动投票吧,总比一天只能投一次强吧。
我现在的问题有这些:
1、把验证码显示出来的代码怎么在我的程序里面给显示出来?模拟个浏览器?请大家给个提示和例子,谢谢!
2、一般来说服务器上都会在打开投票页面就有个session,我抓包看到cookie里面有个PHPSESSIONID,这个怎么读取回来?我试了如下的代码:


URL url = new URL("http://192.168.1.2/vote/index.php");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//获得session信息
String session_value = urlConnection.getHeaderField("Set-Cookie");
String[] sessionId = session_value.split(";");
//保存session信息
System.out.println(sessionId[0]);

怎么获取不到啊

[解决办法]
如果还打算显示内容,考虑直接用 SWT 的一个浏览器实现来做吧。


另外,如果不考虑现实内容,而是要做些模拟POST动作之类的,建议用Apache的组件,HttpClient,功能灵活强大得多。比如Cookie信息啥的,都是自动管理的。
[解决办法]
以前我也曾想过做一个类似的功能吧。。
后来做了一半因为懒就放弃了。。
验证码识别可以通过某些开放的API图片识别实现,当然得看具体的验证码图片,而且现在这样的API并不好找。当然当初只是搜了一下并没有尝试去做。
至于1楼上说的Apache组件,我在android下的一些用法。我想应该指的是这个吧,

 public static String sendSST2Proxy(HttpEntity entity,String proxy) throws Exception {
        final HttpPost post = new HttpPost(proxy);
        post.setEntity(entity);
        HttpResponse httpResponse = SSLSocketFactoryEx.getNewHttpClient().execute(post);
        if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
String returnstr = IOHelper.fromIputStreamToString(httpResponse.getEntity().getContent());
        Log.i(Constant.LOG_TAG, returnstr);
        return returnstr;
        }
        return null;
    }


 public static HttpClient getNewHttpClient() {
        try {
            KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            trustStore.load(null, null);

            SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore);
            sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

            HttpParams params = new BasicHttpParams();
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

            SchemeRegistry registry = new SchemeRegistry();
            registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
            registry.register(new Scheme("https", sf, 443));

            ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

            return new DefaultHttpClient(ccm, params);
        } catch (Exception e) {
            return new DefaultHttpClient();
        }
    }


[解决办法]
引用:
以前我也曾想过做一个类似的功能吧。。
后来做了一半因为懒就放弃了。。
验证码识别可以通过某些开放的API图片识别实现,当然得看具体的验证码图片,而且现在这样的API并不好找。当然当初只是搜了一下并没有尝试去做。
至于1楼上说的Apache组件,我在android下的一些用法。我想应该指的是这个吧,

 public static String sendSST2Proxy(HttpEntity entity,String proxy) throws Exception {
        final HttpPost post = new HttpPost(proxy);


        post.setEntity(entity);
        HttpResponse httpResponse = SSLSocketFactoryEx.getNewHttpClient().execute(post);
        if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
String returnstr = IOHelper.fromIputStreamToString(httpResponse.getEntity().getContent());
        Log.i(Constant.LOG_TAG, returnstr);
        return returnstr;
        }
        return null;
    }



 public static HttpClient getNewHttpClient() {
        try {
            KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            trustStore.load(null, null);

            SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore);
            sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

            HttpParams params = new BasicHttpParams();
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

            SchemeRegistry registry = new SchemeRegistry();
            registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
            registry.register(new Scheme("https", sf, 443));

            ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

            return new DefaultHttpClient(ccm, params);
        } catch (Exception e) {
            return new DefaultHttpClient();
        }
    }

这是我安卓中的用法,具体有可能有些不同。
apache组件我想应该下个jar包就可以了吧。。
[解决办法]
例子偏老是真的,不过用法基本一样啊。

给你这个:
http://wenku.baidu.com/view/0a027c5e804d2b160b4ec029.html
[解决办法]
引用:
Quote: 引用:

通过header可以读出所有的头信息,包括你的PHPSESSION

我自己项目里的,供参考:


/**
 * A HTTP request(POST) with given URL
 * 
 * @param strUrl
 *            the URL you want to request
 * @return
 */
public static String post(String url) throws ClientProtocolException, IOException {
String result = "";
String httpUrl = QuhaoConstant.HTTP_URL + url;

HttpPost request = new HttpPost(httpUrl);
request.setHeader("user-agent", "QuhaoAndroid");
// set session id if exist
if(StringUtils.isNotNull(CommonHTTPRequest.sessionID)){
//request.setHeader("Set-Cookie", CommonHTTPRequest.sessionID);
}

HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
int timeoutConnection = 10 * 1000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);

// Set the default socket timeout in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 10 * 1000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

HttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpResponse response = httpClient.execute(request);
Header[] headers = response.getAllHeaders();

for(Header h : headers){
//这里你打印h.getName 和 h.getValue
QuhaoLog.d(TAG, h.getName() + "
[解决办法]
" + h.getValue());
QuhaoLog.d(TAG, "decoded: "+URLDecoder.decode(h.getValue(), "UTF-8"));

// h.getValue() : PLAY_SESSION=28b7eb241f5b26e778acf4a825f8deddfa123e47-%005289c60bc929b65bbf675278%3A5289c60bc929b65bbf675278%00%00quhao_username%3A5289c60bc929b65bbf675278%00;Path=/
if(h.getValue().contains("PLAY_SESSION")){


//CommonHTTPRequest.sessionID = h.getValue().split(":")[2];
}
}

QuhaoLog.i(TAG, "get data from server, the status code is  : " + response.getStatusLine().getStatusCode());
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
result = EntityUtils.toString(response.getEntity());
QuhaoLog.v(TAG, "get data from server : " + result);
}

return result;
}



为什么我这样写获取不到哪?

姓名、爱好什么的在post数据里面好设置,这个验证码如果是那种很复杂的,无法破解的,或者破解成功率很低的,我想在自己的gui界面里面给它显示出来,手动输入验证码,应该怎么弄?


那是个图片吧。你可以找到这个图片的src。然后用流读取下载到本地,再显示到你的容器中

热点排行