Hilfe für Abfrage Wunschkennzeichen gesucht

Hi zusammen,

da ich aktuell mein Auto verkauft und es vorher nicht abgemeldet habe, warte ich jetzt darauf das mein Kennzeichen wieder frei wird.
Ich kann das auf der Seite vom Landkreis abfragen, aber um das Ganze zu vereinfachen hatte ich überlegt das von IPS ausführen zu lassen und mich bei Bedarf dann informieren zu lassen.

http://www.lk-nienburg.de/internet/index.php?/internet/page.php?typ=2&site=272&portal=

Das wäre die Seite dann etwas weiter unten ist ein Link, bei dem dann per Javascript ein Popup auf geht in dem dann die eigentliche Abfrage statt findet.

Besteht eine Möglichkeit die Abfrage von IPS ausführen zu lassen bzw. wie könnte ich das umsetzen?

Gruß
Jens

ganz grob:

der Seitenquelltext vom geöffneten PopUp-Fenster enthält folgendes:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Application: Wunschkennzeichen -->
<!-- Page: Suchen -->
<!-- Generated: Thu Jan 31 17:30:02 CET 2013 -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content="Tapestry Application Framework, version 3.0.4"/>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<title>Wunschkennzeichen</title>
<meta name="copyright" content="(c) KDO"/>
<meta name="robots" content="Index,Follow"/>
<meta name="viewport" content="width = device-width"/>
<!--[if lt IE 8]> <link href="/wuakz/css/ie67.css" rel="stylesheet" type="text/css"> <![endif]-->
<link rel="stylesheet" type="text/css" href="/wuakz/css/wuakzmain.css"/>
</head>
<body>

<div id="content">
<h1>Kfz-Wunschkennzeichen</h1>
<form method="post" name="Form0" action="/wuakz/app" style="display: inline; margin: 0;">
<input type="hidden" name="service" value="direct/1/Suchen/border.$Form"/>
<input type="hidden" name="sp" value="S0"/>
<input type="hidden" name="Form0" value="$RadioGroup,$RadioGroup$2,$Checkbox,inputBuchstaben,inputZiffern,$FormConditional,$FormConditional$0,$FormConditional$1,$ImageSubmit,$FormConditional$2"/>
<input type="hidden" name="$FormConditional" value="F"/>
<input type="hidden" name="$FormConditional$0" value="T"/>
<input type="hidden" name="$FormConditional$1" value="T"/>
<input type="hidden" name="$FormConditional$2" value="F"/>

<ul class="basictab">
 
<li class="selected">
<a href="/wuakz/app?service=page/Suchen">SUCHEN</a>
</li>
 
 

<li class="disabled"><span>AUSWAHL</span></li>
 
 

<li class="disabled"><span>RESERVIEREN</span></li>
 
 

<li class="disabled"><span>AUSDRUCK</span></li>
 
</ul>
<div id="suchoptionen">
<div id = "fztyp">

 <input type="radio" name="$RadioGroup" checked="checked" value="0" alt="PKW/LKW"/> PKW/LKW <br/>
<input type="radio" name="$RadioGroup" value="1" alt="Motorrad"/> Motorrad
</div>
<div id="privathaendler">


 <input type="radio" name="$RadioGroup$2" checked="checked" value="0" alt="Privatperson"/> Privatperson 
</div>
</div>
<div id="historie">

<input type="checkbox" name="$Checkbox" alt="Saison- u. Historienkennzeichen"/> Saison- u. Historienkennzeichen
</div>

<!-- AKZ -->

<div id="akzinput">
<img src="pictures/akz_left.gif" alt="AKZ"/><img src="pictures/N.gif" alt="N"></img><img src="pictures/I.gif" alt="I"></img><img src="pictures/akz_plakette.gif" alt="Plakette"/>
<input type="text" name="inputBuchstaben" value="" class="inp_ort" maxlength="2" alt="AKZ-Buchstaben"/>
<input type="text" name="inputZiffern" value="" class="inp_ziffern" maxlength="4" alt="AKZ-Ziffern"/>
</div>
<br class="clear" />
   
