Webbrowser nach 10 Sekunden wieder schließen lassen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
tlosert
User
Beiträge: 18
Registriert: Donnerstag 6. Mai 2021, 13:05

Montag 7. Juni 2021, 11:02

Hallo zusammen,

ich möchte, da es die Fritz-Box nicht immer hinbekommt, per Python Programm meine IP-Adresse beim DynDNS-Dienst DDNSS aktualisieren lassen.
Dies geschieht mit dem Aufruf eines Links im Browser (bspw.:

Code: Alles auswählen

https://www.ddnss.de/upd.php?user=xxx&pwd=yyy&host=zzz.ddnss.de
).
Soweit so gut.
Ich habe es mit folgendem Programm (ist ein Ausschnitt) versucht bzw. angefangen:

Code: Alles auswählen

import os
import webbrowser

url = 'https://www.ddnss.de/upd.php?user=xxx&pwd=yyy&host=zzz.ddnss.de'
webbrowser.open(url)
time.sleep(10)
os.system("taskkill /im chrome.exe /f") #funktioniert aber nicht oder ist eine doofe Lösung
Das ganze wird nur ausgeführt, wenn sich meine IP-Adresse geändert hat, das habe ich bereits implementiert!
Nach Aufruf der URL startet der Browser, der dann wieder nach einer Zeit (10 Sek.) geschlossen werden soll, da dies in der shell (crontab) ausgeführt wird und sonst jeden Tag mindestens ein weiteren Tab eröffnet!

Danke für eure Hilfe,
Grüße Thomas
Benutzeravatar
sparrow
User
Beiträge: 2709
Registriert: Freitag 17. April 2009, 10:28

Montag 7. Juni 2021, 11:05

Warum startest du überhaupt einen Browser und rufst die URL nicht aus Python auf? In der Regel verwendet man dafür das externe "requests" Modul.

Edit: Typo des Moduls korrigiert :roll:
Zuletzt geändert von sparrow am Montag 7. Juni 2021, 11:30, insgesamt 1-mal geändert.
tlosert
User
Beiträge: 18
Registriert: Donnerstag 6. Mai 2021, 13:05

Montag 7. Juni 2021, 11:26

sparrow hat geschrieben:
Montag 7. Juni 2021, 11:05
Warum startest du überhaupt einen Browser und rufst die URL nicht aus Python auf? In der Regel verwendet man dafür das externe "reqeusts" Modul.
Hi,
das war mir nicht eingefallen (Greenhorne mit Python 😁), werde Mal danach Ausschau halten.
Danke erstmal, Grüße Thomas
Sirius3
User
Beiträge: 14601
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 7. Juni 2021, 12:31

Hier reicht eigentlich das eingebaute urllib:

Code: Alles auswählen

import urllib

URL = 'https://www.ddnss.de/upd.php?user=xxx&pwd=yyy&host=zzz.ddnss.de'

response = urllib.request.urlopen(URL)
tlosert
User
Beiträge: 18
Registriert: Donnerstag 6. Mai 2021, 13:05

Montag 7. Juni 2021, 13:28

Ich danke euch.
D.h. eigentlich ist egal, ob ich

Code: Alles auswählen

response = urllib.request.urlopen(URL)
oder

Code: Alles auswählen

response = request.get(URL)
nutze, oder?
Benutzeravatar
snafu
User
Beiträge: 6334
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Montag 7. Juni 2021, 20:56

Wenn beides den selben Effekt hat, dann macht es wohl keinen Unterschied. ;)

requests kann halt mehr bequeme Sachen. Zum Beispiel musst du die Login-Daten dann nicht in die URL kodieren, sondern könntest sie auch als Wörterbuch mitgeben. Oder wenn du nach dem Login noch weitere Befehle absitzen willst, dann hält es quasi die Session für dich offen. Sowas ist ohne requests auch machbar, aber erfordert mehr Code und Hirnschmalz. Man kann requests aufgrund seiner Popularität einfach immer nutzen bzw beim Anwender zur Abhängigkeit machen, muss man aber nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 8716
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 9. Juni 2021, 09:30

`requests` wird IMHO schon ab dem Punkt interessant wo im Benutzernamen oder Passwort (wahrscheinlicher) Zeichen auftauchen, die man nicht einfach so 1:1 in eine URL schreiben kann.

Keines der Beispiele prüft übrigens bisher den HTTP-Status der Antwort.

Code: Alles auswählen

#!/usr/bin/env python3
import requests

DYNDNS_UPDATE_URL = "https://www.ddnss.de/upd.php"
USERNAME = "xxx"
PASSWORD = "yyy"
HOSTNAME = "zzz.ddnss.de"


def main():
    response = requests.get(
        DYNDNS_UPDATE_URL,
        params={"user": USERNAME, "pwd": PASSWORD, "host": HOSTNAME},
    )
    response.raise_for_status()


if __name__ == "__main__":
    main()
long long ago; /* in a galaxy far far away */
tlosert
User
Beiträge: 18
Registriert: Donnerstag 6. Mai 2021, 13:05

Mittwoch 9. Juni 2021, 11:31

Ich danke euch werde das alles gleich mal ausprobieren.
Antworten