cUrl-Zugriff bringt Java-Exception(BeanUtils)

DarkRaver

Erfahrenes Mitglied
Hallo,
ich versuche mich gerade ein wenig mit cUrl auseinanderzusetzen und möchte daher eine automatische Auslesung von
https://www.zurichconnect.ch/gm/de/versicherungen/auto/berechnen.html
durchführen. Ab dem 3. Schritt gibt es einmal die Haftpflicht, die Teilkasko und die Vollkaskoversicherung, diese 3 Werte stehen dann oben. Ich gebe aktuell erst einmal ein Request um die Session u. den Cookie zu ermitteln:
PHP:
$curl_log = fopen('data/curl_requests_first.txt', 'w');
$ch = curl_init('https://www.zurichconnect.ch/gm/de/versicherungen/auto/berechnen.html');
curl_setopt_array($ch, $curlData->getCurlConfig($curl_log));
curl_setopt($ch, CURLOPT_POST, 0);
$result = curl_exec($ch);
Das curlData->getCurlConfig sieht folgendermaßen aus:
PHP:
    public function getCurlConfig($fileHandler) {
        $curlHeader = 'Content-Type:application/x-www-form-urlencoded;charset=UTF-8';
        $curlAgent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2';

        $curlConfig = array(
            CURLOPT_USERAGENT => $curlAgent,
            CURLOPT_HEADER => $curlHeader,
            CURLOPT_FOLLOWLOCATION => false,
            CURLOPT_SSLVERSION => 3,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => 2,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_HEADER => 1,
            CURLOPT_COOKIEJAR => self::$cookiePath,
            CURLOPT_COOKIEFILE => self::$cookiePath,
            CURLOPT_HTTPHEADER => array($curlHeader),
            CURLOPT_VERBOSE => 1,
            CURLOPT_STDERR => $fileHandler,
        );
        return $curlConfig;
    }
Nachdem ich nun die Session in dem Cookie abgespeichert habe, kann es mit dem ersten Schritt weitergehen:
PHP:
$curl_log = fopen('data/curl_request_step1-2.txt', 'w');
$ch = curl_init('https://www.zurichconnect.ch/zuritel/genevaOfferMF60.do?command=Step2&commandvalue=null&ts=' . microtime(true));
curl_setopt($ch, CURLOPT_REFERER, 'https://www.zurichconnect.ch/gm/de/versicherungen/auto/berechnen.html');
curl_setopt_array($ch, $curlData->getCurlConfig($curl_log));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($curlData->getStep2Data()));
$result = curl_exec($ch);
Das funktioniert auch gut und alles bisherige funktioniert. Das getStep2Data sieht so aus:
Code:
    public function getStep2Data() {
        $curl_array = array(
            '' => '',
            'aazones' => 'container,validationErrors,',
            '' => '',
            'aaxmlrequest' => 'true',
            'genevaHelper.attribute(PERSON_INSURANCEHOLDER_SEX).wert' => $this->config[DYN]['gender'],
            'genevaHelper.attribute(PERSON_INSURANCEHOLDER_FIRSTNAME).wert' => $this->config[FIX]['firstName'],
            'genevaHelper.attribute(PERSON_INSURANCEHOLDER_SIRNAME).wert' => $this->config[FIX]['lastName'],
            'genevaHelper.attribute(PERSON_INSURANCEHOLDER_EMAIL).wert' => $this->config[FIX]['emailAdress'],
            'genevaHelper.attribute(PERSON_INSURANCEHOLDER_EMAIL).wert' => $this->config[FIX]['emailAdress'],
            'genevaHelper.attribute(PERSON_INSURANCEHOLDER_BIRTHDATE).wert' => date("d.m.Y", $this->config[DYN]['birthday']),
            'nationalityVN' => 'andere',
            'genevaHelper.attribute(PERSON_INSURANCEHOLDER_NATIONALITY).wert' => $this->config[DYN]['country'],
            'genevaHelper.attribute(PERSON_INSURANCEHOLDER_PERMISSION_TYPE).wert' => $this->config[FIX]['countryLength'],
            'genevaHelper.attribute(PERSON_INSURANCEHOLDER_PERMISSION_DATE).wert' => date("d.m.Y", $this->config[DYN]['birthday']),
            'genevaHelper.vnIsDriver' => 'Y',
            'genevaHelper.attribute(PERSON_INSURANCEHOLDER_LICENSE_B).wert' => date("d.m.Y", $this->config[DYN]['licDate']),
            'genevaHelper.attribute(PERSON_DRIVER_FIRSTNAME).wert' => '',
            'genevaHelper.attribute(PERSON_DRIVER_SIRNAME).wert' => '',
            'genevaHelper.attribute(PERSON_DRIVER_BIRTHDATE).wert' => 'TT.MM.JJJJ',
            'genevaHelper.attribute(PERSON_DRIVER_NATIONALITY).wert' => 'X',
            'genevaHelper.attribute(PERSON_DRIVER_PERMISSION_TYPE).wert' => 'X',
            'genevaHelper.attribute(PERSON_DRIVER_PERMISSION_DATE).wert' => 'TT.MM.JJJJ',
            'genevaHelper.attribute(PERSON_DRIVER_LICENSE_B).wert' => 'TT.MM.JJJJ',
            'fromPage' => 'Step1',
            '' => '1001;;;;;Hcurr:CHF;;',
        );
        return $curl_array;
    }
