Screenshot machen und hochladen

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.
Flokass
User
Beiträge: 19
Registriert: Sonntag 18. Juli 2010, 13:22

Hallo,

ich möchte gerne ein Script schreiben dass ein Screenshot des aktuellen Bildschirms macht und an eine Webseite sendet (per POST).

Jetzt habe ich bereits ein modul namens frog gefunden dass eine funktion names snapshot hat - die das Bildschirmfoto macht (frog.py Zeile 583).

Was muss ich jetzt tun? Bin ein python-neuling :oops:
BlackJack

@Flokass: Das Tutorial in der Python-Dokumentation durcharbeiten zum Beispiel. :-)
Flokass
User
Beiträge: 19
Registriert: Sonntag 18. Juli 2010, 13:22

Da bin ich dabei.

Bin mittlerweile soweit:

Code: Alles auswählen

import frog

pool = Pool()
irfanpath = "C:\\Program Files\\IrfanView"
snapdict = pool.snapinfo(irfanpath)
success = False
if "gif" in snapdict["format"]:
 filename = pool.snapshot("pool.gif",path=irfanpath)
else:
 filename = pool.snapshot("pool.jpg",path=irfanpath)
if filename:
 print("Screenshot gespeichert als Datei %s" %filename)
pool.ready()

Es kommt aber leider immer folgender Fehler:
Traceback (most recent call last):
File "C:\Users\*******\Desktop\********\cloudwin.py", line 3, in <module>
pool = Pool()
NameError: name 'Pool' is not defined
Zuletzt geändert von Flokass am Montag 19. Juli 2010, 12:39, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was ist denn "Pool" für eine Klasse? Aus welchem Modul stammt sie?

Für Pfadangaben solltest Du Raw-Strings nutzen:

Code: Alles auswählen

IRFANPATH = r"C:\Program Files\IrfanView"
Damit handelst Du Dir keinen Escapin-Ärger ein.

Es gibt hier Python-Code-Tags! Damit hast Du Syntaxhighlighting. Außerdem stimmen Deine Einrückungen nicht!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Flokass hat geschrieben:

Code: Alles auswählen

import frog

pool = Pool()
Es kommt aber leider immer folgender Fehler:
Traceback (most recent call last):
File "C:\Users\*******\Desktop\********\cloudwin.py", line 3, in <module>
pool = Pool()
NameError: name 'Pool' is not defined
Tja, wo soll er auch herkommen der Pool? Ein Blick in den Code von frog.py zeigt mir, dass es dort eine Klasse namens Pool gibt. Dein Code müsste also eher wie folgt aussehen:

Code: Alles auswählen

from frog import Pool
pool = Pool()
oder

Code: Alles auswählen

import frog
pool = frog.Pool()
Flokass
User
Beiträge: 19
Registriert: Sonntag 18. Juli 2010, 13:22

Vielen Dank!

Der Fehler ist weg. Ich habe jetzt:

Code: Alles auswählen

import frog
from frog import Pool

pool = Pool()
irfanpath = r"C:\Program Files\IrfanView"
snapdict = pool.snapinfo(irfanpath)
success = False
if "gif" in snapdict["format"]:
 filename = pool.snapshot("pool.gif",path=irfanpath)
else:
 filename = pool.snapshot("pool.jpg",path=irfanpath)
if filename:
 print("Screenshot gespeichert als Datei %s" %filename)
pool.ready()
Ergibt:
Screenshot gespeichert als Datei pool.gif
Jetzt muss ich es hinbekommen dass er das ganze an eine Webadresse sendet. Bisher habe ich nur etwas gefunden wie man den Standartwebbrowser öffnet der dazu nach möglichkeit auch verwendet werden soll. Allerdings wäre es auch etwas ein kleines Fenster anzuzeigen indem der Internet Explorer eingebunden ist.

So also hiermit kann man einen Browser öffnen:

Code: Alles auswählen

import webbrowser
webbrowser.open('http://google.com')
Nun ist die Frage ob es möglich ist mit dem Befehl auch das entsprechende Bild per POST mitzugeben. Ich denke nein. Also muss ich wahrscheinlich den IE einbetten oder?
Zuletzt geändert von Flokass am Montag 19. Juli 2010, 12:39, insgesamt 1-mal geändert.
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

einen Webbrowser musst du nicht einbetten. Die urllib2 sollte eigentlich reichen.
Flokass
User
Beiträge: 19
Registriert: Sonntag 18. Juli 2010, 13:22

kannst du mir sagen wie der code sein muss damit er an eine webseite das bild sendet?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Flokass hat geschrieben:kannst du mir sagen wie der code sein muss damit er an eine webseite das bild sendet?
Guck doch einfach in die Doku! Da gibts iirc auch viele schöne Beispiele!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Flokass
User
Beiträge: 19
Registriert: Sonntag 18. Juli 2010, 13:22

