SOHO Fetcher

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
Gast

hi zusammen,
nach mehr oder weniger langer zeit habe ich wiedermal IDLE angeschmissen.
dank eurem forum hier bin ich auch schon mit dem rohbau fertig :)

ich poste am besten mal den kompletten code, ihr dürft ihn gerne ausprobieren (das bild das gedownloadet wird ist etwa 90kb, es kann aber jedes x-beliebige bild angegeben werden in der konfig.

bei folgendem komme ich nicht weiter:
da ich nicht 2mal das gleiche bild downloaden will, muss ich die letzte datei in meinem lokalen speicher-ordner und die remote-datei auf ihr letztes änderungsdatum überprüfen. falls die gleich sind sollte das script abgebrochen werden logischerweise.

und der status text wird jeweils immernur am schluss komplett angezeigt, und nicht zeile für zeile sobalds weitergeht.

die docu ist zwar cool, aber als anfänger doch recht schwer nachzuvollziehen.

Code: Alles auswählen

#! /usr/bin/env python
# -*- coding: cp1252 -*-

from Tkinter import *
from ScrolledText import *
import httplib
from time import gmtime, strftime

###########################################################################
# modul   : soho.py
# version : 0.2
# autor   : arT2 (tripz.ch)
# python  : Python 2.3 (#46, Jul 29 2003, 18:54:32)
#
# primär habe ich dieses kleine script programmiert um es mehrmals
# täglich per taskmanager zu starten um jeweils das aktuelle bild von [1]
# nicht jedesmal manuell downloaden zu müssen. leider bin ich noch kein
# python profi. man kann unter umständen das ganze also noch vereinfachen
# oder besser machen. in diesem falle bitte ich um eine email!
#
# [1]: http://sohowww.nascom.nasa.gov/data/realtime/eit_304/
#
# To-Do:
# - lokaler dateiname aus dem änderungsdatum der remote datei.
# - überprüfung der letzten dateiänderung (remote datei).
# - fehler meldungen.
# - status text in "real-time" anzeigen und nicht erst alles am schluss.
###########################################################################

### KONFIGURATION ####
# remote datei:
host = "sohowww.nascom.nasa.gov" # ohne http://
path = "/data/realtime/eit_304/1024/" # am start+ende ein slash!
file = "latest.gif" # dateiname mit dateiendung
# lokal zu speichernde datei:
output_fn = strftime("%Y-%m-%d_%H-%M", gmtime()) # dateiname
output_ft = "gif" # dateiendung
output_path = "C:/TEMP" # speicher pfad


### SCRIPT ###
def get_soho():
    """ connect """
    status_text.delete("1.0", END)
    status_text.insert(END, "verbinden mit: " + host + "\n")
    conn = httplib.HTTPConnection(host)
    status_text.insert(END, "verbunden.\n\n")

    """ request image """
    status_text.insert(END, "datei " + file + " suchen in: " + path + "\n")
    conn.request("GET", path + file)
    statusmsg = conn.getresponse()
    status_text.insert(END, "datei " + file + " gefunden.\n\n")

    """ compare last local and latest remote file """
    # ???

    """ create output file """
    status_text.insert(END, "datei " + file + " downloaden/speichern nach: " + output_path + "/\n")
    f = open(output_path + "/" + output_fn + "." + output_ft, "wb")

    """ save output file """
    if statusmsg.reason == "OK":
        f.write(statusmsg.read())
        status_text.insert(END, "datei " + file + " gespeichert als " + output_fn + "." + output_ft)

    conn.close()
    f.close()


def get_about():
    about_text = """
    SOHO? SOHO!!
    http://sohowww.nascom.nasa.gov\n
    script by: arT2
    questions? mail@tripz.ch"""
    status_text.delete("1.0", END)
    status_text.insert(END, about_text)



### INFO FENSTER ###
root = Tk()
root.title("SOHO RULES! :)")

status_text = ScrolledText(width=80, height=10)
status_text.pack()

exit_button = Button(root, text="exit", command=root.quit)
exit_button.pack(side=RIGHT)

about_button = Button(root, text="about", command=get_about)
about_button.pack(side=RIGHT)

dl_button = Button(root, text="download", command=get_soho)
dl_button.pack(side=RIGHT)

root.mainloop()

danke für's durchlesen :)
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Hallo gefällt mir,
aber du könntest den Download als Thread starten, dann hängt TK nicht während des Downloads und das mit dem text in "real-time" anzeigen, hat sich dann auch erledigt.

mfg
Andreas
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Hier mal meine Version :wink:
Edit(24.01):
-Es wird jetzt nur noch die neuste Version runtergeladen.
-Download ist jetzt ein Thread
-Letzter Download wird aufgezeichnet

Code: Alles auswählen

from Tkinter import *
import httplib, time, thread, os.path

Config = {}
Config["host"] = "sohowww.nascom.nasa.gov"                  # ohne http://
Config["path"] = "/data/realtime/eit_304/1024/"             # am start+ende ein slash!
Config["file"] = "latest.gif"                               # dateiname mit dateiendung
Config["output_ft"] = "gif"                                 # dateiendung
Config["output_path"] = "D:\\soho"                          # speicher pfad
Config["log_file"] = "D:\\soho\\Soho_Log.txt"               # log last session


class Download_Soho:
    def __init__(self, Config):
        """ connect """
        Run.Print_MSG("Verbinden mit: " + Config["host"], "OK")
        conn = httplib.HTTPConnection(Config["host"])
        Run.Print_MSG("...verbunden", "OK")

        """ request image """
        Run.Print_MSG("datei " + Config["file"]+ " suchen in: " + Config["path"], "OK")
        conn.request("GET", Config["path"] + Config["file"])
        statusmsg = conn.getresponse()
        Run.Print_MSG("Datei " + Config["file"] + " gefunden", "OK")

        """ compare last local and latest remote file """
        # ex. Mon, 24 Jan 2005 08:46:00 GMT
        Run.Print_MSG("Vergleiche Datum...", "OK")
        last_modified = statusmsg.getheader("last-modified")
        last_modified = time.strptime(last_modified, "%a, %d %b %Y %H:%M:%S %Z")

        # Dateiname ist jetzt last_modified von Server
        output_fn = time.strftime("%d_%b_%Y-%H_%M_%S", last_modified)

        # Prüfe ob datei nicht vorhanden
        if os.path.exists(Config["output_path"] + "\\" + output_fn + "." + Config["output_ft"]) == 0: 
            """ create output file """
            Run.Print_MSG("Datei " + Config["file"] + " downloaden/speichern nach: " + Config["output_path"], "OK")  
            f = open(Config["output_path"] + "\\" + output_fn + "." + Config["output_ft"], "wb")
           
            """ save output file """
            if statusmsg.reason == "OK":
                f.write(statusmsg.read())
                Run.Print_MSG("Datei " + Config["file"] + " gespeichert als " + output_fn + "." + Config["output_ft"], "OK")

            Run.Print_MSG("Close File", "OK")
            f.close()
        else:
            Run.Print_MSG("Diese Version ist schon vorhanden", "OK")
        
        Run.Print_MSG("Close Connection...", "OK")
        conn.close()
        Run.Print_MSG("Up and Running")
        
        
    


class SOHO:
    def __init__(self, Config):
        self.Log_Fp = open(Config["log_file"], 'w')

        self.main_window = Tk()
        self.main_window.geometry("500x20+0+0")
        self.main_window.title("SOHO Fetcher")
        self.Config = Config
        self.Buttons()
        self.Status_Widget()
        self.Print_MSG("Up and Running")
        self.main_window.update()

        

    def Get_About(self):
        self.Print_MSG("Sorry ;-)")

    def Get_Soho(self):
        self.Print_MSG("Starte Download Thread")
        thread.start_new_thread(Download_Soho,(self.Config,))       

    def Buttons(self):
        exit_button = Button(self.main_window, text="exit", command=self.main_window.quit)
        exit_button.pack(side=LEFT, fill=X, anchor=N)

        about_button = Button(self.main_window, text="about", command=self.Get_About)
        about_button.pack(side=LEFT, fill=X, anchor=N)

        dl_button = Button(self.main_window, text="download", command=self.Get_Soho)
        dl_button.pack(side=LEFT, fill=X, anchor=N) 

    def Status_Widget(self):
        self.status_frame = Frame(self.main_window, bd=1, relief=SUNKEN)
        self.status_frame.pack(side=LEFT, expand=1, fill=X, anchor=N)
        self.msg_textvar = StringVar()
        self.msg_textvar_Label = Label(self.status_frame, font="Arial 10", fg="#357196", justify=LEFT,
                                       textvariable=self.msg_textvar, anchor=W,).pack(side=TOP, expand=0, fill=X, anchor=N)

        self.ico_frame = Frame(self.main_window, bd=1, relief=SUNKEN, width="20", height="20", background="#0000ff")
        self.ico_frame.pack(side=LEFT, expand=0, fill=X, anchor=N)

    def Print_MSG(self, msg, Type="READY", breaktime=2):
        """
          Gibt eine Nachricht an die Status Zeile.
          breaktime ist die pause nach jeder MSG in sec.
          OK, READY, ERROR
        """
        if Type == "ERROR":
            self.ico_frame["background"] = "#cc0000"
        elif Type == "READY":
            self.ico_frame["background"] = "#0000ff"
        elif Type == "OK":
            self.ico_frame["background"] = "#00cc00"
        else:
            self.ico_frame["background"] = "#000000"
            
        self.msg_textvar.set(msg)
        self.status_frame.update_idletasks()
        self.status_frame.update()
        self.Log_Fp.write(msg + "\n")
        time.sleep(breaktime)    



Run = SOHO(Config)
Run.main_window.mainloop()

Zuletzt geändert von XT@ngel am Montag 24. Januar 2005, 17:17, insgesamt 2-mal geändert.
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Ich hab nochmal ein Update gemacht (siehe oben) :)
MfG
Andreas
Benutzeravatar
arT2
User
Beiträge: 10
Registriert: Sonntag 24. Oktober 2004, 18:33
Kontaktdaten:

wow!! sehr geil geworden deine version! genau sowas in der art habe ich mir vorgestellt. aber bis meins so ansehlich aussehen wird... hehe.

auf jedenfall vielen dank für deinen code. er hat mir ein paar sachen klar gemacht. deshalb habe ich vorerst keine fragen dazu.

ich versuche jetzt das ganze nochmals neu zu machen. mal schauen wie das resultat aussieht.

ah und, sry, aber es ist mir schon wieder passiert das ich nicht gemerkt habe das ich gar nicht eingeloggt bin. auf diesem board werden meine cookies anscheinend nicht richtig gesetzt. naja nicht schlimm.


danke nochmals! dein programm läuft bei mir jetzt bis meins besser wird *g*
Benutzeravatar
arT2
User
Beiträge: 10
Registriert: Sonntag 24. Oktober 2004, 18:33
Kontaktdaten:

so, das ging schneller als ich dachte.
es ist wirklich besser bzw. logischer es ohne tkinter zu machen.
ich habe mir den teil beim dateivergleich abgeschaut und in der doku nachgelesen. ich denke alleine wär ich nicht so schnell auf dieses snippet gekommen.

jetzt kann man's richtig schön per taskmanager benutzen.

danke :)

Code: Alles auswählen

#! /usr/bin/env python

