[solved]Rapidshare API
-
Hallo,
Ich in derzeit dabei einen Downloader zu schreiben, nur so zum Spaß und zum Training..Ich habe eine eigene Klasse für Sockets geschrieben, die soweit auch funktioniert, Senden/Empfangen funktioniert einwandfrei.
Jetzt möchte ich allerdings die RapidshareApi benutzen um zu prüfen ob die eingefügten Links gültig sind.
Jedoch scheitere ich beim Kontakt mit der Rapidshare API. Die IP-Adresse des Servers wird bei jedem Programmstart neubezogen und ich erhalte auhc eine Antwort.
(Jedoch nur so ein ACK, gesehen über Wireshark).Jetzt meine Frage, was ist bei der Kommunikation mit Rapidshare anders als mit z.B. Wikipedia und wie kriege ich nun die Antwort auf mein Request?
Danke schonmal (:
Gesendetes Packet:
Wireshark:GET /cgi-bin/rsapi.cgi?sub=subroutine¶m1=value1¶m2=value2 HTTP/1.1\r\n Host: api.rapidshare.com\r\n User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10\r\n Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n Accept-Language: de-DE\r\n Accept-Encoding: gzip, deflate\r\n Cookie: enc=961AA19E114CDCFA8EEFD2FFA81BD142CD3B7F68F107F22B8B71B97B74A904E300C10269704F6FD8173019E4FE83A67A\r\n Connection: keep-alive\r\n \r\n
string bsend = "GET /cgi-bin/rsapi.cgi?sub=subroutine¶m1=value1¶m2=value2 HTTP/1.1\r\nHost: api.rapidshare.com\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10\r\nAccept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\nAccept-Language: de-DE\r\nAccept-Encoding: gzip, deflate\r\nCookie: enc=961AA19E114CDCFA8EEFD2FFA81BD142CD3B7F68F107F22B8B71B97B74A904E300C10269704F6FD8173019E4FE83A67A\r\nConnection: keep-alive\r\n\r\n";
-
Gegenfrage: Was hat das mit C++ zu tun?!
-
Nunja, da das Packet dem aus meinem Browser entspricht gehe ich davon aus, das mein Problem irgendwo im C++-Code liegt, womit wir wieder hier wären.
-
wunderkind schrieb:
Nunja, da das Packet dem aus meinem Browser entspricht gehe ich davon aus, das mein Problem irgendwo im C++-Code liegt, womit wir wieder hier wären.
Du hast einen sehr schönen C++ Code, wie wir sehen
Übrigens, du kennst hoffentlich diese Technik schon?
string bsend = "GET /cgi-bin/rsapi.cgi?sub=subroutine¶m1=value1¶m2=value2 HTTP/1.1\r\n" "Host: api.rapidshare.com\r\n" "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10\r\n" "Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n" "Accept-Language: de-DE\r\n" "Accept-Encoding: gzip, deflate\r\n" "Cookie: enc=961AA19E114CDCFA8EEFD2FFA81BD142CD3B7F68F107F22B8B71B97B74A904E300C10269704F6FD8173019E4FE83A67A\r\n" "Connection: keep-alive\r\n" "\r\n";
Stringliteral aufteilen, damit du nicht so einen riesigen Einzeiler hast.
Allerdings abgesehen von all dem. Ich kann mir schlecht vorstellen, dass die GET Abfrage funktionieren wird. Schon nur zum Beispiel das Cookie, dürfte nicht mehr stimmen. Wie genau hast du dich mit dem HTTP auseinander gesetzt? Hast du mal die RFCs gelesen? Wäre vielleicht mal einen Anfang.
Grüssli
-
das Cookie funktioniert und selbst wenn nicht müsste ich ja trotzdem ne Antwort erhalten..die Anfrage is mit relativ hoher Sicherheit richtig..
-
wunderkind schrieb:
das Cookie funktioniert ...
Und das weisst du woher?
wunderkind schrieb:
... und selbst wenn nicht müsste ich ja trotzdem ne Antwort erhalten ...
Wieso? Eine Anfrage darf auch unbeantwortet verworfen werden.
wunderkind schrieb:
... die Anfrage is mit relativ hoher Sicherheit richtig ...
Funktioniert aber interessanterweise nicht
Wie gesagt, liess vielleicht zuerst mal die RFCs. Für Http wäre dies zum Beispiel rfc2616. Hier kannst du die als Textfiles oder oft auch als PDF bekommen:
http://ietfreport.isoc.org/rfc-index.htmlWeiter kann ich dir schlecht helfen. Code zeigst du ja auch nicht. Und da der C++ Standard keine Sockets hast, bist du trotzdem sehr wahrscheinlich im falschen Forum.
Grüssli
-
Cookie hab ich jetzt rausgenommen bruahc man nicht unbedingt.
Meine Anfrage wird ja beantwortet, nur eben nicht vollständig
Also meine Anfrage gleicht der des Browsers ziemlich genau,
nur bekommt der ne richtige Antwort und ich nur ein ACK.Okay Sorry wenn ich im falschen Forum bin, wo wäre ich denn richtig aufgehoben?
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Webzeugs verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
wunderkind schrieb:
Cookie hab ich jetzt rausgenommen bruahc man nicht unbedingt.
Kommt darauf an, wohin du die Anfrage machst.
wunderkind schrieb:
Meine Anfrage wird ja beantwortet, nur eben nicht vollständig
Also meine Anfrage gleicht der des Browsers ziemlich genau,
nur bekommt der ne richtige Antwort und ich nur ein ACK.Zeigt meiner Meinung nach sehr gut, dass du nicht viel Ahnung hast vom ganzen. Du bekommst nämlich gar keine Antwort. Eine ACK Antwort gibt es nicht bei Http. Das einzige was ich mir vorstellen könnte ist die ACK Antwort bei TCP. Der Server meldet also, dass er die übermittelten Pakete erhalten hat, sendet dir dann aber nichts zurück. Also verwirft er die Anfrage womöglich. Oder du hast einen falschen Socket Code geschrieben für das Empfangen der Antwort. Es gibt da viele Möglichkeiten.
Wenn du eine Schnittstelle verwenden willst, was ein Protokoll ist, solltest du vielleicht zuerst mal lesen, wie man die Schnittstelle verwendet. Dokumentationen gibt es genügend.
wunderkind schrieb:
Okay Sorry wenn ich im falschen Forum bin, wo wäre ich denn richtig aufgehoben?
Rund um die Programmierung oder je nach dem was für Sockets du verwendest, ein Unterforum von dieser Bibliothek. WinAPI? MFC? VCL? Sonst was?
Edit @ Mods: Webzeugs? Das hat doch nichts mit Webzeugs zu tun?
Grüssli
-
Anfrage geht an die Rapidshare API.
mein Socket funktioniert wie gesagt wunderbar, ich kann an jeder x-beliebe Seite Anfragen senden und bekomme immer eine nette Antwort.
Also verstehe ich nicht wo das Problem bei der Rapidshare API liegt. IIcch gebe dir allerdings durchaus Recht das das ganze wenig mit C++ zutun hat, ich hoffe jedoch das mir trotzdem jemand helfen kann.
-
Ich wette du liest die Antwort irgendwie nicht richtig ein. Quasi ein Fehler im Empfangsteil.
Ich hab gerade ein wenig via telnet mit der api rumgespielt und die antworten die rapidshare da liefert sind absolut nicht kompliziert aufgebaut (d.h. "Connection: close", kein chunked-encoding, etc.)Wenn überhaupt keine Antwort vom Server kommt also nichtmal nen "400 Bad Request", ist das entweder Absicht und du bist geblocked oder der Server erwartet dass du noch Daten sendest.
Du hast also entweder die Anfrage nicht richtig verschickt (z.B. Rückgabewert von send() nicht beachtet) oder die Anfrage an sich ist irgendwo kaputt.
-
Ich wünschte es wäre so..ich find den Fehler einfach nicht..
Ich schneide ja mit Wireshark den Netzwerkverkehr mit und leider kommt da nix,
desweiteren funktioniert es ja mit anderen websites
-
Hab gerade versehentliche editiert statt neu geposted:
Wenn überhaupt keine Antwort vom Server kommt also nichtmal nen "400 Bad Request", ist das entweder Absicht und du bist geblocked oder der Server erwartet dass du noch Daten sendest.
Du hast also entweder die Anfrage nicht richtig verschickt (z.B. Rückgabewert von send() nicht beachtet) oder die Anfrage an sich ist irgendwo kaputt (z.B. beliebt ist die fehlende leere Zeile, bei dir scheinbar nicht der Fall)
-
Du hast vermutlich zu viele Requests abgesetzt. Lies mal den oberen Kommentarblock der API, dort steht doch alles beschrieben. Und wieso willst du einen Request auf "subroutine" aufrufen? Das was du suchst ist "checkfiles_v1" welcher die Parameter "files" und "filenames" annimmt, näheres musst du in der API nachschauen.
Den Cookie brauchst du nicht zum herunterladen von Dateien, das geht über Basic Auth.Gruß
-
geblocket bin ich nicht, da Anfragen über Browser funktionieren,
der Rückgabewert stimmt auch mit der größe des gesendeten über ein,
und die Anfrage ist eigentlich, weil ich dort auch den Fehler vermutet hatte,
direkt aus dem Packet vom Browser kopiert.Ja ich weiss das das eine sinnlose Abfrage ist, jedoch ist das egal denn ich bekomme weder auf diese sinnlos, noch auf die sinnvolle eine antwort, bei der sinnlosen mpsste es ja
ERROR: Invalid routine called.
sein.Ist es aber nicht, daher ist was falsch.
-
Poste doch mal was wireshark konkret sagt was du sendest, wenn du schon keinen Code zeigen willst
-
Wie ich in einem anderen Thread schon beschrieb, kann man die Fehlerursache gaz unten angehen: Du hast es mit einem Browser getestet, welcher genau diese Anfrage sendet, und er bekommt eine Antwort - nun probier's mal ueber Telnet. Wenn das funktioniert, ist definitiv etwas an deinem Programm nicht in Ordnung.
Anfragen werden unter gleichen Voraussetzungen stets gleich behandelt und entsprechend beantwortet. Wenn du Unterschiede zwischen deinem Programm udn einem Browser erkennen kannst, sind die Voraussetzungen nicht gleich.
Wenn du mal deinen Code zeigen koenntest, wuerden hier sicher einige den besagten Fehler auffinden koennen.
-
int main() { string bsend = "GET /cgi-bin/rsapi.cgi?sub=subroutine¶m1=value1¶m2=value2 HTTP/1.1\r\n" "Host: api.rapidshare.com\r\n" "Connection: Keep-Alive\r\n" "\r\n"; Client socket1((string)serverip,80); cout<<endl<<socket1.mSend(bsend)<<endl; socket1.mRec(&buffer); cout<<buffer.c_str()<<endl; }
int Client::mSend(string text){ return send(lhSocket,text.c_str(),text.length()+1,0); }
Mir fällt gerade ein kleiner Unterschied auf:
Wireshark:Data: 00
Das steht als Data in meinem Paket, im Browserpaket ist garkein Inhalt.
-
wunderkind schrieb:
Client socket1((string)serverip,80); //... socket1.mRec(&buffer); cout<<buffer.c_str()<<endl; }
serverip
undbuffer
sind nirgendwo deklariert oder definiert. Was beinhaltetserverip
, von welchem Typ istbuffer
?
-
Auch ist der Cast beim Konstruktor von Client sehr mysteriös. Du castest doch hoffentlich kein char * in einen std::string?