<h3>Bitte beachten Sie:</h3>
<ul id="kommentar">
<li>Als Platzhalter für ein einzelnes Zeichen bitte ? eingeben.</li>
<li>Als Platzhalter für mehrere beliebige Zeichen bitte * eingeben.</li>
<li>Buchstaben werden in Groß- und Kleinschreibung akzeptiert</li>
<li>Beispiel: Mit A* 12? werden alle Kennzeichen gesucht, die mit A beginnen und eine dreistellige Ziffer mit 12 beginnend enthalten</li>
<li>Weitere Informationen können Sie über den Info Button erhalten</li>
</ul>
<!-- Fusszeile -->
<div id="navi">

 <span id="zurueck"> </span>

<a href="/wuakz/app?service=direct/1/Suchen/border.$PopupWindow" target="Ausdruck" onclick="javascript:window.open('',this.target,'width=600,height=480,location=no,menubar=no,toolbar=no,directories=no,status=no,scrollbars=yes,resizable=yes')" id="info"><img src="/wuakz/pictures/rahmen_info.gif" border="0" alt="Info"/></a>
 <span id="letzter">
<input type="image" name="$ImageSubmit" src="/wuakz/pictures/rahmen_weiter.gif" alt="Weiter" align="right"/> </span>
</div>
</form>
</div>
<div id="footer">
wuakz - 1.4.46, (c) Kommunale Datenverarbeitung Oldenburg
</div>
</body>
</html>
<!-- Render time: ~ 1 ms -->



das schickt einen POST an /wuakz/app

bau dir für curl (ich glaube mit --data) einen String zusammen, der alle INPUT Felder (inkl. Hidden-Fields) enthält und die richtigen Inhalte enthält.

Das Ergebnis ist eine HTML Seite die Dir normalerweise im Browser angezeigt würde …

Sorry, aber für ausführlichere Erklärungen reicht die Zeit gerade einfach nicht :frowning:

Wenn Du nicht weiter kommst, kann ich Dir mal ein Beispiel aus meinem Fundus suchen …

CURL kannst Du direkt mir PHP eigene Befehlen aufrufen. php_curl oder so ähnlich. Das kann POST Daten wegschicken und gibt Dir die HTML vom Server zurück …

Dat ist jo mo ene ausführlicher Erklärung wo jeder Wat mit anfangen kann

Tja … das hab ich mir auch gedacht :confused:

Die Suchseite für unseren Landkreis ist auf jeden Fall diese hier: https://apps.kdo.de/wuakz/app?kdnr=4000
Die Frage ist jetzt nur, welche Infos müssen mit übergeben werden … da blicke ich noch nicht ganz durch.

Das hier scheinen die benötigten Felder zu sein:

Ich glaube so etwas ähnliches habe ich schon mal gemacht, aber das ist zu lange her das ich noch nachvollziehen könnte wie … ich blicke aktuell auch noch nicht ganz, welches jetzt tatsächlich die richtige URL ist, an die die Daten gesendet werden müssen.

Gruß
Jens

So ungefähr?

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://apps.kdo.de/wuakz/app?kdnr=4000');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST,TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, ????);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$ergebnis = curl_exec($ch);
curl_close($ch);

print_R($ergebnis);

Bei Postfields müssten dann die Daten rein ?

Gruß
Jens

Die URL führt ja eigentlich nach
https://apps.kdo.de/wuakz/app?service=page/Suchen

und bei den Feldern würde ich mal mit Folgenden anfangen :wink:
$RadioGroup=0
$RadioGroup$2=0
inputBuchstaben=AA
inputZiffern=1234

Firebug wirkt bei solchen Analysen Wunder ;).

Und für cURL dann ‚para1=val1&para2=val2&…‘

Hallo Ralf,

so ähnlich hab ich mir das ja auch gedacht, nur irgendwie passt das mit der URL noch nicht. Diese Abfrage gibt es für mehrere Kreise und irgendwie muss da die kdnr mit rein, weil die Landkreiskennung scheinbar vorgegeben ist !? Oder sehe ich das falsch?

Dann nimm doch einfach alle Hidden-Felder mit rein:


<input type="hidden" value="direct/1/Suchen/border.$Form" name="service">
<input type="hidden" value="S0" name="sp">
<input type="hidden" value="$RadioGroup,$RadioGroup$2,$Checkbox,inputBuchstaben,inputZiffern,$FormConditional,$FormConditional$0,$FormConditional$1,$ImageSubmit,$FormConditional$2" name="Form0">
<input type="hidden" value="F" name="$FormConditional">
<input type="hidden" value="T" name="$FormConditional$0">
<input type="hidden" value="T" name="$FormConditional$1">
<input type="hidden" value="F" name="$FormConditional$2">

Hab grad keine Zeit für ne ausgiebige Analyse und kenn mich auch mit curl nicht aus aber grundsätzlich hat ralf schon mal recht. Die vorgehensweise bei solchen „Hacks“ ist eigentlich immer gleich.

[ol]
[li]die Methode feststellen: GET oder POST[/li][li]Den Referer heraus finden. Der steht eben nicht in der Adresszeile. Dort steht nämlich immer die Adresse, die du grade siehst und das ist in der Regel ja nicht das was du wissen willst. (der von Ralf stimmt schon)[/li][li]Das Formular, dass die Seite erwartet muss möglichst exakt nachgeamt werden. Dazu gehören auch Hidden Felder und die, die dich eigentlich nicht interessieren. [/li][li]Manchmal muss man noch den UserAgent faken damit die Seiten einen für nen Standard-Browser halten.[/li][/ol]

Mehr ist das ansich auch nicht.

Toni

Das mit den hidden Feldern (sprich alle) sehe ich auch so … aber es fehlt immer noch die Landkreiskennung.

Wenn man hier: Wunschkennzeichen? nachguckt, dann gibt es mehrere Kreise und bei allen sehen die Felder gleich aus (incl. service=page/Suchen ). Daher kann das noch nicht alles sein.

Das hier ist dazu noch zu finden …

<div id="akzinput">
<img src="pictures/akz_left.gif" alt="AKZ"><img src="pictures/N.gif" alt="N"><img src="pictures/I.gif" alt="I"><img src="pictures/akz_plakette.gif" alt="Plakette">
<input type="text" name="inputBuchstaben" value="J?" class="inp_ort" maxlength="2" alt="AKZ-Buchstaben">
<input type="text" name="inputZiffern" value="*" class="inp_ziffern" maxlength="4" alt="AKZ-Ziffern">
</div>

Da sehe ich als Input nur Buchstaben + Ziffern … die LK Kennung wird zwar als gif dargestellt, aber wie wird die in die Suche übergeben?

Gruß
Jens

Das geht über ein cookie

hier mal alles auf einen Blick:

Edit:

Hier noch ein paar Infos zu curl und Cookies

Toni

wenn Du beim Kunden für mich arbeitest, mein Haus umbaust, auf mein Kind aufpasst, meine restlichen TODOs erledigst und mir damit mehr Zeit schenkst, schreibe ich euch ein komplette Tutorial! mit Beispielssript und allem drum und dran! :wink:

normalerweise sollte man immer alle Parameter mitschicken, die auch im Formular waren. Also alle selbst ausgefüllten Input-Felder und alle Hidden-Fields. Ansonsten kann man sich halt nicht sicher sein, dass nicht ein Fehler vom Server zurückkommt.

Firebug, wie schon erwähnt, kann da sehr gut helfen.

Ich habe mal einen curl Befehl von mir aus den tiefen gesucht, der auch cookies abspeichert und bei einem zweiten Aufruf wieder auslesen kann.


$quite      = ' 2>&1';
$url = "http://www.abc.de";
$curl = 'curl --cookie "'. $cookieFile .'" --cookie-jar "'. $cookieFile .'" --user-agent "Mozilla/4.0" ';
$registerCommand = $curl . "--data \"PHPSESSID=". $sessionID ."&loginname=abc&action=login&enterpass=true&passwort=susu\" ";
$registerCommand .= "'" . $url ."/'". $quite;

$registerSite = `$registerCommand`;
if ($debugLevel['register'] >= 2) {
	echo "folgender REGISTER Befehl wurde abgeschickt: 
". $registerCommand ."

";
	}
echo $registerSite;


Gruß,