import httplib, time, thread, os
from time import gmtime, strftime

###########################################################################
# modul   : soho.py
# version : 0.3
# autor   : arT2 (tripz.ch)
# python  : Python 2.3 (#46, Jul 29 2003, 18:54:32)
#
# To-Do:
# - error messages.
#
# Special Thanks:
# - to python-forum.de wich have a huge number of interesting postings!
# - to XT@ngel from python-forum.de for his help in comparing files.
###########################################################################

### CONFIGURATION #########################################################
# soho file fetch:
host = "sohowww.nascom.nasa.gov"      # without http://
path = "/data/realtime/eit_304/1024/" # with start+end slash!
file = "latest.gif"                   # full filename
# local saved file:
output_ft   = "gif"                   # filetype (ex. gif)
output_path = "F:\\pics\\daily soho"  # local save path (use double \\ but no end slash)
### END CONFIGURATION #####################################################





print """
###########################################
# SOHO Fetcher :)                         #
# simple python script by arT2 (tripz.ch) #
#                                         #
# soho?? http://sohowww.nascom.nasa.gov   #
###########################################
"""

""" connect """
print "connecting to: " + host
conn = httplib.HTTPConnection(host)
print "connected.\n"

""" request image """
print "search file " + file + " in: " + path
conn.request("GET", path + file)
statusmsg = conn.getresponse()
print "file '" + file + "' found.\n"

