[C/C++] libcurl Cookies

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von chokola, 5. Juni 2010 .

Schlagworte:
  1. 5. Juni 2010
    libcurl Cookies

    Hi,

    folgendes Problem:

    Ich will mir einen eigenen Client für ochload.org schreiben weil der mitgelieferte bei mir einige Probleme macht. Jetzt habe ich aber folgendes Problem:

    wenn man auch ochload.org/index.php geht kommt ja erst mal eine Seite wo man die Felder "nick" und "pass" ausfüllen muss. Soweit so gut, an der Stelle gibt es noch kein Problem. Nachdem man das aber submitted hat kommt man ja wieder auf die index.php, diesmal aber mit anderem Inhalt(Ein Feld wo man eine URL auf eine Datei bei einem Filehoster reinhauen kann.).

    Die Frage ist jetzt: Wie schaffe ich es, dass libcurl checkt, dass ich nochmal die selbe URL, aber mit anderem Inhalt will? (Ich nehme mal an dass der ausgelieferte Inhalt anhand eines Cookies bestimmt wird, ich müsste es also irgendwie schaffen, dass ich nach dem Login das(den?) Cookie in eine Variable(oder eine Datei) speichere und diese(n/s) dann mitsende. Das senden von Cookies geht ja laut der offiziellen libcurl Seite mit

    Code:
    curl_easy_setopt(easyhandle, CURLOPT_COOKIE, "name1=var1; name2=var2;");
    Jetzt ist aber die Frage, wie ich Cookies, die bei einer Anfrage generiert werden, speichere.
     
  2. 5. Juni 2010
    AW: libcurl Problem

    Mithilfe von cookiefile und cookiejar

    http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTCOOKIEFILE
    http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTCOOKIEJAR
     
  3. 5. Juni 2010
    AW: libcurl Problem

    Wenn du sie nur für einen einzelnen Programmaufruf brauchst (also nicht auf der Festplatte speichern willst), dann reicht es, für CURLOPT_COOKIEFILE einfach einen leeren String zu übergeben. Damit speichert libcurl die Cookies einfach im Speicher.

     
  4. 6. Juni 2010
    AW: libcurl Cookies

    Mein Quellcode sieht jetzt so aus:

    Code:
    #include <stdio.h>
    #include <string.h>
    
    #include <curl/curl.h>
    #include <curl/types.h>
    #include <curl/easy.h>
    
    #define DEBUG
    #ifdef DEBUG
    #include <windows.h>
    #endif
    
    int main(int argc, char *argv[])
    {
     CURL *curl;
     CURLcode res;
    
     struct curl_httppost *formpost=NULL;
     struct curl_httppost *lastptr=NULL;
     struct curl_slist *headerlist=NULL;
     static const char buf[] = "Expect:";
    
     curl_global_init(CURL_GLOBAL_ALL);
    
     /* Fill in the file upload field */
     curl_formadd(&formpost,
     &lastptr,
     CURLFORM_COPYNAME, "nick",
     CURLFORM_COPYCONTENTS, "nickname", //Meinen Nickname hab ich vor dem posten des Quellcodes natürlich zensiert
     CURLFORM_END);
    
     /* Fill in the filename field */
     curl_formadd(&formpost,
     &lastptr,
     CURLFORM_COPYNAME, "pass",
     CURLFORM_COPYCONTENTS, "passwort", //Auch das Passwort ist hier zensiert
     CURLFORM_END);
    
    
     /* Fill in the submit field too, even if this is rarely needed */
     curl_formadd(&formpost,
     &lastptr,
     CURLFORM_COPYNAME, "login",
     CURLFORM_COPYCONTENTS, "Einloggen",
     CURLFORM_END);
    
     curl = curl_easy_init();
     /* initalize custom header list (stating that Expect: 100-continue is not
     wanted */
     headerlist = curl_slist_append(headerlist, buf);
     #ifdef DEBUG
     printf("Step 0\n");
     system("Pause");
     #endif
     if(curl) {
     /* what URL that receives this POST */
     curl_easy_setopt(curl, CURLOPT_URL, "http://www.ochload.org/index.php");
     curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
     if ( (argc == 2) && (!strcmp(argv[1], "noexpectheader")) )
     /* only disable 100-continue header if explicitly requested */
     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
     curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
     #ifdef DEBUG
     printf("Step 1\n");
     system("Pause");
     #endif
     res = curl_easy_perform(curl);
     curl_formfree(formpost);
    
     }
    
     #ifdef DEBUG
     printf("Step 2\n");
     system("Pause");
     #endif
     curl_formadd(&formpost,
     &lastptr,
     CURLFORM_COPYNAME, "url",
     CURLFORM_COPYCONTENTS, argv[1],
     CURLFORM_END);
    
     #ifdef DEBUG
     printf("Step 3\n");
     system("Pause");
     #endif
    
     if(curl)
     {
     curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
     #ifdef DEBUG
     printf("Step 4\n");
     system("Pause");
     #endif
     res = curl_easy_perform(curl);
     }
    
     #ifdef DEBUG
     printf("Step 5\n");
     system("Pause");
     #endif
    
     curl_easy_cleanup(curl);
     curl_slist_free_all (headerlist);
     curl_formfree(formpost);
     return 0;
    }
    Allerdings crasht das Programm an folgender Stelle:

    Der String "Step 4\n" wird ausgegeben, dann wird "Drücken Sie eine beliebige Taste . . ." ausgegeben und nachdem ich Enter drücke stürzt es ab.
     
  5. 6. Juni 2010
    AW: libcurl Cookies

    Hast dus schonmal ohne das system("pause"); probiert?
    Warum willst du da überhaupt probieren?

    Ich würde das mal entfernen und dann den Wert von "res" ausgeben lassen.
     
  6. 8. Juni 2010
    AW: libcurl Cookies

    Nein, aber das macht ja (außer einem kurzen Halt zwischendrin) keinen Unterschied im Ablauf

    Warum ich das Programm schreiben will steht im ersten Post.
    Warum ich system("Pause") benutze: Um besser debuggen zu können.

    An welcher Stelle?
     
  7. 21. Juni 2010
    AW: libcurl Cookies

    Oh sorry, habe deinen Post übersehen.

    Ich finde die Verwendung von system("pause"); sinnlos zum debuggen, da du ja die printf()-Anweisungen drin hast. Im Moment hast du vor dem curl_easy_perform() eine Ausgabe von "Step 4" und nachdem Aufruf eine Ausgabe von "Step 5". Da braucht es doch keine Pause, denn du siehst ja wos hakt, je nachdem ob "Step 5" ausgegeben wird oder nicht.

    Wenn du wirklich debuggen willst (was vllt. auch helfen könnte), dann kannst du ja mit einem Debugger (z.B. der in Visual C++ integrierte oder gdb) benutzen. Dann kannst du jede Programmzeile einzeln durchlaufen und auswerten.

    Den Wert von res sollst du dir direkt nach dem curl_easy_perform() ausgeben lassen. curl_easy_perform() gibt nämlich einen Wert zurück, der angibt, ob der Aufruf funktioniert hat oder fehlgeschlagen ist (Netzwerkprobleme, Protokollprobleme etc). In der Datei <curl/curl.h> stehen die Fehlerkonstanten mit Beschreibung (du kriegst ja nur nen Zahlenwert zurück). Alternativ könnte es auch helfen, die Option CURLOPT_ERRORBUFFER zu setzen. Dann kriegst du einen String als Fehlermeldung zurück, den du ebenfalls auswerten lassen kannst.
     
  8. 25. Juni 2010
    AW: libcurl Cookies

    Hey

    wenns dir nur darum geht, von OCHLoad über deinen eigenen Client zuladen, schreib mir mal ne PN. Dann geb ich dir Zugriff auf unsere Api.

    Wenns dir darum geht, das so hinzukriegen, kann ich nicht helfen

    E: Wobei, ich poste hier mal die Api-Daten:

    http://www.ochload.org/?api&nick=$1&pass=$2&url=$4

    $1 = Base64 Username
    $2 = Base64 Passwort
    $4 = Base64 Url

    ->"Authentification failed!" -> Login fehlgeschlagen
    ->"Invalid Link" -> Fehlerhafter Link
    ->Traffic exceeded!" -> Traffic verbraucht (Nur bei RS Links)
     
  9. 27. Juni 2010
    AW: libcurl Cookies

    Nochmal mein Ansatz dazu:

    Ich hätte beim Login die Cookies ausgelesen,
    sprich mir nur den Header angeguckt, nicht den Body, dann den Cookie-teil gefiltert und in eine Var gespeichert.
    Danach einfach mit CURLOP_COOKIE, var dengesamten Header-Cookie-part übergeben und gut ist.
    So klappt es bei mir jedenfalls ohne Probleme (allerdings beziehe ich heir gerade nicht c/c++, sondern eher php und vb.net )
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.