ernie

Also hier mit komme ich schon mal so weit, das ich ein Cookie setzen und auch die SessionID auslesen kann.
Allerdings hängt hinten noch ein ? dran … :frowning:

Und wie gehts dann weiter? :confused:

$ergebnis = get_url("https://apps.kdo.de/wuakz/app?kdnr=4000");
$SessionID = $ergebnis[1]['url'];
//echo $SessionID;

$start = "jsessionid=";
$ende = "?service";

$SessionID = preg_match('/'.$start.'\s*(.*?)\s*'.$ende.'/s',$SessionID,$treffer);
print_r ($treffer[1]);





//print_R($ergebnis);




function get_url( $url,  $javascript_loop = 0, $timeout = 5 )
{
    $url = str_replace( "&", "&", urldecode(trim($url)) );

    $cookie = tempnam ("/tmp", "CURLCOOKIE");
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt( $ch, CURLOPT_ENCODING, "" );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );    # required for https urls
    curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
    curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
    curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 );
    $content = curl_exec( $ch );
    $response = curl_getinfo( $ch );
    curl_close ( $ch );

    if ($response['http_code'] == 301 || $response['http_code'] == 302)
    {
        ini_set("user_agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1");

        if ( $headers = get_headers($response['url']) )
        {
            foreach( $headers as $value )
            {
                if ( substr( strtolower($value), 0, 9 ) == "location:" )
                    return get_url( trim( substr( $value, 9, strlen($value) ) ) );
            }
        }
    }

    if (    ( preg_match("/>[[:space:]]+window\.location\.replace\('(.*)'\)/i", $content, $value) || preg_match("/>[[:space:]]+window\.location\=\"(.*)\"/i", $content, $value) ) &&
            $javascript_loop < 5
    )
    {
        return get_url( $value[1], $javascript_loop+1 );
    }
    else
    {
        return array( $content, $response );
    }
}

also in einem html String ist ein ? nur einmal erlaubt, als Trennung zwischen aufgerufenem Dateiname und beginn von den Parametern

das steht bei Dir zwischen app?kdnr=4000

wenn das zweite ? auch im URL String steht, gehört es glaube ich da nicht mehr hin

Alle Argumente hinter dem ? müssen mit & voneinander getrennt werden …

Was passiert, wenn Du es weglässt?

Mir gehts nicht zwangsläufig um das Fragezeichen, sondern was ich jetzt mit der bekannten SessionID anfange … ich müsste ja nun irgendwie eine 2. Curl Prozedur benutzen, oder geht das alles in der einen ??

Hmmm …

Es scheint jetzt übertragen zu werden, aber irgendwie klappt das mit dem Cookie noch nicht :frowning:

edit

HTTP/1.1 200 OK
Date: Sun, 03 Feb 2013 01:25:37 GMT
Server: Apache/2.2.16 (EL)
P3P: CP= CAO PSA OUR
Cache-Control: no-cache
Set-Cookie: JSESSIONID=0194060CC65AD648ADDDB4F0FBDAD747; Path=/wuakz; Secure
Content-Length: 778
Connection: close
Content-Type: text/html;charset=UTF-8

Timeout

Session Timeout

Sie haben über einen längeren Zeitraum keine Eingaben gemacht.
Das Wunschkennzeichen beendet Ihre Session dann automatisch
und Sie müssen sie nochmal neu starten, um ein Kennzeichen zu
reservieren.

Neustart des Wunschkennzeichens

Letzte Version, manuell die Session ID eingebaut und auch ein Ergebnis bekommen.
Stelle sich jetzt die Frage wie ich die ID „automatisch“ rein bekomme!?

$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
curl_setopt($ch, CURLOPT_URL, 'https://apps.kdo.de:443/wuakz/app;jsessionid=DC00A74EA241C1DA1157EC1132ED7654?service=page/Auswahl');
curl_setopt($ch, CURLOPT_POST, 1);
//curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieURL);
//curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieURL);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'service=direct/1/Suchen/border.$Form&sp=S0&Form0=$RadioGroup,$RadioGroup$2,$Checkbox,inputBuchstaben,inputZiffern,$FormConditional,$FormConditional$0,$FormConditional$1,$ImageSubmit,$FormConditional$2&$RadioGroup=0&$RadioGroup$2=0&inputBuchstaben=JH&inputZiffern=*');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$ergebnis1 = curl_exec($ch);

