Öffnen von Internetseiten mit Pause, weiter mit Taste

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
wolfilein
User
Beiträge: 6
Registriert: Freitag 18. Mai 2018, 22:27

Da in Firefox auf meinem grossen iMac sehr viele Lesezeichen sind, habe ich mit AppleScript ein einfaches Programm geschrieben, es öffnet eine Internetseite, macht 30 Sekunden Pause, dann die nächste Seite, usw. Eine definierte Pausenzeit ist natürlich unpraktisch, besser wäre ein Befehl, dass nach Drücken einer Taste das Programm die nächste Seite öffnet, leider war auch der Apple-Support nicht in der Lage, mir zu helfen, vielleicht kann AppleScript das auch gar nicht.
Also habe ich mir heute Python runtergeladen, und auch xampp, und als absoluter Anfänger mal rumprobiert. Mit urlopen() scheint man Internetseiten öffnen zu können, aber ich bekomme immer die Meldung, da wäre etwas nicht definiert. Ich bräuchte also nur 3 Befehle, Öffnen einer Internetseite, Pause, weitermachen auf Tastendruck. Sieht ganz einfach aus, kann hier jemand helfen?
Danke und Gruss
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Code: Alles auswählen

import webbrowser

urls = ["http://www.python-forum.de",
        "http://www.python.org"]

for url in urls:

    webbrowser.open(url)

    input(">>> Weiter? ")
Das ist jetzt mal sehr rustikal umgesetzt.
wolfilein
User
Beiträge: 6
Registriert: Freitag 18. Mai 2018, 22:27

Danke für die Antwort, funktioniert nur für die erste Internetseite, danach passiert nichts. So sieht jetzt mein Programm aus:

import webbrowser

urls = ["https://www.nzz.ch/"]

for url in urls:

webbrowser.open(url)

input(">>> Weiter? ")

urls = ["https://www.golem.de/ticker/"]

webbrowser.open(url)
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Bitte deinen Source-Code nächstes mal in Python-Code-Tags definieren. Was du gebaut hast funktioniert deshalb nicht, weil in deiner URL-Liste nur ein Element vorhanden ist. Was du wahrscheinlich möchtest ist das:

Code: Alles auswählen

urls = ['https://golem.de', 'https://www.nzz.ch/']

for url in urls:
    webbrowser.open(url)
    input(">>Weiter?")
Edit: ich sehe gerade, dass das exakt das ist, was pixewakb dir schon schrieb.
When we say computer, we mean the electronic computer.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

wolfilein hat geschrieben: Freitag 18. Mai 2018, 22:43 Da in Firefox auf meinem grossen iMac sehr viele Lesezeichen sind, habe ich mit AppleScript ein einfaches Programm geschrieben, es öffnet eine Internetseite, macht 30 Sekunden Pause, dann die nächste Seite, usw. Eine definierte Pausenzeit ist natürlich unpraktisch, besser wäre ein Befehl, dass nach Drücken einer Taste das Programm die nächste Seite öffnet[...]
Also habe ich mir heute Python runtergeladen, und auch xampp, und als absoluter Anfänger mal rumprobiert. Mit urlopen() scheint man Internetseiten öffnen zu können, aber ich bekomme immer die Meldung, da wäre etwas nicht definiert. Ich bräuchte also nur 3 Befehle, Öffnen einer Internetseite, Pause, weitermachen auf Tastendruck. Sieht ganz einfach aus, kann hier jemand helfen?
Also mein Skript funktioniert, ich habe es gerade am Rechner getestet:

Code: Alles auswählen

>>> Weiter? 
>>> Weiter? 
>>> 
Mir ist gerade nicht klar, was Du machst, dass Du das nicht siehst oder nicht zu sehen bekommst?

Also:

xampp (nutze ich auch), hat nichts mit deinem Problem zu tun. Das ist ein Apache-Server lokal auf einem Rechner aufgesetzt.
urlopen() hat ebenfalls nichts mit Deinem Problem zu tun. Das hast Du wahrscheinlich aus dem urllib-package und das wird da genutzt, um Webseiten (HTML-Code) aus dem Netz zu laden ("parsen") und dann auszuwerten. Eine Seite im Browser kannst du damit nicht öffnen.

Mir ist dein Fehler nicht klar, ich habe aber auch keine iMac-Erfahrung: Wenn Du 'mein' Skript in IDLE ausführst, dann siehst du die Python-Shell, die von Dir eine Eingabe erwartet, wenn Du das Skript direkt durch Doppelklick (unter Windows) startest, dann siehst du ein Konsolenfenster (weiß auf schwarz) und wirst um eine Tasteneingabe gebeten. Du hättest hier schon die Python-Datei von skriptname.py nach skriptname.pyw umbenennen müssen, um die Abfrage nicht zu sehen, was ich hier nicht erwarte. Dass der webbrowser-Schnipsel eine Seite öffnet, spricht dagegen, dass das Modul auf einem Mac nicht funktioniert.