""" compare last local and latest remote file """
# ex. Mon, 24 Jan 2005 08:46:00 GMT
print "compare last local and latest remote file..."
last_modified = statusmsg.getheader("last-modified")
last_modified = time.strptime(last_modified, "%a, %d %b %Y %H:%M:%S %Z")
output_fn = time.strftime("%d_%b_%Y-%H_%M_%S", last_modified)

if os.path.exists(output_path + "\\" + output_fn + "." + output_ft) == 0:
    """ create output file """
    print "downloading/saving file '" + file + "' to: " + output_path + "\\"
    f = open(output_path + "\\" + output_fn + "." + output_ft, "wb")

    """ save output file """
    if statusmsg.reason == "OK":
        f.write(statusmsg.read())
        print "file '" + file + "' saved as: " + output_fn + "." + output_ft
    """ close file """
    f.close()
    print "file closed.\n"
else:
    print "there's no new image!\n"

conn.close()
print "connection closed."

print """exit in 5 seconds...

###########################################"""
time.sleep(5)
Benutzeravatar
arT2
User
Beiträge: 10
Registriert: Sonntag 24. Oktober 2004, 18:33
Kontaktdaten:

mittlerweile hab' ich's geschafft jeden monat einen neuen ordner zu erstellen :roll:

http://tripz.ch/blackbox/soho.py
[size=67][url=http://www.tripz.ch]dirty[/url] & [url=http://s-s-s.ch]secret[/url][/size]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und hier noch meine Version :idea:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
XT@ngel als Gast

War dir wieder langweilig :wink: . Aber nicht schlecht :)
MfG
Andreas
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

XT@ngel als Gast hat geschrieben:War dir wieder langweilig :wink: .

Ja, aber eigentlich hatte ich das schon länger geplant und diesen Thread im Hinterkopf, aber da haben mich zwischendrin noch einige Projekte angesprungen, die unbedingt vorher realisiert werden mussten.
XT@ngel als Gast hat geschrieben:Aber nicht schlecht :)
Danke 8)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

hi ihrz!
ich wollte das auchmal ausprobieren, aber ich bekomme nur diesen Fehler:

Code: Alles auswählen

Unhandled exception in thread started by 
Traceback (most recent call last):
  File "I:/Pythonzeug/soho.py", line 23, in __init__
    conn.request("GET", Config["path"] + Config["file"])
  File "C:\Python23\lib\httplib.py", line 718, in request
    self._send_request(method, url, body, headers)
  File "C:\Python23\lib\httplib.py", line 740, in _send_request
    self.endheaders()
  File "C:\Python23\lib\httplib.py", line 712, in endheaders
    self._send_output()
  File "C:\Python23\lib\httplib.py", line 597, in _send_output
    self.send(msg)
  File "C:\Python23\lib\httplib.py", line 564, in send
    self.connect()
  File "C:\Python23\lib\httplib.py", line 548, in connect
    raise socket.error, msg
socket.error: (10061, 'Connection refused')
könnt ihr mir sagen warum ich diese exception bekomme?
gruß jAN
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sieht aus als könnte sich das Programm nicht mit dem Server verbinden. Könnte es sein, dass du einen Proxy brauchst? Oder die Firewall geblockt hat?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

ja da is so ein dicker fetter proxy vorm Netz
kannst du mir da vielleicht helfen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mit httplib scheint das gar net mit proxy zu gehen, mein SOHO fetcher schluckt auch proxies *g*.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

XT@ngel hat geschrieben:Hallo gefällt mir,
aber du könntest den Download als Thread starten, dann hängt TK nicht während des Downloads und das mit dem text in "real-time" anzeigen, hat sich dann auch erledigt.

mfg
Andreas
es wär auch mir der funktion update möglich gewesen . . . in seinem fall hieße das also root.update() hinter jede status_text.insert( . . . )
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Ihr könnt auch einfach ein "If-Modified-Since: ...." in den HTTP-Header schreiben, dann bekommt ihr entweder das neue Bild zurück (inklusive Timestring im Last-Modified-Feld des Headers) oder einen 304
Zuletzt geändert von Joghurt am Samstag 23. Juli 2005, 19:47, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ist das HTTP 1.0 oder 1.1?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Sollte eigentlich schon bei 1.0 dabei gewesen sein...
BlackJack

Gibt's schon in HTTP 1.0: RFC1945 Abschnitt 10.9
Antworten