我在Google Play上有一个PNR查询应用程序。运行得很好。但是最近,印度的Railwys在他们的PNR查询部分添加了验证码,因此,我无法将正确的数据传递给服务器以获取正确的响应。如何以imageview的形式在我的应用程序中添加此验证码,并要求用户也输入验证码详细信息,以便我可以发送适当的数据并获得适当的响应。

Indian Railways PNR Inquiry Link

最佳答案

如果您检查html代码,它实际上是非常糟糕的验证码。
验证码的背景是:http://www.indianrail.gov.in/1.jpg
这些数字实际上在输入标签中:

<input name="lccp_cap_val" value="14167" id="txtCaptcha" type="hidden">


他们在做什么是通过javascript,使用该隐藏的输入标签中的数字
并以“验证码”背景将其放在该范围内。

因此,基本上,您的流程是:


阅读他们的html
从输入字段中获取“验证码”(虽然哈哈,有趣的验证码)值
当用户将数据放入您的PNR字段并按获取状态时
发布表单字段,将PNR设置为适当的值,将验证码设置为适当的值
解析响应


哦,是的,还有一件事。您可以在隐藏的输入和“验证码”中输入任何值
输入,只要它们相同即可。他们没有通过会话或
任何东西。

编辑(用于提交表单的代码示例):
为了简化发布表单,我建议使用Apache的HttpClient组件:
http://hc.apache.org/downloads.cgi
假设您下载了HttpClient 4.3.1。包括客户,核心和哑剧
项目中的库(复制到libs文件夹,右键单击项目,
属性,Java构建路径,库,添加Jars->添加这些3.)。

代码示例为:

private static final String FORM_TARGET = "http://www.indianrail.gov.in/cgi_bin/inet_pnstat_cgi.cgi";
    private static final String INPUT_PNR = "lccp_pnrno1";
    private static final String INPUT_CAPTCHA = "lccp_capinp_val";
    private static final String INPUT_CAPTCHA_HIDDEN = "lccp_cap_val";

    private void getHtml(String userPnr) {
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.addTextBody(INPUT_PNR, userPnr); // users PNR code
        builder.addTextBody(INPUT_CAPTCHA, "123456");
        builder.addTextBody("submit", "Get Status");
        builder.addTextBody(INPUT_CAPTCHA_HIDDEN, "123456"); // values don't
                                                                // matter as
                                                                // long as they
                                                                // are the same

        HttpEntity entity = builder.build();

        HttpPost httpPost = new HttpPost(FORM_TARGET);
        httpPost.setEntity(entity);

        HttpClient client = new DefaultHttpClient();

        HttpResponse response = null;
        String htmlString = "";
        try {
            response = client.execute(httpPost);
            htmlString = convertStreamToString(response.getEntity().getContent());
                    // now you can parse this string to get data you require.
        } catch (Exception letsIgnoreItForNow) {
        }
    }

    private static String convertStreamToString(InputStream is) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } catch (IOException ignoredOnceMore) {
        } finally {
            try {
                is.close();
            } catch (IOException manyIgnoredExceptions) {
            }
        }

        return sb.toString();
    }


另外,请注意,我没有将其包装在异步调用中,因此您必须这样做。

关于java - 如何在Android的ImageView中显示验证码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21087659/

10-11 22:22
查看更多