Ich bin mir nicht sicher, was Dir vorschwebt. Eine Zeitsteuerung wäre m. E. auch einfach zu realisieren (habe ich auch schon mal gemacht); eine Abfrage einer Tasteneingabe ohne Eingabe in die Konsole (Stichwort "Key logger") ist in Python möglich, ich würde obigen Quellcode aber als normale Lösung für das Problem bezeichnen.

Mal zu deinem Quelltext:

Code: Alles auswählen

import webbrowser  #1

urls = ["https://www.nzz.ch/"]  #2

for url in urls:  #3
    webbrowser.open(url)  #4

input(">>> Weiter? ")  #5

urls = ["https://www.golem.de/ticker/"]  #6

webbrowser.open(url)  #7
#1 Du importierst das Modul webbrowser, bei #2 definierst du eine Liste mit einem Listenelement. Bei #3 durchläufst du die Liste (for-Schleife) und machst bei #4 für jedes Element eine Aktion, hier öffnest du für jedes Element url diese url im Browser. Die Variable url wird hier belegt. #5 unterbricht die Ausführung des Quellcodes und wartet auf eine Eingabe des Benutzers. Du definierst bei #6 erneut eine Liste mit einem Element (nicht sinnvoll); auch die input-Anweisung hätte ich persönlich in die Schleife gepackt (s. o.). Bei #7 öffnest du dann die URL url im Browser, da du die neue Liste (#6) nicht durchläufst, nimmt er den Inhalt der Variable url, die du zuletzt bei #3 belegt hast, d. h. das Skript öffnet zweimal die identische Seite im Browser.

(Ganz verstehe ich Dein Problem noch nicht.)
wolfilein
User
Beiträge: 6
Registriert: Freitag 18. Mai 2018, 22:27

Danke für die Antwort. Als blutiger Anfänger habe ich keine Ahnung von Python-Tags, habe etwas gefunden mit Ctrl-Shift-v, aber ich sehe hier keinen Effekt.
Was ich erreichen möchte, hatte ich schon ganz am Anfang geschrieben, viele Webseiten nacheinander öffnen, aber nicht mit Zeitsteuerung (wie es bereits mit Apple-Script läuft), da ich manche Seiten schnell lese, andere nur überfliege, sondern auf Tastendruck soll sich die nächste Seite öffnen.
Mit diesem Code öffnet sich nur die erste Seite golem.de, danach kann ich jede beliebige Taste drücken, es passiert nichts mehr?? (Ansonsten sehe ich diese Frage "Weiter?" nur, wenn ich zurückgehe zu IDLE)
Fehlt hier nicht ein Befehl zur weiteren Programmausführung nach Tastendruck?

import webbrowser
urls = ['https://golem.de', 'https://www.nzz.ch/']
for url in urls:
webbrowser.open(url)
input(">>Weiter?")
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

wolfilein hat geschrieben: Mittwoch 23. Mai 2018, 20:47 Mit diesem Code öffnet sich nur die erste Seite golem.de, danach kann ich jede beliebige Taste drücken, es passiert nichts mehr?? (Ansonsten sehe ich diese Frage "Weiter?" nur, wenn ich zurückgehe zu IDLE)
Das ist richtig so, da das Browser-Fenster in den Vordergrund rückt. Was du noch implementieren musst ist ein Hintergrundprozess in deinem Skript der deine Tastatureingabe erkennt und die for-Schleife fortsetzt.
When we say computer, we mean the electronic computer.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Wechsel zurück zur Konsole von Idle und drücke dann auf die Frage "Weiter" einmal Enter, den Vorgang müsstest du für jede Seite wiederholen. Ich merke an, dass du die Fenster auch so nebeneinander anordnen kannst, dass das geht.
sls hat geschrieben: Mittwoch 23. Mai 2018, 20:57Das ist richtig so, da das Browser-Fenster in den Vordergrund rückt. Was du noch implementieren musst ist ein Hintergrundprozess in deinem Skript der deine Tastatureingabe erkennt und die for-Schleife fortsetzt.
@sls: Hast du dazu ein Codebeispiel? Ich halte das für ziemlich ambitioniert und habe so etwas selbst noch nicht programmiert.
wolfilein
User
Beiträge: 6
Registriert: Freitag 18. Mai 2018, 22:27

Zurück zu Idle wäre etwas umständlich, aber es funktioniert auch nicht, es kommt dann diese Meldung:

Traceback (most recent call last):
File "/Users/...../versuchneu.py", line 7, in <module>
input(">>Weiter?")
File "<string>", line 0

^
SyntaxError: unexpected EOF while parsing
>>>

Es sollte doch möglich sein, dass das Programm auf Tastendruck weiterläuft??
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du Python2 benutzt, dann brauchst Du `rawinput`.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Ich habe mir mal ein GUI gestrickt, was einen Button oben links auf dem Desktop angezeigt hat und dort immer geblieben ist. Ich hatte dann dort Funktionalität reingepackt, die mir Screenshots erzeugt hat. Du müsstest die Pfadangabe unter PATH korrigieren und ein Icon.png ins Heimatverzeichnis des Tools packen.

