Hamburger SV TicketCrawler

Hehe, das sieht ja genauso aus, wie man es auf jeden Fall verarbeiten kann!
Also es soll letztendlich Als Überschrift die Spielpaarung ausgegeben werden und daraunter als Link die einzelnen Plätze. Aber nicht als ganzen Link sondern als Name des Platzes hinterlegt mit dem Link zu den Karten. Das hatte ich aber auch schon soweit mal umgesetzt.
Alles dann in eine Variable hintereinander, wie du es dann auch in deiner Tabelle hast, sodass ich diese Variable als Ganzes in eine HTML Box schreiben kann.
Wenn das klappt, wollte ich das Script so umbauen, dass es die ganzen Variablen und Instanzen automatisch beim Ausführen installiert. Eben für andere die Installation leicht machen.
Habe da noch 1-2 Ideen, aber das würd ich auf jeden Fall alles selbst versuchen. Selbst das Ausgeben in HTML würd ich dann auch mal testen :wink: Ich hatte nur immense Probleme ein sauberes Array zu bekommen. Du kannst das ja alles mit Links als Pro :slight_smile:

Danke für die Blumen, aber von „Pro“ bin ich noch weiiiiiiiiiit entfernt :frowning: Ich fummel mir das auch immer nur alles irgendwie zusammen. Ich weiß wo ich nach was suchen muss und meistens auch wie man es umsetzen kann, aber im Skript muss ich auch immer wieder testen und basteln…

Das Skript was ich aktuell habe macht alles von allein. Man kann sogar die Blöcke eintragen die man „beobachten“ will, dann wird alles ausgelesen, automatisch eine Variable erstellt und diese muss dann nur ins WebFront verlinkt werden und man sieht alle Spiele mit den verfügbaren Ticket-URLs.
Die Leute müssen also nur das Skript kopieren :wink:

Also du willst dann z.B. stehen haben in der HTMLBox ?!

HSV - VFB
22A // Reihe 4 // Platz 7 // 17,60€
22A // Reihe 4 // Platz 8 // 17,60€
22A // Reihe 4 // Platz 9 // 17,60€

…und da soll man jeweils drauf drücken können und dann kann man das Ticket bestellen? Oder reicht dir die Übersicht, wie aktuell im Array, dass man auf die Seite mit den verfügbaren Tickets kommt?

-Chris-

Hammer kann ich dazu nur sagen!

Also ich wollte für mich eh nur die Stehplätze auslesen. Da sind Plätze egal, da freie Platzwahl im Block und der Preis ist immer der Gleiche. Wenn aber andere auch daran interessiert sind :wink: dann macht es sicher sinn für Blöcke mit Sitzplätzen auch die Reihe und den Platz auszugeben. Der Preis denke ich ist „Spielerrei“ aber wenn es keinen Umstand macht, kann man das natürlich auch mit reinnehmen.
Mir reicht aber vom Aufbau für die A-Ränge

HSV - VFB
22A
23A
24A

Und durch Klicken auf den Block kommt man dann zu den ganze Karten.
Vielleicht ist es machbar die Anzahl der freien Plätze zu summieren und mit einzubauen?

HSV - VFB
22A // Frei: 12
23A // Frei: 2
24A // Frei: 10

Alles kein Problem, musst dich nur entscheiden :wink: :smiley:

Wenn du es so willst:

HSV - VFB
22A // 17,60€ // Frei: 12
23A // – // Frei: 0
24A // 17,60€ // Frei: 10

Und dann auf z.B.:

22A // 17,60€ // Frei: 12

…klicken und man kommt auf die Seite mit der verfügbaren Tickets.

Nur innerhalb der Tabelle verschiedene Links würde ich nicht machen. Also wenn direkt die Tabelle wie hier drüber und dann auf den Link klicken und man bekommt die Seite mit den Tickets angezeigt… Und nicht erst nur die Blöcke anzeigen und da dann drauf klicken und usw… Wird dann zu viel für das WebFront von der Übersicht usw…

Wie du willst :slight_smile: Entscheide dich > JETZT :smiley:

-Chris-

Ich meinte es genauso, wie du es im Beispiel hast.
Du klickst auf den Block uns kommst direkt zum Shop. Preis und freie Plätze finde ich super.
Kann man das für „nicht Stehplätze“ auch auf PLatz und Reihe erweitern? Alles was nicht 22A-27A ist sind Sitzplätze (ausgenommen noch ein Teil von 22C) Aber das sollte ersteinmal egal sein.

