NETLOG Profilbild Download-Manager

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
m477hi45
User
Beiträge: 33
Registriert: Sonntag 30. Mai 2010, 05:41

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ü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.
m477hi45
User
Beiträge: 33
Registriert: Sonntag 30. Mai 2010, 05:41

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 ;)
m477hi45
User
Beiträge: 33
Registriert: Sonntag 30. Mai 2010, 05:41

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..
m477hi45
User
Beiträge: 33
Registriert: Sonntag 30. Mai 2010, 05:41

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
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

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.
m477hi45
User
Beiträge: 33
Registriert: Sonntag 30. Mai 2010, 05:41

Vielen Dank für das Code-Snipple ;)

Funktioniert das also auch mit Linux und MAC ?

lg
m477hi45
User
Beiträge: 33
Registriert: Sonntag 30. Mai 2010, 05:41

Ich bekomme bei dem Code allerdings diesen Fehler:

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


..
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ja, weil

Code: Alles auswählen

os.environ.get('HOME')
None zurück gibt
the more they change the more they stay the same
m477hi45
User
Beiträge: 33
Registriert: Sonntag 30. Mai 2010, 05:41

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 ?
m477hi45
User
Beiträge: 33
Registriert: Sonntag 30. Mai 2010, 05:41

Aja, der md5 check hat bis jetzt nur den Dateinamen, nicht den Inhalt geprüft !

Das ist jetzt mit Version 0.4 behoben > Sourceforge
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

http://paste.pocoo.org/show/220169/

Just for fun zur späten Stunde :-)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...
lunar

@Dauerbaustelle: Bilder sind Binärdateien :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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('~')
Das Leben ist wie ein Tennisball.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Unter windows existiert doch noch

Code: Alles auswählen

os.environ.get('USERPROFILE')
the more they change the more they stay the same
m477hi45
User
Beiträge: 33
Registriert: Sonntag 30. Mai 2010, 05:41

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
m477hi45
User
Beiträge: 33
Registriert: Sonntag 30. Mai 2010, 05:41

lunar hat geschrieben:@Dauerbaustelle: Bilder sind Binärdateien :)
? jede datei ist eine Binärdatei!

wieso auch nicht ?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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`.
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.
Antworten