PHP in ein Python Script integrieren.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
megabyte
User
Beiträge: 6
Registriert: Montag 5. Januar 2009, 02:38

Hallo Community
Ich hoffe, das Problem ist nicht zu komplex, sollte es aber nicht sein.
Vorab muss ich sagen, dass ich leider keinerlei Ahnung von Python habe. Ich habe schon mit Java gearbeitet, wie auch mit so ziemlich allen Sprachen in Richtung Webdesign - alles aber nur auf Amateur-Niveau.

Es geht um folgendes:
Ich habe von dieser Seite das Script "Droopy" heruntergeladen und benutze es seit einiger Zeit. Droopy erstellt ein Webfrontent auf dem Locahost, über das andere dann Dateien auf den jeweiligen Computer übertragen können.
Die angezeigte Website habe ich zwar schon angepasst, aber das Programm hat nach wie vor einen ästhetischen Makel:
Wenn ich die "Startseite" öffne und meine IP herausfinden möchte, werde ich immer über die eine externe Internetseite geleitet. Ich hätte gerne, dass ich über diesen Link automatisch auf "http://meineIP:8000" weitergeleitet werde. Ich habe versucht, das mit PHP zu verwirklichen, das wollte aber nicht so, wie ich will. Was ich versucht habe war, unter dem Punkt "linkurltmpl" folgenden Code einzubauen:

Code: Alles auswählen

<?php $ip=$_SERVER['REMOTE_ADDR']; ?>
<a href="http://"<?php echo $ip; ?>":%&#40;port&#41;d">
Dann werde ich aber weitergeleitet auf "http://<?php echo $ip; ?>:8000". Es ist irgendwo auch verständlich, warum, weil der PHP-Code ein String ist. Nur weiß ich leider nicht, wie ich es besser machen kann.

Gibt es die Möglichkeit, mich so weiterzuleiten, wie ich das versucht hatte? Wenn das nicht möglich sein sollte, kann man ins Script eine Zwischenseite einbauen, ähnlich der, auf die ich zur Zeit umgeleitet werde?

Ich hoffe der doch recht lange Text hat keinen abgeschreckt.

Danke schon mal für (hoffentlich) eure Hilfe!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo megabyte, willkommen im Forum,

gut dass du dein Problem so ausführlich geschildert hast, denn der Threadname weist schon auf ein XY-Problem hin. Du möchtest X machen (die aktuelle IP anzeigen) und meinst dass es über Y (PHP-Code im Python-Skript einbetten) geht. Dem ist aber nicht der Fall, selbst wenn es gehen würde.

Das Problem was hier gelöst werden soll ist ein Problem mit IPv4, also dem Protokoll das vom Internet genutzt wird. Da eine Knappheit am IPv4 herrscht (die genauen Gründe für diesen Blödsinn kannst du in der Wikipedia nachlesen) gibt jeder ISP dem Kunden nur eine IP. Jetzt ist es aber immer häufiger der Fall, dass Leute mehrere Rechner haben aber nur eine IP. Da kommt dann NAT ins Spiel bei dem ein Rechner diese IP übernimmt (oftmals ein Router) und dann die Daten in ein anderes, hausinternes Netzwerk mit anderen IP-Adressen weiterleitet. Wenn dein Rechner also in so einem ge-NAT-etem Netzwerk steht, dann weiß er zwar seine eigene IP-Adresse, aber die ist nur im hausinternen Netzwerk gültig; die externe IP kennt nur der Router. Wenn du nun aber die externe, Internet-IP haben willst gibt es zwei Möglichkeiten: die fragst den eigenen Router oder die fragst einen Server im Internet, welche Internet-IP du hast. Ersteres ist recht kompliziert und wird von nicht vielen Routern unterstützt (wenn überhaupt), zweiteres funktioniert deswegen weil dein Router die Daten umschreibt und aus der Sender-IP-Adresse deines Rechners die Internet-IP-Adresse des Routers reinschreibt bevor er die Daten weiter an den Internet-Server sendet. Dieser bekommt dann die Daten, liest die IP in die Variable ``REMOTE_ADDR`` ein, die dann ein Skript wie das angegebene Skript zurückgeben kann. Somit kannst du deine externe IP-Adresse herausfinden, ohne deinen Router direkt zu fragen. Übrigens hätte es das Problem mit IPv6 ohne NAT gar nicht erst gegeben, weil dort kann jeder Rechner eine eigene aus dem Internet zugängliche IPv6-Adresse bekommen.