Wenn würde ich allgemein sagen „mit Platz und Reihe“ oder „ohne Platz“ Reihe…könnte man zwar auch trennen, macht es aber unnötig „kompliziert“ und die Tabelle sieht dann auch weniger übersichtlicher aus. Nur meine Meinung :slight_smile:

Außerdem > HALLOOOO > Alles andere als Stehplatz geht doch gar nicht?! :rolleyes: :stuck_out_tongue:

-Chris-

Nagut, dann eben nur Stehplatz und ohne Platz und Reihe :wink: ich geb dir ja auch absolut recht…alles andere ist Mist :cool:
Und zur Not fang ich selbst wieder an zu Basteln :smiley:

Erweitern ist ja jederzeit möglich :wink: Geht ja erstmal nur um eine gescheite Basis :slight_smile:

-Chris-

Die Ausgabe von meinem Skript sieht aktuell so aus (Farben kann sich jeder selbst machen wie er möchte):
hsvtickets_v1.jpg

…und wo willst du jetzt den Link? Soll man auf „Verfügbare Tickets: 22“ klicken können und dann kommt die Seite mit den Tickets? :slight_smile:

-Chris-

Mit Links sieht es dann so aus, Farben kann man auch einstellen. Ich hab erstmal alles weiß gemacht und beim Hover ist es blau.
Klickt man auf einen Link, dann öffnet sich die Ticket-Seite in einem neuen Tab.
hsvtickets_v2.jpg

Passt so? Noch was ändern? …?

Edit: Ich warte die ganze Zeit darauf, dass ein Block ausverkauft ist und die Anzahl der Tickets 0 ist. Ich will wissen, ob ich alles korrekt behandel und kein Fehler kommt, aber irgendwie will die letzten Tickets keiner :frowning:

-Chris-

Das sieht ja mal schon richtig gut aus. Denke in der Struktur und Aufbau, macht es mehr Sinn wenn man auf die verfuegbaren Tickets also die Zahl klickt.

Man klickt doch auf die verfügbaren Tickets und kommt dann auf den neuen Tab mit den Tickets… :confused:

Schau es dir einfach mal an, lerne daraus, wenn du was ändern willst änder es und wenn es mit 0 Tickets Probleme gibt, entweder selbst fixen oder Bescheid sagen, dann schau ich da nochmal nach…

Was ist zu tun?
> Einfach nur das Skript kopieren, bei sich einfügen, ausführen, HTMLBox-Variable ins WebFront verlinken, fertig :cool:

<?
/*********** HSV-Tickets auslesen **************/
/*   Script v1.0 by Bayaro
/*
/*  https://www.symcon.de/forum/threads/30551-Hamburger-SV-TicketCrawler 
/*
/*  Skript 1x ausführen und Variable + Timer werden automatisch erstellt.
/*  Die HTMLBox Variable dann einfach in euer WebFront verlinken.
/*
/*** KONFIGURATION *************************************************************/
$AktualisierungsIntervall = 60; // Tabelle wird alle X Minuten aktualisiert
$TabelleMitFarben = true; // Farbige Ausgabe der Ticket-Tabelle

//Array zum Definieren für welche Plätze die Tickets herausgefiltert werden sollen
$Platzwahl_AR[] = "22A";
$Platzwahl_AR[] = "23A";
$Platzwahl_AR[] = "24A";
$Platzwahl_AR[] = "25A";
$Platzwahl_AR[] = "26A";
$Platzwahl_AR[] = "27A";
/*******************************************************************************/


// Skript-Ausführungszeit erhöhen (je nachdem wie schnell die HSV Seite ist notwendig oder nicht)
ini_set("max_execution_time", 60);

// Timer setzen
IPS_SetScriptTimer($_IPS['SELF'], $AktualisierungsIntervall * 60);


// Spielbegegnungen - Ticket URLs ermitteln
$xpath1 = Webseite_DOM("https://ticketing.hsv.de/ticketboerse/default.php");
$content1 = $xpath1->query('.//td[@align="center"]/a/@href');
$i = 0;
foreach ($content1 as $entry01) {
  	$HSV_Ticket_AR[$i]["URL"] = $entry01->nodeValue;
   $i++;
}

// Spielgegner ermitteln
$content2 = $xpath1->query('.//td[@align="left"]/span');
$i = 0;
foreach ($content2 as $entry02) {
  	$HSV_Ticket_AR[$i]["Gegner"] = $entry02->nodeValue;
   $i++;
}