Ja, ich weiß hier gibts einige Beispiele. Aber leider kann ich damit nicht viel anfangen.

Also soweit bin ich:

Code: Alles auswählen

import urllib2
req = urllib2.Request('http://www.example.com/')
# hier
r = urllib2.urlopen(req)
Dort wo "hier" steht muss denke ich mal jetzt das Bild per POST rein oder? Ich gehe mal davon aus. Wie mache ich das jetzt genau? Hier steht was von add_data(data)... Weiter komme ich leider nicht :(
Zuletzt geändert von Flokass am Montag 19. Juli 2010, 12:40, insgesamt 2-mal geändert.
Flokass
User
Beiträge: 19
Registriert: Sonntag 18. Juli 2010, 13:22

Okay mittlerweile bin ich so weit:

Code: Alles auswählen

import frog
from frog import Pool

pool = Pool()
irfanpath = r"C:\Program Files\IrfanView"
snapdict = pool.snapinfo(irfanpath)
success = False
if "gif" in snapdict["format"]:
 filename = pool.snapshot("pool.gif",path=irfanpath)
else:
 filename = pool.snapshot("pool.jpg",path=irfanpath)
if filename:
 print("Screenshot gespeichert als Datei %s" %filename)
pool.ready()


import urllib2
req = urllib2.urlopen('http://example.com')
# hier
r = urllib2.urlopen(req)
print r.read()
Das macht halt a) das Screenshot und speichert es in der pool.gif ab und stellt b) eine Verbindung zu example.com her und gibt dann alles wieder was dort steht. Jetzt muss ich aber noch ein was wissen: wie mache ich es jetzt dass er die pool.gif anhängt per POST? Das habe ich leider nicht geschafft :(
Zuletzt geändert von Flokass am Montag 19. Juli 2010, 12:38, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich hatte es zwar schon erwähnt, aber noch einmal:

Es gibt eine spezielle Code-Formatierung für Python [ python]Dein Code [ /python] oder auch [ code=py] ... [ /code]; ohne die führenden Leerzeichen natürlich. Für ersteres gibts sogar einen extra Button ;-)

Deine Einrückungen stimmen so nicht (if... else-Teile)!

Schau Dir doch mal in der Doku zur urllib2 die Beispiele 2 und 3 an. Das sollte es doch sein denke ich mal. Alternativ kommt man ggf. auch mit der httplib weiter.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Flokass
User
Beiträge: 19
Registriert: Sonntag 18. Juli 2010, 13:22

Ohh - habe meine Beiträge mal geändert.

Ich schaue mir jetzt nochmal die Beispiele an...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Laut PEP8 sind die Einrückungen bei Python 4 Spaces ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Flokass
User
Beiträge: 19
Registriert: Sonntag 18. Juli 2010, 13:22

Okay also jetzt bin ich total verwirrt. Also der Sinn der Sache ist dass ich vorerst irgendetwas; später dann das Bild an dieses PHP-Script sende:

Code: Alles auswählen

<?php

if($_POST["data"] == $null) {echo "nichts"; }
else{ echo "etwas"; }

?>
Das ist ein Test ob es geht. Also muss ich jetzt in die Post-Variable "data" irgendetwas senden. Wie mache ich das? Habe mein Script momentan wie folgt aufgebaut aber leider kommt immer "nichts" zurück.

Code: Alles auswählen

import urllib2

req = urllib2.Request(url='http://example.com/script.php',
                      data='irgendetwas')
r = urllib2.urlopen(req)
print r.read()
Flokass
User
Beiträge: 19
Registriert: Sonntag 18. Juli 2010, 13:22

Bin mittlerweile weiter gekommen.

Code: Alles auswählen

import urllib2
import urllib

req = urllib2.Request(url='http://example.com/script.php',
                      data=urllib.urlencode({"data": "irgendetwas"}))
# hier
r = urllib2.urlopen(req)
print r.read()
Soo jetzt bin ich gerade dabei zu versuchen die Datei pool.gif anstatt von "irgendetwas" zu senden.
Flokass
User
Beiträge: 19
Registriert: Sonntag 18. Juli 2010, 13:22

Wie kann ich die Datei jetzt in den POST rein tun anstelle von dem "irgendetwas"? Habe es leider nicht geschafft :/
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Naja, du musst die Datei öffnen und den Inhalt auslesen... wie das geht steht in jedem Tutorial.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Flokass
User
Beiträge: 19
Registriert: Sonntag 18. Juli 2010, 13:22

Danke, werde ich mir morgen mal ansehen!
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Code: Alles auswählen

import frog
from frog import Pool
Da bekommt man echt Augenkrebs.

Entweder du schreibst

Code: Alles auswählen

import frog
pool = frog.Pool()
ODER du schreibst

Code: Alles auswählen

from frog import Pool
pool = Pool()
Darf ich fragen, wo du das Modul her hast? Das hat mein Mathelehrer geschrieben :D
Dies ist keine Signatur!
Antworten