[Script] TXT-Datei auslesen und dann URL ausführen!

Sway2005

Cadet 3rd Year
Registriert
Apr. 2006
Beiträge
48
Hallo!

Ich bin Internetradiomoderator und will über die Funktion "Title Streaming" Informationen an den Webserver senden. Keine Angst, ihr müsst euch nicht mit der Shoutcast-Technik auskennen - ich erkläre euch das alles hier. Mein Ziel: Ich brauche ein Programm, was diesen Weg, den ich im folgenen beschreiben werde, umsetzt.

Mit einem Programm wird der Titel, den ich gerade spiele in einer TXT-Datei gespeichert - z.B. Abba - Dancing Queen. Mit der URL http://localhost:8000/admin.cgi?pass=passwort&mode=updinfo&song=ABBA - Dancing Queen kann man manuell diesen Titel per Hand in eine Adresse eingeben und updaten. Das ist natürlich sehr unaktuell und zeitraubend. Daher habe ich die Datei soundso.txt mit den Informationen:

Code:
Abba - Dancing Queen

Dieser entspricht dem aktuellen Titel. Da die oben genannte URL am Anfang ja immer gleich ist, muss ich im Prinzip folgenen Weg gehen. Der Titel wird ausgelesen, Sonderzeichen werden in Hexform umgewandelt (z.B. Leerzeichen in %20) und dann wird das mit der ganzen Adresse ausgeführt. Dann, z.B. 5 Sekunden später, ließt er es wieder aus und dann vergleicht er aber. Wenn der Titel dann immer noch der gleiche ist, dann passiert nix, wenn er neu ist wird wieder der hochgeladen. Also im Prinzip ein Script, was im Hintergrund arbeitet.

Das muss ich realisiert kriegen. Weiß jemand wie das technisch funktioniert? Ich würde mich freuen, wenn jemand den Quellcode schreiben könnte. Hinweis: Der Server mit dem ich sende liegt natürlich nicht auf dem localhost sondern im Internet.

Sollten Fragen aufkommen, bitte stellen.

Danke,
David
 
Kannst du zufällig C++? Ich würde das ganze (weil ich nunmal so gerne C++ schreibe ;) ) über Sockets lösen.
Ich hab hier sogar grad fertigen Code für ein solches Vorhaben:
Code:
/*
* Erstellt einen Socket zum Server und returnt diesen
* -1 bei Misserfolg
*/
SOCKET createSocket(string server)
{
	WSADATA wsa;
	if (WSAStartup(MAKEWORD(1, 1), &wsa))
	{
		return -1;
	}

	SOCKET sSocket=socket(AF_INET,SOCK_STREAM,0);
	if(sSocket==-1)
	{
		return -1;
	}

	struct hostent* host=gethostbyname(server.c_str());
	
	struct sockaddr_in addr;
	addr.sin_addr = *(struct in_addr*) host->h_addr;;
	addr.sin_port = htons(80);
	addr.sin_family = AF_INET;

	if (connect(sSocket,(const struct sockaddr*) &addr, sizeof(addr)) == -1)
	{
		return -1;
	}
	return sSocket;
}
//createSocket


/*
* sendet Klartext-Requests an einen mit createSocket erstellten Socket.
* return die Antwort oder "" wenn ein Fehler auftrat
*/
string sendRequest(SOCKET sSocket,const char request[])
{
    if (send(sSocket, request, strlen(request), 0) == -1)
	{
		return "";
	}
	const int BUFFER_SIZE = 1024;
	int recv_length=1023;
	string response="";
	while(recv_length>0)
	{
		char buffer[BUFFER_SIZE];
		recv_length=recv(sSocket, buffer, sizeof(buffer) - 1, 0);
		if (recv_length == -1)
		{
			return "";
		}
		buffer[recv_length]='\0';
		response+=buffer;
	}
	return response;
}
//sendRequest
Falls hier grobe Fehler zu finden sein sollte weist mich doch bitte darauf hin!

Das ganze ließe sich dann sehr einfach verwenden:
Code:
int main()
{
    string servername="localhost";
    while(true)
    {
     string song="";
     //song aus der datei auslesen
     //falls kein song in der datei steht -> "Nothing" oder sowas senden
     string  headers = "GET http://localhost:8000/admin.cgi?pass=passwort&mode=updinfo&song="+song+" HTTP/1.1\r\n";
			headers+= "Host: "+servername+"\r\n";
			headers+= "Accept: text/*\r\n";
			headers+= "User-Agent: BlaBla\r\n";
			headers+= "Connection: close\r\n\r\n";
			
	SOCKET s=createSocket(servername);
	if(s==-1)
	{
		//Fehlermeldung
		return false;
	}

	string buffer=sendRequest(s,headers.c_str());
	if(buffer=="")
	{
		//Fehlermeldung
		return false;
	}
	closesocket(s);
        Sleep(5000);
        }
        return 0;
}

Um ehrlich zu sein, glaube ich nicht dass du damit jetzt viel anfangen kannst oder?

Aber ansonsten müsste das doch im groben so funktionieren, oder irre ich mich da?

Betrachtet meinen Post einfach als denkanstoß :)
 
Zuletzt bearbeitet:
Hallo!

Vielen Dank für die großen Mühen, die du dir gemacht hast. Leider hast du Recht, ich kann damit leider nicht viel anfangen. Wo muss man was wie abspeichern und was wie ausführen? Ich bin wirklich in Sachen Programmierung ein absoluter Anfänger und behersche gerade mal HTML und ein ganz bisschen PHP. Könntest du mir vielleicht sagen, wie man das jetzt wo wie einbindet?

