Seite 1 von 4

NETLOG Profilbild Download-Manager

Verfasst: Sonntag 30. Mai 2010, 05:56
von m477hi45
Hallo!
Ich bin neu hier (aber nich so neu bei Python ;) ) und würde euch gerne mein aktuelles, und auch erstes größeres Proekt vorstellen.
Ich dachte, es gibt keinen besseren Ort als hier, eine Gemeinschaft deutschsprachiger, Python Programmierer.
Denn ich habe mein Projekt als Opensource Programm gestartet und da mit anscheinend doch noch Kenntnisse in Python fehlen, ist das Programm noch nicht mal ganz fertig:

Hier der aktuelle Stand:
https://sourceforge.net/projects/netlogdownload/

Die ".py" Datei ist reichlich kommentiert.

Eine kurze Beschreibung, was das Programm eigentlich tut:
Es ist eigentlich nur für Mitglieder der Social Community NETLOG (http://de.netlog.com) von Nutzen.
- Man gibt einen Nicknamen dieser Community in das Programm ein (dabei muss man selbst nicht registriert sein)
- Das Skript läd dann den HTML Code des entsprechenden Profils herunter und filtert die URL des Profilbildes heraus.
- 2 Buchstaben in dieser URL werden noch ersetzt, damit aus dem Vorschaubild ein großes Bild wird.
- Dieses wird dann lokal gespeichert.


Was ich noch gerne einbauen würde:
- Eine überprüfung ob man überhaupt eine Internet Verbindung hat (derzeit kommt noch eine unschöne Warnmeldung von urllib)
- Dass sich das heruntergeladene Bild nach dem Herunterladen einfach im Standardprogramm öffnet.
- und ein paar andere Sachen, die im Forum von Sourceforge nachzulesen sind..

Aja, hier der Paste: http://paste.pocoo.org/show/JyyCzuhEUTwdodYGSCz6/


lg

Re: NETLOG Profilbild Download-Manager

Verfasst: Sonntag 30. Mai 2010, 09:52
von sma
Über Sinn oder Unsinn eines Programms zum Speichern von Bildern möchte ich nicht urteilen. Aber ein paar Tipps zum Quelltext, der eigentlich schon okay ist.

`import ctypes` ist unnötig. Das Modul `string` ist deprecated, schon seit vielen Jahren sind `tolower` und `strip` Methoden von String-Objekten. Dass das Programm dank der Aufrufe mit `os.system` und den Pfaden mit `C:\\` unnötigerweise hochgradig Windows-spezifisch ist, muss ich nicht wirklich erwähnen. Der leere String bei `wait=raw_input('')` ist unnötig. Die ganze Zeile ist eigentlich nur unter Windows nötig und ansonsten störend.

Die for-Schleife in Zeile 51 kann einfach `for char1 in nickname:` lauten. Der Test (ein `if` hat übrigens keine Klammern in Python) kann `if char1 in "!?/\\$'\"<>..."` lauten. Und was soll die `1` im Namen? Die Liste der Zeichen ist schon wieder Windows-spezifisch. Ich weiß so aus dem Stegreif nicht, ob man plattformunabhängig in Python prüfen kann, ob ein Dateiname gültig ist. Java könnte es.

Konstanten (wie `baseurl`) sind eigentlich eine gute Idee, doch wenn, dann besser am Programmanfang und den Namen in als Konvention in GROSSBUCHSTABEN. Übrigens, es freut bestimmt netlog-User, dass der Betreiber sie vom User gewählten privacy-Einstellungen bzgl. des Bilds nicht korrekt umsetzt.

Ressourcen wie Dateien oder auch URLs besser mit `with` öffnen, dann kann man auch das Schließen nicht vergessen. Jetzt ist nicht schön, dass das `exit` aus dem Programm haut, wenn `f.close()` noch nicht erfolgt ist (nicht schlimm, dass Betriebssystem räumt für einen auf, aber schlechter Stil IMHO).

Aus `raw_input` schließe ich Python 2.x. Da ist `print` ein Befehl, keine Funktion und braucht keine Klammern. Und lasse auch die `;` weg. Das hier ist kein C{++,#} oder Java.

Der Test auf `post==-1` (Leerzeichen rechts und links von Operatoren dankt einem jeder Leser) sollte stattfinden, bevor `link` berechnet wird. Vielleicht wäre hier auch ein regulärer Ausdruck einfacher. Insbesondere, wo später noch auch `.jpg` gesucht wird.

Und `==True` geht GAR NICHT. So überhaupt nicht. Boolsche Werte nochmals mit einem Boolschen Wert zu vergleichen (Zeile 100) ist stottern. Wo will man aufhören? `if (((a == 5) == True) == True) == True`? Oder noch ein `==True`? In Zeile 20 und 22 war es doch richtig.

PS: Statt 114 Zeilen Python hätte man auch "einfach" (für Posterous) folgendes machen können ;)

Code: Alles auswählen

curl -O `curl -s -L http://blog.posterous.com/ | grep -m 1 -o -P '(?<=src=")http://files.posterous.com/user_profile_pics/[^"]*'`
Es richtig in Python zu machen wird aber schon wieder schwerer, denn man müsste eigentlich das Encoding beachten und je nachdem, ob das wohl XHTML oder nur HTML ist, im ersten Fall noch mal das XML dekodieren. Da nimmt man dann besser einen HTML-Parser wie mal ihn in lxml (muss man leider als Paket nachinstallieren) findet. Dafür kann man dort dann auch ählich wie bei JQuery mit CSS-Selektoren nach Dingen im DOM suchen.

Re: NETLOG Profilbild Download-Manager

Verfasst: Sonntag 30. Mai 2010, 10:14
von m477hi45
Also viel Dank einmal für die ganzen Tipps.

Also ich habe schon vor, das Programm plattformunabhängig zu machen, nur an welchem Ort sollte ich die Bilder dann speichern ?
Bei Windows ist eben: C:\users\name\pictures, am naheliegensten, bei linux wahrscheinlich ./home/name/bilder/ .. kann ich eine Abfrage machen um welches Betriebsystem es sich handelt ?
Und ja, ich weiß, dass das wait=raw_input('') nur auf Windows notwenig ist.. aber das benutzen nun mal die meisten .. nichteinmal auf Windows ist die Zeile unbedingt notwendig, wenn man das Programm in der Konsole startet..
Danke für die Verkürzung der Schleife, aber die liste ist NICHT Windows spezifisch.
Der Filter hat nichts mit dem Dateinamen zu tun, sondern vielmehr mit dem NETLOG Nicknamen, der gewisse Sonderzeichen gar nicht enthalten kann.
(Wobei du doch recht hast, sekundär wird so auch verhindert einen ungültigen Dateinamen zu wählen..)

Und ja, das mit den privacy-Einstellungen von NETLOG ist interessant, .. Ich habe den Support schon vor Monaten darauf aufmerksam gemacht, und sie meinen man könne auch in den AGB nachlesen, dass gewisse Basisinformationen (Profilbild, Alter, Geschlecht) für jeden sichtbar sind.

Wegen den Klammern beim print, tut mir leid .. ich hab in letzte Zeit sehr viel in C Programmiert und bin erst auf Python umgestiegen..


Danke nochmal, und ich werde nochmal alles überarbeiten ;)