//Ticket URLs zu gewünschten Blöcken ermitteln
$x = 0;
for ($s=0; $s<count($HSV_Ticket_AR); $s++)
{
   $xpathSpieltag = Webseite_DOM($HSV_Ticket_AR[$s]["URL"]);
   $content = $xpathSpieltag->query('.//table[@id="spielserie"]/tbody/tr/td[1]');
	foreach ($content as $entry) {
	  	$Block = trim($entry->nodeValue);
	  	if (array_search($Block, $Platzwahl_AR) !== false)
	  	{
	     	$contentBlockauswahl = $xpathSpieltag->query('.//table[@id="spielserie"]/tbody/tr/td[2]/a/@href');
	     	foreach ($contentBlockauswahl as $entryX)
			{
				$BlockauswahlURL = $entryX->nodeValue;
				preg_match("|(block=$Block)|", $BlockauswahlURL, $BlockMatch);
				if (@array_key_exists("1", $BlockMatch) === true)
				{
               $HSV_Ticket_AR[$s]["TicketURLs"][$x]["Block"] = $Block;
               
					$HSV_Ticket_AR[$s]["TicketURLs"][$x]["URL"] = $entryX->nodeValue;
					$xpathBlock = Webseite_DOM($BlockauswahlURL);
					
					//Anzahl verfügbarer Tickets ermitteln
					$contentPlaetze = $xpathBlock->query('.//table[@id="spielserie"]/tbody/tr/td[1]');
					$Platzcount = 0;
					foreach ($contentPlaetze as $entryPlaetze)
					{
						$Platzcount++;
					}
					$HSV_Ticket_AR[$s]["TicketURLs"][$x]["AnzahlTickets"] = $Platzcount;
					
					//Preise verfügbarer Tickets ermitteln
					$contentPreise = $xpathBlock->query('.//table[@id="spielserie"]/tbody/tr/td[4]');
					foreach ($contentPreise as $entryPreis)
					{
						$HSV_Ticket_AR[$s]["TicketURLs"][$x]["Preis"] = $entryPreis->nodeValue;
					}
					
					$x++;
				}
	  		}
  		}
	}
}
//print_r($HSV_Ticket_AR);