Nun zum nächsten Schritt, hier kommt nämlich der Fehler.
PHP:
$curl_log = fopen('data/curl_request_step2-3.txt', 'w');
$ch = curl_init('https://www.zurichconnect.ch/zuritel/genevaOfferMF60.do?command=Step3&commandvalue=null&ts=' . microtime(true));
curl_setopt($ch, CURLOPT_REFERER, 'https://www.zurichconnect.ch/gm/de/versicherungen/auto/berechnen.html');
curl_setopt_array($ch, $curlData->getCurlConfig($curl_log));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($curlData->getStep3Data()));
$result = curl_exec($ch);
getStep3Data:
PHP:
    public function getStep3Data() {
        $curl_array = array(
            '' => '',
            'aazones' => 'container,sideChainDiv,validationErrors,',
            '' => '',
            'aaxmlrequest' => 'true',
            'registrationDate' => $this->config[DYN]['trafficRegistrationDate'],
            'id_1000a' => 'Typen-Nummer',
            'markenbezeichnung' => 'Marke wählen...',
            'typenbezeichnung' => 'Modell wählen...',
            'typenscheinNummer' => $this->config[DYN]['typeSham'],
            'genevaHelper.attribute(MF_RISK_PLATECANTON).wert' => $this->config[DYN]['kanton'],
            'genevaHelper.attribute(MF_RISK_ACCESSORIES).wert' => $this->config[DYN]['variousPrice'],
            'genevaHelper.attribute(MF_RISK_KM_PER_YEAR).wert' => $this->config[DYN]['kmPerYear'],
            'genevaHelper.attribute(MF_RISK_GARAGE).wert' => $this->config[FIX]['garage'],
            'genevaHelper.attribute(MF_RISK_USAGE).wert' => $this->config[FIX]['vehicleUse'],
            'genevaHelper.attribute(MF_RISK_YOUNG_DRIVER).wert' => $this->config[DYN]['driverOlderThan25'],
            'genevaHelper.attribute(MF_RISK_LEASING).wert' => $this->config[DYN]['leasing'],
            'genevaHelper.attribute(ROOT_INSURANCE_BEGIN).wert' => $this->config[DYN]['begin'],
            'genevaHelper.attribute(ROOT_PROMO_CODE).wert' => '',
            'genevaHelper.attribute(MF_QUESTION5_SELECTED).wert' => '0' . $this->config[FIX]['question1'],
            'genevaHelper.attribute(MF_QUESTION5_TO_WHO).wert' => '',
            'genevaHelper.attribute(MF_QUESTION5_COUNT).wert' => '',
            'genevaHelper.attribute(MF_QUESTION5_TOTAL).wert' => 0,
            'genevaHelper.attribute(MF_QUESTION6_SELECTED).wert' => '0' . $this->config[FIX]['question2'],
            'genevaHelper.attribute(MF_QUESTION6_CLAIM_TYPE).wert' => '',
            'genevaHelper.attribute(MF_QUESTION6_COUNT).wert' => '',
            'genevaHelper.attribute(MF_QUESTION7_SELECTED).wert' => '0' . $this->config[FIX]['question3'],
            'genevaHelper.attribute(af___mf___01___7___3___0).wert' => '',
            'genevaHelper.attribute(af___mf___01___7___2___0).wert' => '',
            'fromPage' => 'Step2',
            'dispatch' => 'suchenByNumber',
            '' => '1002;;;;;Hcurr:CHF;;',
        );
        return $curl_array;
    }