Eine Routine, um Webseiten zu öffnen, müsste dann noch ergänzt werden. Die Steuerung würde dann per Klick auf einen Button erfolgen. Der Quellcode ist nicht gut, aber es hat damals mal seine Aufgabe erledigt.

BTW: [1] Abfangen von Benutzereingaben auf OS-Ebene unabhängig vom Fokus des Fensters, darauf liefe es m. E. hinaus, halte ich für sehr ambitioniert. [2] Ferner könntest du auch mal im Extensions-Shop deines Browsers schauen, ob es noch keine fertige Lösung gibt.

Code: Alles auswählen

#!/usr/bin/env python

import tkinter as tk

  
class Winit(object):

  PATH = "C:/Users/USERNAME/Desktop"
  
  def __init__(self, fullscreen=True, noborder=True, width=500, height=30, x=0, y=0):
 
    self.root = tk.Tk()
   
    if fullscreen:
      self.width = self.root.winfo_screenwidth()
      self.height = self.root.winfo_screenheight()
      self.x = 0
      self.y = 0
    else:
      self.width = width
      self.height = height
      self.x = x
      self.y = y
     
    self.root.geometry("%dx%d+%d+%d" % (self.width, self.height, self.x, self.y))
    self.root.wm_overrideredirect(noborder)

    # oben halten
    self.root.attributes("-topmost", True)

    # Icon dazu
    self.icon = tk.PhotoImage(file="Icon.png")
    
    # Button dazu
    # self.button = tk.Button(text='Print', command=self.callback)  #self.root.quit
    self.button = tk.Button(image=self.icon, relief="flat", command=self.callback)  #self.root.quit
    self.button.pack()

  def run(self):
 
    self.root.mainloop()

  def callback(self):
    # Hier kommt die Funktionalität rein
    pass


if __name__ == '__main__':
 
  Winit(False, True, 24, 24, 0, 0).run()
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

pixewakb hat geschrieben: Freitag 25. Mai 2018, 08:00 @sls: Hast du dazu ein Codebeispiel? Ich halte das für ziemlich ambitioniert und habe so etwas selbst noch nicht programmiert.
Ich bin gerade über die keyboard-lib gestolpert, eventuell kann der TE ja darauf aufbauen?

Erster shot:

Code: Alles auswählen

import keyboard
import webbrowser

URLS = [
    "https://golem.de",
    "https://python-forum.de"
]

for url in URLS:
    webbrowser.open(url)
    keyboard.wait('control+Enter')
When we say computer, we mean the electronic computer.
wolfilein
User
Beiträge: 6
Registriert: Freitag 18. Mai 2018, 22:27

Es kommt die Meldung: No module named 'keyboard'
Vielleicht hängt das auch damit zusammen:
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 03:03:55)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> WARNING: The version of Tcl/Tk (8.5.9) in use may be unstable.
Visit http://www.python.org/download/mac/tcltk/ for current information.
??
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

das Modul 'keyboard' ist noch nicht auf deinem Rechner installiert
bin PC User, keine Ahnung wie du aufm Mac die Konsole öffnest
aber dort sollte es mit
python3 -m pip install keyboard
klappen
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
wolfilein
User
Beiträge: 6
Registriert: Freitag 18. Mai 2018, 22:27

pip install in der Konsole ging, aber jetzt kommt lange Fehlermeldung (1. Internetseite wird geöffnet):
Exception in thread Thread-1:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/threading.py", line 916, in _bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keyboard/__init__.py", line 292, in listen
_os_keyboard.listen(self.direct_callback)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keyboard/_darwinkeyboard.py", line 430, in listen
raise OSError("Error 13 - Must be run as administrator")
OSError: Error 13 - Must be run as administrator
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Direkt auf Hardware zuzugreifen, ist normalerweise nicht so ohne weiteres möglich, außer man hat Administrator-Rechte. Daher ist das Modul für so ziemlich viele Zwecke ungeeignet.
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

wolfilein hat geschrieben: Sonntag 27. Mai 2018, 12:25 raise OSError("Error 13 - Must be run as administrator")
Windows sagt: Öffnen der Datei geht nur als Admin. Also versuche doch mal als Admin auszuführen.
Oder du musst dir eine alternative einfallen lassen. Ggf eine GUI (zb minimiert im Hintergrund) mit einem Hotkey ansteuern um die Funktion durchzuführen
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

https://apple.stackexchange.com/questio ... pt-i-wrote stellt einen Workaround für Apple Script bereit.

Und wenn das nicht geht, kannst du ein pyobjc Programm schreiben, und darin einen globalen Shortcut definieren, der immer dein Programm erreicht. Auch ohne gefährliche Admin-Rechte!

https://stackoverflow.com/questions/113 ... x/11349005#
Antworten