How to Update Capcha PNR Added to Indian Railways

I have a PNR request application on Google Play. He worked very well. But recently, Indian Railwys have added captcha to their PNR request section, and because of this, I can not transfer the proper data to the server to get the correct answer. How to add this captcha in my application as an image and ask users to enter tracking data so that I can send the correct data and get the right answer.

Indian Railway Link to PNR Request

Here is my PnrCheck.java that I used before. Please help what changes should be made here.

import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.apache.http.Header; import org.apache.http.HttpHost; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; import org.apache.http.entity.InputStreamEntity; import org.apache.http.impl.DefaultHttpClientConnection; import org.apache.http.message.BasicHttpEntityEnclosingRequest; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.BasicHttpProcessor; import org.apache.http.protocol.ExecutionContext; import org.apache.http.protocol.HttpContext; import org.apache.http.protocol.HttpRequestExecutor; import org.apache.http.protocol.RequestConnControl; import org.apache.http.protocol.RequestContent; import org.apache.http.protocol.RequestExpectContinue; import org.apache.http.protocol.RequestTargetHost; import org.apache.http.protocol.RequestUserAgent; import org.apache.http.util.EntityUtils; public class PNRStatusCheck { public static void main(String args[]) { try { String pnr1 = "1154177041"; String reqStr = "lccp_pnrno1=" + pnr1 + "&submitpnr=Get+Status"; PNRStatusCheck check = new PNRStatusCheck(); StringBuffer data = check.getPNRResponse(reqStr, "http://www.indianrail.gov.in/cgi_bin/inet_pnrstat_cgi.cgi"); if(data != null) { @SuppressWarnings("unused") PNRStatus pnr = check.parseHtml(data); } } catch(Exception e) { e.printStackTrace(); } } public StringBuffer getPNRResponse(String reqStr, String urlAddr) throws Exception { String urlHost = null; int port; String method = null; try { URL url = new URL(urlAddr); urlHost = url.getHost(); port = url.getPort(); method = url.getFile(); // validate port if(port == -1) { port = url.getDefaultPort(); } } catch(Exception e) { e.printStackTrace(); throw new Exception(e); } HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, "UTF-8"); HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1"); HttpProtocolParams.setUseExpectContinue(params, true); BasicHttpProcessor httpproc = new BasicHttpProcessor(); // Required protocol interceptors httpproc.addInterceptor(new RequestContent()); httpproc.addInterceptor(new RequestTargetHost()); // Recommended protocol interceptors httpproc.addInterceptor(new RequestConnControl()); httpproc.addInterceptor(new RequestUserAgent()); httpproc.addInterceptor(new RequestExpectContinue()); HttpRequestExecutor httpexecutor = new HttpRequestExecutor(); HttpContext context = new BasicHttpContext(null); HttpHost host = new HttpHost(urlHost, port); DefaultHttpClientConnection conn = new DefaultHttpClientConnection(); context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host); @SuppressWarnings("unused") String resData = null; @SuppressWarnings("unused") String statusStr = null; StringBuffer buff = new StringBuffer(); try { String REQ_METHOD = method; String[] targets = { REQ_METHOD }; for (int i = 0; i < targets.length; i++) { if (!conn.isOpen()) { Socket socket = new Socket(host.getHostName(), host.getPort()); conn.bind(socket, params); } BasicHttpEntityEnclosingRequest req = new BasicHttpEntityEnclosingRequest("POST", targets[i]); req.setEntity(new InputStreamEntity(new ByteArrayInputStream(reqStr.toString().getBytes()), reqStr.length())); req.setHeader("Content-Type", "application/x-www-form-urlencoded"); req.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7"); req.setHeader("Cache-Control", "max-age=0"); req.setHeader("Connection", "keep-alive"); req.setHeader("Origin", "http://www.indianrail.gov.in"); req.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); req.setHeader("Referer", "http://www.indianrail.gov.in/pnr_Enq.html"); //req.setHeader("Accept-Encoding", "gzip,deflate,sdch"); req.setHeader("Accept-Language", "en-US,en;q=0.8"); req.setHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3"); httpexecutor.preProcess(req, httpproc, context); HttpResponse response = httpexecutor.execute(req, conn, context); response.setParams(params); httpexecutor.postProcess(response, httpproc, context); Header[] headers = response.getAllHeaders(); for(int j=0; j<headers.length; j++) { if(headers[j].getName().equalsIgnoreCase("ERROR_MSG")) { resData = EntityUtils.toString(response.getEntity()); } } statusStr = response.getStatusLine().toString(); InputStream in = response.getEntity().getContent(); BufferedReader reader = null; if(in != null) { reader = new BufferedReader(new InputStreamReader(in)); } String line = null; while((line = reader.readLine()) != null) { buff.append(line + "\n"); } try { in.close(); } catch (Exception e) {} } } catch (Exception e) { throw new Exception(e); } finally { try { conn.close(); } catch (IOException e) { e.printStackTrace(); } } return buff; } public PNRStatus parseHtml(StringBuffer data) throws Exception { BufferedReader reader = null; if(data != null) { reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data.toString().getBytes()))); } else { return null; } String line = null; TrainDetails trainDetails = new TrainDetails(); List<PassengerDetails> passDetailsList = new ArrayList<PassengerDetails>(); PassengerDetails passDetails = null; int i = 0; while ((line = reader.readLine()) != null) { if(line.startsWith("<TD") && line.contains("table_border_both")) { line = line.replace("<B>", ""); line = line.substring(line.indexOf("\">")+2, line.indexOf("</")).trim(); if(line.contains("CHART")) { trainDetails.setChatStatus(line); break; } if(i > 7) {//Passenger Details if(passDetails == null) { passDetails = new PassengerDetails(); } switch(i) { case 8 : passDetails.setName(line); break; case 9 : passDetails.setBookingStatus(line.replace(" ", "")); break; case 10 : passDetails.setCurrentStatus(line.replace(" ", "")); i = 7; break; } if(i == 7 ) { passDetailsList.add(passDetails); passDetails = null; } } else { // Train details switch(i){ case 0 : trainDetails.setNumber(line); break; case 1 : trainDetails.setName(line); break; case 2 : trainDetails.setBoardingDate(line); break; case 3 : trainDetails.setFrom(line); break; case 4 : trainDetails.setTo(line); break; case 5 : trainDetails.setReservedUpto(line); break; case 6 : trainDetails.setBoardingPoint(line); break; case 7 : trainDetails.setReservedType(line); break; default : break; } } i++; } } if(trainDetails.getNumber() != null) { PNRStatus pnrStatus = new PNRStatus(); pnrStatus.setTrainDetails(trainDetails); pnrStatus.setPassengerDetails(passDetailsList); return pnrStatus; } else { return null; } } } 
+7
java json android
source share
2 answers

I found this answer on one post asking the same thing:

If you check the html code, its actual rather bad captcha. Background captcha: http://www.indianrail.gov.in/1.jpg These numbers are valid in the input tag:

What they do, through javascript, uses numbers from this hidden input tag and puts them in this interval with a captcha background.

So basically your thread:

read them html

get "captcha" (lol, funny captcha though) value from input field

when the user puts the data in your PNR field and clicks Get Status

enter PNR in the correct value, put captcha in the correct value

Parsing Analysis

Oh yes, one more thing. You can put any value in the hidden input and the captcha input if they are the same. They do not verify this through a session or anything else.

EDIT (sample code for submitting the form): To simplify the publication form, I recommend the HttpClient components from Apache: http://hc.apache.org/downloads.cgi Let's say you downloaded HttpClient 4.3.1. Include client, main, and mime-library projects in the project (copy to the libs folder, right-click on the project, properties, Java build path, libraries, add banks → add these 3.).

Code example:

 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(); } 

Also, be careful, I did not wrap this in an AsyncTask call, so you have to do this.

+1
source share

If you right-click on this page and look at the source at http://www.indianrail.gov.in/pnr_Enq.html , you will find the source of the function that generates the captcha, compare the captcha and confirm it:

There is a javascript function that draws captcha:

 //Generates the captcha function that draws the captcha function DrawCaptcha() { var a = Math.ceil(Math.random() * 9)+ ''; var b = Math.ceil(Math.random() * 9)+ ''; var c = Math.ceil(Math.random() * 9)+ ''; var d = Math.ceil(Math.random() * 9)+ ''; var e = Math.ceil(Math.random() * 9)+ ''; var code = a + b + c + d + e; document.getElementById("txtCaptcha").value = code; document.getElementById("txtCaptchaDiv").innerHTML = code; } //Function to checking the form inputs: function checkform(theform){ var why = ""; if(theform.txtInput.value == ""){ why += "- Security code should not be empty.\n"; } if(theform.txtInput.value != ""){ if(ValidCaptcha(theform.txtInput.value) == false){ //here validating the captcha why += "- Security code did not match.\n"; } } if(why != ""){ alert(why); return false; } } // Validate the Entered input aganist the generated security code function function ValidCaptcha(){ var str1 = removeSpaces(document.getElementById('txtCaptcha').value); var str2 = removeSpaces(document.getElementById('txtInput').value); if (str1 == str2){ return true; }else{ return false; } } // Remove the spaces from the entered and generated code function removeSpaces(string){ return string.split(' ').join(''); } 

Also, instead of using the URL http://www.indianrail.gov.in/cgi_bin/inet_pnrstat_cgi.cgi , try the URL: http://www.indianrail.gov.in/cgi_bin/inet_pnstat_cgi_28688.cgi . The previous one is down. I think it has been changed. Hope this helps you.

+2
source share

All Articles