Führe ich dies aus bekomme ich den Quelltext vom 2. Schritt zurück und unten steht "DIN-Kw nicht gesetzt". Gut, ich habe also den ausgehenden Traffic näher analysiert und herausbekommen, dass dies per Javascript gesetzt wird. Also machen wir das doch nach, hab ich mir gedacht:
PHP:
$curl_log = fopen('data/curl_request_din_kw.txt', 'w');
$ch = curl_init('https://www.zurichconnect.ch/zuritel/eurotaxSearchSelection.do?fahrzeugListId=0');
curl_setopt($ch, CURLOPT_REFERER, 'https://www.zurichconnect.ch/gm/de/versicherungen/auto/berechnen.html');
curl_setopt_array($ch, $curlData->getCurlConfig($curl_log));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($curlData->getDinKwData()));
$result = curl_exec($ch);
(Das $curlData->getDinKwData() ist gleich aufgebaut wie getStep3Data, habe es nur für alle Fälle abstrahiert)
Jetzt kommt es, diesen Schritt habe ich vor dem Step2toStep3 gemacht, es muss ja vorher gesetzt werden. Nun bekomme ich diese Fehlermeldung vom Server zurück:
PHP:
<?xml version="1.0" encoding="UTF-8"?><exception type="javax.servlet.ServletException"><![CDATA[javax.servlet.ServletException: BeanUtils.populate
	at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:1254)
	at org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:821)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:254)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at com.zurich.chz.omniart.servlet.filter.PrincipalFilter.doFilter(PrincipalFilter.java:183)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.ajaxanywhere.AAFilter.doFilter(AAFilter.java:65)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
	at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:39)
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:153)
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:59)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	at org.apache.catalina.valves.FastCommonAccessLogValve.invoke(FastCommonAccessLogValve.java:481)
	at com.zurich.chz.omni.tomcat55.valves.ValveUserFormBase.invoke(ValveUserFormBase.java:103)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:307)
	at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:385)
	at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:748)
	at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:678)
	at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:871)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
	at java.lang.Thread.run(Thread.java:534)
]]></exception>"
Das ist sehr merkwürdig in meinen Augen und ich suche schon seit letzter Woche Donnerstag vergeblich eine Lösung für dieses Problem.
Vielleicht weiß ja einer von euch eine Lösung, ich hänge hier auf jeden fall und weiß nicht mehr weiter.
Vielen Dank schon einmal.

Mfg
 
Ich kenne mich mit struts nicht aus, für mich sieht es danach aus, als ob der Java-Appserver die Eingaben sanitizen will, und dabei auf einen Fehler stößt. Leider schweigt sich die Exception aus, um welchen es sich handelt.

Ich kann dir an dieser Stelle nur zwei Tipps geben:

- Entferne so lange Daten aus der getStep3Data()-Funktion, bis der Server keine Exception mehr wirft (sondern Fehlermeldungen, das Daten fehlen).
- Frage beim Entwickler des Servers nach, ob er dir einen anständigen Exception-Grund liefern kann.
 
Hallo, mit den werten entfernen habe ich bereits ausprobiert. Wenn alle Werte die mit diesem genevo anfangen entfernt werden geht es, Problem ist hier dass die Berechnung dann nicht stattfinden kann. Bei dem Entwickler kann ich ebenfalls nich Nachfragen, dass würde viel zu lange dauern.
 