Re: NETLOG Profilbild Download-Manager

Verfasst: Sonntag 30. Mai 2010, 10:36
von m477hi45
Hier mal das was ich auf die schnelle verändert habe:

Neu:
http://paste.pocoo.org/show/MseHYPkCwfMH9NGLa4hp/

Das wegen dem plattformabhängigen Dateipfad kommt auf jeden Fall noch..

Re: NETLOG Profilbild Download-Manager

Verfasst: Sonntag 30. Mai 2010, 16:42
von m477hi45
Die aktuelle Version (0.2) funktionier übrigens schon auf Linux ;)
(siehe Sourceforge)

Ich hab bis jetzt nur Windows und Linux realisiert (weitere kommen):

Code: Alles auswählen

if os.name=="nt":		#windows NT
	pfad="C:\\users\\"+USER+"\\pictures\\NETLOG DOWNLOADS\\";
if os.name=="posix":		#linux
	pfad="/home/"+USER+"/bilder/NETLOG DOWNLOADS";

außerdem habe ich eine md5 überprüfung der Bilder eingebaut..

lg

Re: NETLOG Profilbild Download-Manager

Verfasst: Sonntag 30. Mai 2010, 18:17
von DaMutz
Was ist wenn du Windows XP hast, dann gibt es den users Ordner nicht...

Dies wäre besser:

Code: Alles auswählen

pfad = os.path.join(os.environ.get('HOME'), "pictures", "NETLOG DOWNLOADS", "")
und noch Platformunabhängiger.

Re: NETLOG Profilbild Download-Manager

Verfasst: Sonntag 30. Mai 2010, 18:23
von m477hi45
Vielen Dank für das Code-Snipple ;)

Funktioniert das also auch mit Linux und MAC ?

lg

Re: NETLOG Profilbild Download-Manager

Verfasst: Sonntag 30. Mai 2010, 18:27
von m477hi45
Ich bekomme bei dem Code allerdings diesen Fehler:

assert len(path) > 0
Object of type 'NonType' has no len()


..

Re: NETLOG Profilbild Download-Manager

Verfasst: Sonntag 30. Mai 2010, 18:32
von Dav1d
Ja, weil

Code: Alles auswählen

os.environ.get('HOME')
None zurück gibt

Re: NETLOG Profilbild Download-Manager

Verfasst: Sonntag 30. Mai 2010, 18:34
von m477hi45
Dav1d hat geschrieben:Ja, weil

Code: Alles auswählen

os.environ.get('HOME')
None zurück gibt
ganz genau.. was kann man dagegen machen ?
Bzw. wie verwende ich den Code dann ?

Re: NETLOG Profilbild Download-Manager

Verfasst: Sonntag 30. Mai 2010, 19:46
von m477hi45
Aja, der md5 check hat bis jetzt nur den Dateinamen, nicht den Inhalt geprüft !

Das ist jetzt mit Version 0.4 behoben > Sourceforge

Re: NETLOG Profilbild Download-Manager

Verfasst: Sonntag 30. Mai 2010, 23:58
von Dauerbaustelle
http://paste.pocoo.org/show/220169/

Just for fun zur späten Stunde :-)

Re: NETLOG Profilbild Download-Manager

Verfasst: Montag 31. Mai 2010, 04:47
von snafu
Hier mal der Versuch, alle Möglichkeiten zum Finden des Home-Pfads auszuschöpfen:

Code: Alles auswählen

import os

def get_home(default=None):
    # os.getenv is not available on some systems
    getenv = os.environ.get
    # windows
    homepath = getenv('HOMEPATH')
    if homepath:
        return os.path.join(getenv('HOMEDRIVE'), homepath)
    # others
    return getenv('HOME') or default
Ich kann jetzt allerdings nicht sagen, ob es auf nem Mac Abweichungen gibt...

Re: NETLOG Profilbild Download-Manager

Verfasst: Montag 31. Mai 2010, 08:40
von lunar
@Dauerbaustelle: Bilder sind Binärdateien :)

Re: NETLOG Profilbild Download-Manager

Verfasst: Montag 31. Mai 2010, 10:04
von EyDu
snafu hat geschrieben:Hier mal der Versuch, alle Möglichkeiten zum Finden des Home-Pfads auszuschöpfen:
Man könnte auch noch folgendes versuchen:

Code: Alles auswählen

os.path.expanduser('~')

Re: NETLOG Profilbild Download-Manager

Verfasst: Montag 31. Mai 2010, 13:13
von Dav1d
Unter windows existiert doch noch

Code: Alles auswählen

os.environ.get('USERPROFILE')

Re: NETLOG Profilbild Download-Manager

Verfasst: Montag 31. Mai 2010, 13:28
von m477hi45
EyDu hat geschrieben:
snafu hat geschrieben:Hier mal der Versuch, alle Möglichkeiten zum Finden des Home-Pfads auszuschöpfen:
Man könnte auch noch folgendes versuchen:

Code: Alles auswählen

os.path.expanduser('~')

Danke, auf das selbe bin ich gestern auch gekommen und habe es in der 0.6 Version jetzt
drinnen ;)
Ob es sich um Windows oder Linux handelt muss trozdem abgefragt werden, weil ja windows Backslash's und Linuxs Slashs verwendet..
Hat wer ne Ahnung wies bei MAC aussieht ?

Nicht wundern> mit dieser Version habe ich auch gleich alles auf englisch übersetzt.



lg

Re: NETLOG Profilbild Download-Manager

Verfasst: Montag 31. Mai 2010, 13:29
von m477hi45
lunar hat geschrieben:@Dauerbaustelle: Bilder sind Binärdateien :)
? jede datei ist eine Binärdatei!

wieso auch nicht ?

Re: NETLOG Profilbild Download-Manager

Verfasst: Montag 31. Mai 2010, 13:51
von cofi
m477hi45 hat geschrieben:Ob es sich um Windows oder Linux handelt muss trozdem abgefragt werden, weil ja windows Backslash's und Linuxs Slashs verwendet..
Es gibt `os.path.join` und `os.path.sep`.

Re: NETLOG Profilbild Download-Manager

Verfasst: Montag 31. Mai 2010, 13:54
von lunar
@m477hi45: Ja und? Meine Anmerkung bezog sich auf den von Dauerbaustelle gezeigten Quelltext, der fehlerhaft ist, weil er Bilder nicht als Binärdateien behandelt. Korrekterweise müsste "wb" als Modus beim Öffnen der Datei angegeben werden. Unter Unix ist das zwar egal, unter Windows aber nicht.