// HTML CSS Style definieren (Tabelle, Schrift, Farben, ...)
if ($TabelleMitFarben == false) {
$HTML_CSS_Style = '';
}
else {
$HTML_CSS_Style = '<style type="text/css">
a:link {color:white; text-decoration:none}
a:visited {color:white; text-decoration:none}
a:active {color:white; text-decoration:none}
a:hover {color:blue; text-decoration:none}
.bt {border-collapse;border-spacing:0;}
.bt td {font-family:Arial, sans-serif;font-size:14px;padding:1px 10px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
.bt th {font-family:Arial, sans-serif;font-size:14px;font-weigth:normal;padding:1px 10px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
.bt .tb-match{font-size:12px;background-color:#000000;color:#FFFFFF;text-align:center}
.bt .tb-tickets{font-size:12px;background-color:#32CB00;color:#FFFFFF;text-align:center}
</style>';
}


// HTML Ausgabe generieren
$HTML = '<html>'.$HTML_CSS_Style;
$HTML .= '<table class="bt">';

for ($h=0; $h<count($HSV_Ticket_AR); $h++) {
   $HTML .= '<tr><th class="tb-match">Hamburger SV</th><th class="tb-match">vs.</th><th class="tb-match">'.$HSV_Ticket_AR[$h]["Gegner"].'</th></tr>';
   foreach ($HSV_Ticket_AR[$h]["TicketURLs"] as $TicketEntry)
   {
   	$HTML .= '<tr><th class="tb-tickets">Block: '.$TicketEntry["Block"].'</th><th class="tb-tickets">Preis: '.$TicketEntry["Preis"].'</th><th class="tb-tickets"><a href='.$TicketEntry["URL"].' target="_blank">Verfügbare Tickets: '.$TicketEntry["AnzahlTickets"].'</a></th></tr>';
   }
   $HTML .= '<tr><th>&nbsp</th><th>&nbsp</th><th>&nbsp</th></tr>';
}
$HTML .= '</table></html>';


// Variable erstellen, falls nicht vorhanden, und den Inhalt setzen
$HTMLBox_VarID = CreateVariableByName($_IPS['SELF'], "HSV-Tickets HTMLBox", 3, "~HTMLBox", "");
SetValue($HTMLBox_VarID, $HTML);



function Webseite_DOM($url) { 
	$curl = curl_init($url); 
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
	curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
	$page = curl_exec($curl);  

	if(curl_errno($curl)) // Error-Check
	{
	    echo 'Error: ' . curl_error($curl);
	    exit;
	}
	curl_close($curl);

	$DOM = new DOMDocument;


	libxml_use_internal_errors(true);

	if (!$DOM->loadHTML($page))
	    {
	        $errors="";
	        foreach (libxml_get_errors() as $error)  {
	            $errors.=$error->message."<br/>";
	        }
	        libxml_clear_errors();
	        print "libxml errors:<br>$errors";
	        return;
	    }
	$xpath = new DOMXPath($DOM);
	return $xpath;
}


function CreateVariableByName($ParentID, $VarName, $VarTyp, $VarProfile = "", $VarActionScript = "") {
    $VarID = @IPS_GetVariableIDByName($VarName, $ParentID);
   if($VarID === false) {
        $VarID = IPS_CreateVariable($VarTyp);
      IPS_SetParent($VarID, $ParentID);
      IPS_SetName($VarID, $VarName);
      IPS_SetInfo($VarID, "This variable was created by script #".$_IPS["SELF"]);
      if($VarProfile !== "") {
            IPS_SetVariableCustomProfile($VarID, $VarProfile);
        }
        if($VarActionScript !== "") {
            IPS_SetVariableCustomAction($VarID, $VarActionScript);
        }
    }
   return $VarID;
}
?>

Screenshot:
> siehe HIER

Grüße,
Chris

Vielen Dank dafür!!! Ich werde daraus definitiv was lernen. Schon gesehen, dass mein erster Aufbau einfach in die falsche Richtung lief…naja nächstes Projekt wird dann sicher schon besser :wink:

Ich erhalte noch bei dem Script den Fehler

 Error: SSL certificate problem: self signed certificate in certificate chain

. Denke das liegt an der https Seite und curl? Zertifikat imortieren bringt nichts, sofern das überhaupt eine Option ist :smiley:
Kannst mir damit nochmal helfen?

-----UPDATE—Fix myself???-----

habe den Code ergänzt um

	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);

ergänzt. Sieht nun so aus…

function Webseite_DOM($url) {
    $curl = curl_init($url);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
    $page = curl_exec($curl);

Ist das sinnvoll das auszuschalten und wieso klappte es bei dir auch anders?

Keine Ahnung, warum der bei mir nicht meckert :confused: Vlt. Abhängig vom OS oder keine Ahnung…

Ich bau das SSL nicht prüfen noch mit ein…

-Chris-

So habe den ersten Eintrag mal editiert und das Script mit angefügt. Habe noch paar Kleinigkeiten verändert :wink:

Hier gehts zum Script!

Das blau war mir klar :smiley: :smiley:

Auf gleicher Ebene finde ich doof/unschlau…aber deine Sache. Das Argument „sieht im WebFront besser aus“ zählt nicht. Weil diese Skripte/Variablen nicht direkt im WebFront Ordner sein sollen, sondern Variablen/Skripte/… immer nur in die jeweiligen WebFronts VERLINKT werden sollen!
Links verwenden — IP-Symcon :: Automatisierungssoftware

Hat man nur 1 WebFront, ist es nur wegen der Übersichtlichkeit. Sobald man aber 2 oder mehr WebFronts hat, dann muss man sowieso mit Links anfangen und dann wird es irgendwann mehr als Banane :wink:

Ebenfalls kann man, falls notwendig, Skripte, Variablen, … „nicht anzeigen“ im WebFront (Objekt bearbeiten) :wink:

Deshalb einen Ordner „Skripte“ im „Root“, da drin Unterordner mit Skripten und Variablen. Dann einen Ordner „WebFront“ im „Root“ und darunter dann z.B. die Ordner „Mobile“ und „WebFront_Max“, da drunter dann Unterordner, DummyInstanzen, Links zu Variablen & Co.

Macht es von Anfang an so, spart ihr euch später -wenn ihr es eingesehen habt- :smiley: …das Umbauen :wink:

Und bitte aus dem Skript auf Seite 1 das „echo $HTML“ entfernen. Müllt einem sonst das Log voll…

Grüße,
Chris