/*
if($ergebnis1=curl_exec($ch) === false)
{
    echo 'Curl-Fehler: ' . curl_error($ch);
}
else
{
    echo 'Operation ohne Fehler vollständig ausgeführt'."
";
   
}

*/


echo $ergebnis1;

curl_close($ch);

Gruß
Jens

Dann führe ich den Monolog hier mal weiter …

Das hier funktinoiert jetzt, aber ich habe jetzt schon vieles versucht (str_replace, trim, strip_tags usw.)
Was muss ich tun um die ersten gefundenen Kennzeichen der Ausgabe auszuwerten?
Egal was ich mache, ich habe immer noch Haufenweise Leerzeichen oder Zeilenumbrüche im Ergebnis.
Habt ihr eine Idee dazu?

 <?php

$startseite="https://apps.kdo.de/wuakz/app?kdnr=4000";
$cookie = tempnam ("/tmp", "CURLCOOKIE");

//cookie holen, in $cookie speichern
$ch = curl_init ($startseite);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt($ch, CURLOPT_REFERER, "https://apps.kdo.de/wuakz/app?");
//curl_exec ($ch);
//ausführen
$content = curl_exec ($ch);
//Info
$response = curl_getinfo( $ch );
//Pfad extrahieren
$pfad = str_replace("Suchen","Auswahl",$response['redirect_url']);
//echo $pfad;


//POST-Daten setzen
$post[] = urlencode('service').'='.urlencode('direct/1/Suchen/border.$Form');
$post[] = urlencode('sp').'='.urlencode('S0');
$post[] = urlencode('Form0').'='.urlencode('$RadioGroup,$RadioGroup$2,$Checkbox,inputBuchstaben,inputZiffern,$FormConditional,$FormConditional$0,$FormConditional$1,$ImageSubmit,$FormConditional$2');
$post[] = urlencode('$FormConditional').'='.urlencode('F');
$post[] = urlencode('$FormConditional$0').'='.urlencode('T');
$post[] = urlencode('$FormConditional$1').'='.urlencode('T');
$post[] = urlencode('$FormConditional$2').'='.urlencode('F');
$post[] = urlencode('$RadioGroup').'='.urlencode('0');
$post[] = urlencode('$RadioGroup$2').'='.urlencode('0');
$post[] = urlencode('$ImageSubmit.x').'='.urlencode('35');
$post[] = urlencode('$ImageSubmit.y').'='.urlencode('14');
$post[] = urlencode('inputBuchstaben').'='.urlencode('JJ');
$post[] = urlencode('inputZiffern').'='.urlencode('*');
$post = implode('&', $post);
//echo $post;

//Suchanfrage abschicken
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
curl_setopt($ch, CURLOPT_URL, 'https://apps.kdo.de/wuakz/app?');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$ergebnis = curl_exec ($ch);
//echo $ergebnis;

//Ergebnis abrufen
$auswahl = "https://apps.kdo.de/wuakz/app?service=page/Auswahl";
$ch = curl_init ($auswahl);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
$output = curl_exec ($ch);
echo $output;

?>

Gruß
Jens

ich will versuchen Dir zu helfen, habe ich leider zu wenig Zeit um mit dem Script zu spielen und es bei mir einzubauen. Poste mal bitte, was Du als String von wo auch immer bekommst und was Du darauf extrahieren willst. Dann findet sich sicherlich ein regulärer Ausdruck, der es extrahiert.

Oder hab’ ich es falsch verstanden?

chop() und trim() ist Dir bekannt? Hilft aber nur um unsichtbare Zeichen am Anfang und Ende eines Strings weg zu parsen …

Hi Ernie,

trim() kannte ich , hat aber nix geholfen … chop() war mir nicht geläufig
Und danke für dein Angebot , trotz deiner knappen Zeit helfen zu wollen … aber das Problem ist jetzt mit DOMDocument() gelöst.

Gruß
Jens