Das Einbetten des Codes würde nicht funktionieren, denn wenn dein Rechner doch schon den Inhalt von ``REMOTE_ADDR`` kennen würde, dann müsste er ja nicht mehr irgendwo fragen. Wie man das nun löst: beim Start des Programmes machst du mittels urllib eine Anfrage auf ``http://stackp.online.fr/droopy-ip.php?port=8000`` oder was eben dein gewünschter Port so ist und liest den HTML-Code aus. In diesem findest du im ersten H1, im A-Tag deine gewünschte URL und kannst sie im Programm anzeigen. Ist eigentlich ziemlich trivial, wenn du dir das Tutorial mal ansehst ist das durchaus auch für Anfänger zu schaffen.

So, das war nun ein recht langer Text, hoffentlich habe ich dir nicht zu viel Sachen erzählt die du bereits wusstest und wenn dem nicht so ist, dass es dann verständlich war. Ich muss an meinem Image arbeiten, sonst hängt man mir an ich wäre unfreundlich ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
megabyte
User
Beiträge: 6
Registriert: Montag 5. Januar 2009, 02:38

Hey, danke! Das hat meine Frage ausführlich beantwortet! Nein, den größten Teil davon kannte ich noch nicht.
Leonidas hat geschrieben:Ich muss an meinem Image arbeiten, sonst hängt man mir an ich wäre unfreundlich
Wenn's drauf ankommen sollte, ich verbürge mich dafür, dass du nicht unfreundlich bist. ;)
Leonidas hat geschrieben: Ist eigentlich ziemlich trivial, wenn du dir das Tutorial mal ansiehst ist das durchaus auch für Anfänger zu schaffen.
Gibt es schon im Forum ein Tutorial zum urllib-Modul? Wenn nicht ist das auch kein Problem, das Internet wimmelt ja von Tutorials, wird schon eins dabei sein, das ich auch benutzen kann!

_edit:

Ich habe in meinem lieben Stammforum ubuntuusers folgenden Code gefunden:

Code: Alles auswählen

python -c "import urllib;print urllib.urlopen('http://www.whatismyip.com/automation/n09230945.asp').read()"
Der funktioniert schon mal in der Konsole super! Ich setze mich mal morgen hin und versuche ihn in mein Script zu friemeln.

Danke nochmal und gute Nacht!

_re-edit: Noch eine Frage. Er benutzt in seinem Programm variablen, die auch in dem "Html-Teil" als Variablen erkennbar und verwertbar sind. Zum Beispiel sind da "%(port)d" oder "%(problem)d". Wie kann ich solche Variablen setzen? Das ganze ließ sich nicht über Google suchen, da Google leider weder Prozent-Zeichen noch Klammern als verwertbare Symbole ansieht und sie schlicht ignoriert.
Zuletzt geändert von megabyte am Dienstag 6. Januar 2009, 12:57, insgesamt 1-mal geändert.
Benutzeravatar
megabyte
User
Beiträge: 6
Registriert: Montag 5. Januar 2009, 02:38

Oops - ich wollte eigentlich auf edit drücken, habe aber zitat erwischt.

Der Übersichtlichkeit halber habe ich den "re-edit" aber doch oben eingefügt.

Aber nochmal kurz, die Frage ist, was das für ein Variablen-Typ ist, den er benutzt. Es ist immer %(Variable)x, wobei "x" irgendein Buchstabe ist (hinter das System bin ich noch nicht gekommen). So dass nachher ist:

Code: Alles auswählen

import urllib

%(ip)x = urllib.urlopen('http://www.whatismyip.com/automation/n09230945.asp').read()

...

linkurltmpl = '''<div id="linkurl">
<a href="%(ip)x:%(port)d"> %(discover)s
</a></div>'''
BlackJack

