2014-01-20 9 views
7

Ich habe eine PNR Anfrage App bei Google Play. Es hat sehr gut funktioniert. Aber vor kurzem hat Indian Railwys Captcha zu ihrem PNR-Anfrage-Bereich hinzugefügt, und aus diesem Grund kann ich keine richtigen Daten an den Server übermitteln, um eine angemessene Antwort zu erhalten. Wie füge ich dieses Captcha in meiner App in Form einer Bildansicht hinzu und fordere die Benutzer auf, auch die Captcha-Details einzugeben, damit ich korrekte Daten senden und eine angemessene Antwort erhalten kann.Wie aktualisiert man die PNR Capcha hinzugefügt in der Indian Railways Site

Indian Railways PNR Inquiry Link

Hier ist meine PnrCheck.java, die ich früher verwendet hat. Bitte helfen Sie, welche Änderungen sollten hier getan werden ..

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

} 
+0

Hat jemand versucht, diese Frage zu sehen? – ZooZ

Antwort

1

fand ich diese Antwort auf einen Beitrag gleichen fragen:

Wenn Sie den HTML-Code überprüfen, seine actualy ziemlich schlecht Captcha. Hintergrund des Captchas ist: http://www.indianrail.gov.in/1.jpg Diese Zahlen sind tatsächlich in Eingabe-Tag:

Was sie tun, ist, über Javascript, verwenden Sie Zahlen aus diesem versteckten Eingabe-Tag und legte sie auf diese Zeitspanne mit "Captcha" Hintergrund.

So basicaly Ihre Strömung ist:

lesen ihre html

get "Captcha" (lol, lustig captcha obwohl) Wert von Eingabefeld

, wenn der Benutzer legt Daten in Ihrem PNR-Feld und drückt erhalten Der Status

Postformularfeld, setzen PNR in der richtigen Wert, setzen captcha in der richtigen Wert

Parse Antwort

Oh ja, noch eine Sache. Sie können jeden Wert in versteckte Eingabe und "Captcha" Eingabe setzen, solange sie gleich sind. Sie überprüfen es nicht über die Sitzung oder irgendetwas.

EDIT (Codebeispiel für das Absenden des Formulars): Um das Posting zu vereinfachen, empfehle ich HttpClient-Komponenten von Apache: http://hc.apache.org/downloads.cgi Nehmen wir an, Sie haben HttpClient 4.3.1 heruntergeladen. Fügen Sie Client-, Core- und Mime-Bibliotheken in Ihr Projekt ein (kopieren Sie in den libs-Ordner, klicken Sie mit der rechten Maustaste auf Projekt, Eigenschaften, Java-Build-Pfad, Bibliotheken, Jars hinzufügen -> 3.).

Codebeispiel wäre:

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

Auch gewarnt ich das nicht in AsyncTask Anruf wickeln haben, so können Sie das tun müssen.

2

Wenn Sie rechts auf dieser Seite klicken und die Quelle auf http://www.indianrail.gov.in/pnr_Enq.html sehen, werden Sie die Quelle der Funktion finden, die das Captcha erzeugt, das Captcha vergleichen und validiert es :

Es gibt eine Javascript-Funktion hat das captcha zieht:

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

auch statt URL http://www.indianrail.gov.in/cgi_bin/inet_pnrstat_cgi.cgi, versuchen URL: http://www.indianrail.gov.in/cgi_bin/inet_pnstat_cgi_28688.cgi. Der vorherige ist unten. Ich denke, es wurde geändert. Hoffe das hilft dir.

+0

Es tut mir leid, aber ich bin neu in Android.Können Sie mir sagen, was ich mit diesen Funktionen machen soll? Was in dem Code, den ich zur Verfügung gestellt habe, zu bearbeiten? – ZooZ

+0

Auf einen zweiten Gedanken, haben Sie zuerst versucht, die neue URL zu verwenden? Soweit ich sehen kann, scheint das Captcha lokal zu sein. Sie senden es nicht zum Server oder irgendwohin. Versuchen Sie zunächst, Ihre URLs zu aktualisieren. –

+0

Nur eine Minute. Ich werde überprüfen und aktualisieren, was passiert .. – ZooZ