Screenshot hochladen

Code-Stücke können hier veröffentlicht werden.
Antworten
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Da es mich ein wenig ärgert jeden erstellten Screenshot von Hand auf einen Imagehoster hochladen zu müssen, habe ich mir ein Skript (für directupload) zusammengehäckselt, das das ganze automatisiert und es an zwei globale Hotkeys gebunden (eines führt es mit dem Argument mode=full auf, das andere nicht). Es funktioniert in der Form nur auf OS X (wobei ich mir sicher bin, dass man bei dem einen Funktionsaufruf statt screencapture scrot für andere unixoide Betriebssysteme nehmen kann).

Code: Alles auswählen

from lxml import etree, cssselect
import webbrowser, requests
import time, os, sys, subprocess

URL = "http://www.directupload.net/index.php"
PAYLOAD = {"mode": "upload", "input": "file", "Upload_file": "image"}
DIRECTORY = "/was/auch/immer"
TIME_FORMAT = "%d.%m.%Y_%H.%M.%S"

def save_screenshot(filepath):
    if "mode=full" in sys.argv:
        subprocess.call(["screencapture", filepath])
    else:
        subprocess.call(["screencapture", "-i", filepath])
        #in case interactive screenshot capture got canceled
        if not os.path.exists(filepath):
            sys.exit(0)

def upload_file(filename, filepath):
    file = {"bilddatei": (filename, open(filepath, "rb"))}
    r = requests.post(URL, data=PAYLOAD, files=file)
    return r.content

def get_direct_link(content):
    html = etree.HTML(content)
    selector = cssselect.CSSSelector('a[target="_blank"] img')
    direct_link = selector(html)[2].get("src")
    return direct_link

def main():
    filename = "{}.png".format(time.strftime(TIME_FORMAT, time.gmtime()))
    filepath = os.path.join(DIRECTORY, filename)

    save_screenshot(filepath)
    page_content = upload_file(filename, filepath)
    url = get_direct_link(page_content)
    webbrowser.open(url)

if __name__ == "__main__":
    main()
Zuletzt geändert von webspider am Samstag 24. März 2012, 15:26, insgesamt 1-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mag für den Eigengebrauch nicht so wichtig sein, aber `sys.exit()`, sowie das Auslesen übergebener Prorammparameter gehören ja eigentlich eher in die `main()`-Funktion... ;)
lunar

@webspider: Falls Du Anmerkungen wünscht:

Den direkten Zugriff auf die Kommandozeilenargumente in "save_screenshot()" find ich unschön, ebenso das Beenden des Programms in der Funktion. Ich hätte eine "take_screenshot()" Funktion implementiert, die das Bildschirmfoto zurückgibt. Ein Parameter würde dieser Funktion mitteilen, ob sie ein interaktives Bildschirmfoto aufzunehmen hat. Die Kommandozeile würde ich mittels "argparse" auswerten und dann den entsprechenden Parameter an die Funktion übergeben.

Das Parsen des HTML-Inhalts ließe sich mit "lxml.html.fromstring()" und der ".cssselect()"-Methode kürzen.

Durch die Verwendung von "datetime.now()" anstelle von "time.gmtime()" kann man die Erzeugung des Dateinamens kürzen, da man "datetime"-Objekte mit dem neuen String-Formatting direkt formatieren kann.

Die Einrückung entspricht nicht dem Empfehlungen von PEP 8. Auch rät PEP 8 von mehreren Importen in einer Zeile ab.

Edit: Mein Versuch
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

lunar hat geschrieben:@webspider: Falls Du Anmerkungen wünscht:
Immer. Ich bin wesentlich besser geworden, aber immer noch nicht auf professionellem Niveau angelangt. Die Einrückungen sind mir zugegebenerweise sehr unglücklich gelungen beim Rüberkopieren.

Argparse sieht sehr interessant aus. Die Nutzung von Datetime sowie den weniger kruden lxml-Methoden werde ich beherzigen. Es ist sehr mächtig im Umgang, aber idiomatischen Code habe ich bisher in der Dokumentation nicht finden können. Den CSS-Selektor habe ich eigentlich nur deswegen genutzt, weil ich kein wirklich verständliches Tutorial für XPath-Ausdrücke gefunden hab. Sollten diese die Verarbeitung der einen Antwort nochmals wesentlich vereinfachen (und ggf. es ermöglichen unterschiedliche Imagehoster problemlos einzubinden), wären Hinweise dazu sehr praktisch.
lunar

@webspider: Ich kann Dir leider kein gutes Tutorial für XPath nennen. lxml übersetzt die CSS-Selektoren allerdings in XPath-Ausdrücke, die Du Dir auch anzeigen lassen kannst. Vielleicht hilft Dir das. Ich würde HTML allerdings nicht mit XPath parsen. XPath ist dafür nicht sonderlich gut geeignet, eine bestimmte HTML-Klasse zu selektieren, ist beispielsweise sehr kompliziert. Bleibe einfach bei CSS-Selektoren.
Antworten