Zeile 4 geht so nicht, weil das links vom ``=`` kein gültiges Python ist. Schau mal in der Dokumentation was der ``%``-Operator bei Zeichenketten macht, wenn links davon eine Zeichenkette und rechts davon ein Dictionary steht.
Benutzeravatar
megabyte
User
Beiträge: 6
Registriert: Montag 5. Januar 2009, 02:38

Das habe ich bereits gemerkt, trotzdem danke.
Ich habe diesen Pseudo-Code eingefügt, damit verständlicher ist, was ich meine.

Wenn du den Code "Droopy" (im ersten Post) anguckst, siehst du, dass dort Variablen so heißen. Meine Frage war, wie ich sie deklarieren kann. Wenn ich das richtig sehe, sind sie nämlich sehr praktisch, da sie auch innerhalb des Html-Tags als Python-Variable erkannt und entsprechend verwendet werden.

Ich bin mir leider nicht sicher, welche "Dokumentation" du meinst und habe entsprechend viele "Python-Dokumentationen" im Web gefunden. Falls darin (in dieser Dokumentation) die Antwort auf meine Frage liegen sollte, tut's mir Leid.

Aber danke für's mithelfen!

_edit: Ok, ich denke, du meinst DIE Python-Dokumentation. Ich versuche dann mal rauszufinden, was das Zeichen macht. Leider nimmt die Suchmaschiene der Seite auch keine Sonderzeichen, aber ich schaff das! :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

megabyte hat geschrieben:Aber nochmal kurz, die Frage ist, was das für ein Variablen-Typ ist, den er benutzt. Es ist immer %(Variable)x, wobei "x" irgendein Buchstabe ist (hinter das System bin ich noch nicht gekommen).
Das x ist ein Buchstabe aus ``s``, ``d`` und ``f`` (es gibt noch weitere, aber die nutzt man quasi nie) . Wobei ``s`` für String steht, ``d`` für Integer also Ganzzahlen und ``f`` für Float, also Fließkommazahlen. Du brauchst nur das ``s``, da die URL auf der Seite als String zurückgegeben wird.

Die Dokumentation zu urllib beantwortet dann die meisten Fragen zum Thema "wie kann ich die Seite auslesen".
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Stringformatierung
Damit sollten alle deine Fragen zum `%' geklärt werden ;)
Benutzeravatar
megabyte
User
Beiträge: 6
Registriert: Montag 5. Januar 2009, 02:38

cofi hat geschrieben:Stringformatierung
Damit sollten alle deine Fragen zum `%' geklärt werden ;)
Das hat den letzten Anstoß gegeben, vielen Dank!

Danke auch an Leonidas, du hast mir sehr geholfen.
Und natürlich auch BlackJack für die Mitarbeit!

Der Codeschnipsel sieht jetzt so aus und funktioniert, als eigenständiges Programm, schon man spitze. Das sollte ich wohl irgendwie in mein Programm bekommen!
Ich hoffe, das wird nicht zu schwer, sollte es aber nicht, oder? :)

Code: Alles auswählen

import urllib
print '%(language)s' % \
{'language': urllib.urlopen('http://www.whatismyip.com/automation/n09230945.asp').read()}

Kann man Themen hier auch "als gelöst markieren"? Ich habe diese Option leider nicht gefunden.
Zuletzt geändert von megabyte am Mittwoch 7. Januar 2009, 01:07, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dann musst du entsprechend den Teil in Drooopy ersetzen, der den Link zur externen Seite anzeigt durch die IP-Adresse die du ausliest.

Btw: ``language`` ist wohl der schlechtest mögliche Name für eine IP-Adresse.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
megabyte
User
Beiträge: 6
Registriert: Montag 5. Januar 2009, 02:38

Ja, ``language`` war noch der Name der Variablen aus dem Beispiel, das ich geändert habe, die muss ich natürlich ändern, danke. Das ist mir in der eile gar nicht aufgefallen. :)

Ich versuche es morgen mal rein zu bekommen, dann melde ich mich nochmal!
BlackJack

@megabyte: Bei der Python-Dokumentation gibt's für die einzelnen grossen "Dokumente" (Tutorial, Bibliotheksreferenz, Sprachreferenz) jeweils einen Index. Da lassen sich Operatoren sehr leicht finden.
Antworten