Müssen wirklich alle entfernt werden? Könnte man nicht vielleicht erstmal die leeren weg lassen? Könnte es sein, das du Zeichen überträgst, die von der Gegenseite missinterpretiert werden können, z.B. falsch encodierte Umlaute und dergleichen? Ich spreche auf den Teil an, bei dem du dem Server mitteilst, das UTF-8-Strings kommen. Sind das dann auch tatsächlich Strings mit UTF-8-Zeichen statt ISO? Datenbank-Zugriff evtl. nicht Unicode? Datenbank-Inhalte selbst nicht Unicode?

Wenn du seit Donnerstag dran bist, hättest du auch schon den Entwickler anschreiben können, das sehe ich nicht als schlüssiges Argument ;) Ich kann mir schon denken, warum du ihn nicht anschreiben willst. ;)
 
;)
Ich habe alle Parameter einzeln eingebaut, wenn nur ein einziger, egal welcher, drin ist kommt die Exception zurück. UTF-8-Paramenter werden keine übergeben, also es ist nichts davon UTF-8. ich habe ja den Traffic zu der Seite mit Firebug(Bzw. den von Google Chrome) analysiert, da gebe ich genau die Parameter die auch bei einem normalen Aufruf gemacht werden.
 
Hmm. Dann gehen mir so langsam die Ideen aus. Eine habe ich noch: Besteht die Möglichkeit, das du in deinem CURL-Beispiel bestimmte Header nicht mit sendest, die Firefox oder Chrome jedoch senden? Sowas wie "AcceptEncoding" oder dergleichen?

Ich gebe zu, ich rate nur rum. Aber nur deshalb, weil ich struts nicht kenne und die Exception so <ironie>gesprächig</ironie> ist.
 
Ich weiß nicht, habe nichts gefunden, was würdest du denn noch hinzufügen zu dem CURL-Array?
PHP:
        $curlHeader = 'Content-Type:application/x-www-form-urlencoded;charset=UTF-8';
        $curlAgent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2';

        $curlConfig = array(
            CURLOPT_USERAGENT => $curlAgent,
            CURLOPT_HEADER => $curlHeader,
            CURLOPT_FOLLOWLOCATION => false,
            CURLOPT_SSLVERSION => 3,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => 2,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_HEADER => 1,
            CURLOPT_COOKIEJAR => self::$cookiePath,
            CURLOPT_COOKIEFILE => self::$cookiePath,
            CURLOPT_HTTPHEADER => array($curlHeader),
            CURLOPT_VERBOSE => 1,
            CURLOPT_STDERR => $fileHandler,
        );
Die "$fileHandler" ist eine Instanz für den Loghandler, wie ich ja bereits immer geöffnet habe, also nicht wundern. Leider steht hier auch nichts brauchbares drin.
 
Nunja, diese Header hier sendet mein Firefox bspw. an die Seite, wenn ich sie von hier aus aufrufe:

Code:
GET /gm/de/versicherungen/auto/berechnen.html HTTP/1.1
Host: www.zurichconnect.ch
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT: 1
Connection: keep-alive
Referer: http://www.tutorials.de/php/383154-curl-zugriff-bringt-java-exception-beanutils.html
Cookie: usy46gabsosd=SAS__21197111_9161; SASDBID=3; SASuvt=21197111_1323684431296_21197111_1323684431296_1; WT_FPC=id=10.62.96.95-3491426880.30193845:lv=1323684433571:ss=1323684433571; ACOOKIE=C8ctADc5LjI0MC4xODMuMTAyLTM1Mzg2MTY4ODAuMzAxOTM4NDU6OkNDNQABAAAAAwAAAFTS5U5U0uVOAQAAAAEAAABU0uVOVNLlTgAAAAA-

Dieser DNT-Header ist nur der Do-not-track-Header, den kannst du ignorieren.

Was mir grad aber in deinem Code aufgefallen ist:

$ch = curl_init('https://www.zurichconnect.ch/zuritel/genevaOfferMF60.do?command=Step3&commandvalue=null&ts=' . microtime(true));

Ist das richtig und gewollt, das du als commandvalue immer "null" übergibst?
 
Zurück