Download von einem Hoster:
1. Aus Fritzload/lib/hoster sich einen Hoster als template kopieren. Meist gibt es schon ähnliche fertig.
2. Hoster besuchen und den Ablauf durchspielen, dabei alle Seiten lokal speichern um sie auswerten zu können. Dabei darauf achten ob das Ganze auch ohne Cookies und/oder Javascript geht.
3. Anfangen das Plugin zu schreiben. Hier am Beispiel des (noch) nicht funktionierenden Oneclickhoster mediafire:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #!/bin/ash # ACHTUNG dieses Plugin funktioniert nicht, da mediafire die Links mit javascript schützt!!! # Es zeigt aber trotzdem den generellen Ablauf eines Pluginbaus... # vorweg kurzer Aufbau des mediafiredownloads: # 1. url in Downloadliste sieht etwa so aus: http://www.mediafire.com/?a1bc3d5e67fg # 2. downloadurl sieht etwa so aus: http://download203.mediafire.com/ganopmxp1s1g/a1bc3d5e67fg/test.pdf mediafire() { #pluginname local filename url f=$tmp/response.htm #ein paar Variablen, in $f ist später z.B. die Serverantwort gespeichert # Hauptschleife, versucht wie in config-mal angegeben oft runterzuladen ($retries) while [ $try -lt $retries ]; do try=$(($try+1)) #zählt die Versuche hoch # holt die url aus der downloadliste und lädt die Antwort in $f GET "$param" $f - "GET1" || { reconnect; continue; } # am besten geht der Aufbau wenn man das Ganze auf der Kommandozeile (Unix, MacOSX) mitspielt # (mit "set" kann man die Variablen auslesen) # bis jetzt ist filename und downloadurl unbekannt und muss nun extrahiert werden, # das schlimmste ist hierbei die Einarbeitung in sed... # (siehe hierzu auch Beispiel weiter unten!) url="$(grep "Click here to start download" $f \ | sed -n 's,.*;\" [^>]*href=\"\([^\"]*\)[^>]*> Click.*,\1,p')" filename="$(echo $url | sed -e 's/http.*\///g')" if [ -z $url ];then #wenn url NICHT deklariert dann # schreibe in LOG-Ausgabe print "FAILED: Could not resolve download URL" return 1 # gib Fehler zurück fi # teste ob schonmal runtergeladen alreadyLoaded "$targetdir/$filename" && return # starte download von $url und speichere unter $filename if download "$url" "$filename";then break # wenn fertig mit runterladen breche die Hauptschleife ab fi reconnect # ggf. reconnect auslösen done |
4. Fertiges shell-file (hostername.sh) nach Fritzload/lib/hoster/ kopieren. Wichtig ist da es den selben Namen wie der Hoster trägt, damit aus den Downloadlinks der richtige Hoster dynamisch erkannt wird. Und ggf. wenn es geht in Fritzload/html/hosterlist.txt.
5. Testen und freuen. Entweder ins Forum stellen oder in den svn hochladen.
An die Hosterautoren: Ihr müsst Euch genauere Gedanken machen, wann Ihr einen Reconnect unbedingt braucht, und wie Lange auf diesen Reconnect gewartet werden sollte... Im Moment wird bei irgendeinem Problem ein Reconnect ausgelöst. Man müsste anhand des Problems einen passenden Reconnect setzen (also entweder sofort: "needReconnect 0" oder mit einer Wartezeit in Minuten, falls kein Reconnect im Moment möglich ist "needReconnect 30").
Und generell, bitte den Programmcode ordentlich formatieren (Tabulatoren nur für das Einrücken verwenden und nicht als Leerzeichen missbrauchen...)
Erklärung des oben gezeigten Kommandos, hier nochmal zur Erinnerung:
url="$(grep "Click here to start download" $f | sed -n 's,.*;\" [^>]*href=\"\([^\"]*\)[^>]*> Click.*,\1,p')
Der Ausschnitt der sehr langen Zeile die grep oben findet sieht so aus:
... is starting.. ';" href="http://download203.mediafire.com/ganopmxp1s1g/nm0xmjqmgg5/test.pdf">
Click here to start download..</a></div> ...
das übergibt grep per pipe an sed das nun genau diesen Link extrahiert:
http://download203.mediafire.com/ganopmxp1s1g/nm0xmjqmgg5/test.pdf
Etliche Funktionen zur String Verarbeitung (oftmals per sed realisiert) finden sich in der Library: lib/util_string.sh
Im Netz sind zu sed auch viele gute Tutorials zu finden.
http://www.faqs.org/faqs/editor-faq/sed/
http://sed.sourceforge.net/grabbag/scripts/
Bei vielen Hostern wird zur Zeit reCAPTCHA verwendet. Deshalb liefert Fritz!Load einige Funktionen mit, die den Umgang mit reCAPTCHA vereinfachen. Sämtliche bereitgestellten Funktionen finden sich in der Library lib/captcha_service.sh
Zuerst sollte geprüft werden, ob überhaupt Captchas gelöst werden können (über die GUI oder einen der Captcha Service Dienste). Falls nicht kann der Download direkt beendet werden.
captcha_service_active || return 1
Wenn man den public_key aus der Seite ermittelt hat kann man das Captcha lösen lassen:
set_recaptcha_solution "$public_key" || continue
Sie belegt im Erfolgsfall die Variablen $CHALLENGE und $CAPTCHA_STRING mit dem Wert des "recaptcha_challenge_field" und der Lösung des Captchas "recaptcha_response_field". Falls ein Fehler bei der Lösungsermittlung auftritt, sorgt der Befehl continue dafür, dass ein neuer Dowloadversuch gestartet wird. Zu beachten ist, das die Rückgabewerte noch nicht encoded sind, für die Parameterübergabe per curl sollten daher diese Werte entsprechend encodiert werden:
recaptcha_challenge_field=$(urlencode "$CHALLENGE")&recaptcha_response_field=$(urlencode "$CAPTCHA_STRING")
Um den public_key aus dem HTML Dokument zu erhalten, gibt es folgende Funktion - sofern die oft bei den Hostern integrierte Syntax verwendet wird.
public_key=$(parse_recaptcha_challenge $f)
Es sollte nun noch mitgeteilt werden, ob das Captcha richtig gelöst wurde. Bei richtiger Lösung geht das mit
captcha_correct
und bei falscher Lösung mit
captcha_wrong