Danke vielmals!
David
 
C++ ist eine so genannte "Compiler-Sprache". Das heißt, dass der Code erst durch ein anderes Programm - den Compiler - in Maschinencode übersetzt werden muss, damit man ihn ausführen kann.
Wenn man den oben geposteten Code in eine Datei sender.cpp packen würde, und diese Datei compilieren würde, erhielte man eine Ausgabedatei - zB sender.exe -, die direkt ausführbar ist.

Allerdings habe ich den oben geposteten Code mal eben kurz hier reingeschrieben (mal abgesehen von den 2 Funktionen) und bin mir nicht so richtig sicher ob er so funktioniert.

Gerade das für das Umwandeln der Sonderzeichen ist mir bisher keine großartig geniale Methode in den Sinn gekommen...
Deswegen habe ich meinen Post auch nur als Denkanstoß bezeichnet. Es ist noch viel zu tun und zu optimieren, aber das müssen erstmal andere machen, weil ich seit gestern Morgen 7 Uhr wach bin und heute abend wohl nicht mehr allzuviel auf die Reihe kriege :)
Aber hier sind eigentlich ja genug Leute, die das können sollten.


EDIT: Ach was ich total übersehen habe: Willkommen im Forum! :)
 
Zuletzt bearbeitet:
Hallo!

Vielen Dank. Naja, ich verstehe bei dem allen nur Bahnhof, deswegen ist der Denkanstoß bei mir auch nur bedingt *g*. Ich brauche das Programm ja auch nicht heute oder morgen. Kannst ja mal gucken, ob du die Tage noch was optimieren kann / willst :)

Danke,
David
 
also in Perl (unter Windows) würd ich das ganze wie folgt lösen:

Code:
#!/perl/bin/perl
# Datei:    songupdate.pl
# Aufruf:   perl songupdate.pl quelldatei.txt zielurl
# Beispiel: perl songupdate.pl song.txt http://localhost:8080?song=
use HTTP::Request;
use HTTP::Response;
use LWP::UserAgent;
($file,$url,$|)=(shift,shift,1);
my $title;
while(1)
{
    if(defined(open DATEI, $file))
    {
      my $ctitle=<DATEI>;
      close DATEI;
      if($title ne $ctitle)
      {
          $title=$ctitle;
          $ctitle=~s/(\W)/"%".unpack("H*",$&)/ge;
          my $request = HTTP::Request->new(GET => $url.$ctitle);
          my $ua = LWP::UserAgent->new;
          my $response = $ua->request($request);
          if (!$response->is_success)
          {
            print STDERR $response->status_line, "\n";
          }
          else
          {
            print "\n[".localtime(time())."] Update erfolgreich zu \"$title\"\n";
          }
      }
      else
      {
        print ".";
      }
    }
    else
    {
      print STDERR $!, "\n";
    }
    sleep(5);
}

Du übergibst als Parameter die Datei, aus der der aktuelle Song gelesen werden kann und die URL, die (erweitert um den "verschlüsselten" Songtitel) aufgerufen werden soll.

Die von dir genannte Wartezeit von 5 Sekunden hab ich jetzt mal fest eingestellt. Falls irgendwas ned klappt, bekommste ne Fehlermeldung, die das Programm aber nicht abbricht. Sonst gäbe es evtl Probleme, wenn das Script versucht die Datei zu lesen, die dein anderes Programm grade (über-)schreibt.

Ansonsten wird für jeden "wartenden" Schleifendurchlauf ein Punkt ausgegeben, damit du siehst, dass das Script noch läuft.

Falls du ne genaue Erklärung brauchst, musste bescheid sagen. Achja, das Perl für Windows findest du unter http://activestate.com/Products/ActivePerl/

Viel Spaß damit o.o
 
Hallo!

Vielen Dank! Active Perl habe ich installiert und ich weiß auch mittlerweile, dass man Perl-Scripte unter .pl abspeichert. Jetzt habe ich die Datei abgespeichert. Wie rufe ich sie dann auf? Mit CMD? Wo gebe ich das Passwort des Servers ein?

Danke,
David
 
Aufrufen des Scripts:

1. Möglichkeit
- Unter C:/Perl/bin/ findest du eine Perl.exe.
- Erstell dir eine Verknüpfung mit dieser Datei.
- Geb für diese Verknüpfung als ersten Parameter die *.pl Datei (Script) an.
- Alle folgenden Parameter sind die, die du an das Script übergeben willst. IN deinem Fall Textdatei und URL.

2. Möglichkeit
- In der Kommandozeile (cmd) einfach "perl script.pl Parameter" aufrufen.

3. Möglichkeit (ohne Parameter)
- Rechtsklick auf die *.pl Datei und bei "Öffnen mit" die "Perl.exe" wählen.


Das Passwort machst du mit in den Parameter "URL". Das könnte dann beispielsweise so aussehen:
"perl songupdate.pl songname.txt http://localhost:8080/song.php?user=admin&password=pass&song="

An deine angegebene URL hängt das Script einfach den ermittelten Songtitel an und versucht die entsprechende URL aufzurufen.
 
Noch eine Frage. Wenn ich songname.txt schreibe. Liegt die Datei dann im PERL-Verzeichnis oder im Verzeichnis, wo auch das Script liegt? Wie gehe ich unter oder Überordner an?

Danke!
 
du kannst die Datei absolut angeben also mit C:/Programme/song.txt

Ansonsten müsstest du testen aus welchem Verzeichnis er die nimmt.
 
Zurück
Oben