Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 00:24

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



LibCurl, Aktion nach Login

Discussion on LibCurl, Aktion nach Login within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Jun 2011
Posts: 225
Received Thanks: 8
LibCurl, Aktion nach Login

Hallo

Ich hab mal wieder ne Frage bzw ein Problem.

Ich habe bisher nur ein Code um mich in ein Browsergame einzuloggen, jedoch weiß ich nicht wie ich danach eine bestimmte Aktion ausführen kann, z.B. ein Feld nach Links.

So sieht mein Code bisher aus:
PHP Code:
#include <stdio.h>
#include <curl/curl.h>
#include <iostream>
int main(void)
{
    
CURL *post;
    

    
    
curl_global_init(CURL_GLOBAL_ALL);

    
    
post curl_easy_init();
    if (
post) {
        
        
curl_easy_setopt(postCURLOPT_URL"http://XXX.XXX.de/XXX/XXX/index.php");
        
        
curl_easy_setopt(postCURLOPT_POSTFIELDS"name=XXX&password=XXX&submit=Einloggen");

        
        
curl_easy_perform(post)

        
        
curl_easy_reset(post);
        
curl_easy_setopt(postCURLOPT_URL"http://XXX.XXX.de/XXX/XXX/map.php?walk=left&intwalkid=546995750");
        
curl_easy_perform(post);
        
curl_easy_cleanup(post);
    }
    
curl_global_cleanup();
    
std::cin.get();
    return 
0;

Das Einloggen funktioniert auf alle Fälle.

Auf der Website steht, dass die "Easy" Methode nur für einen Post ist.

Weiß einer wie ich das Problem lösen kann?
Krabat2 is offline  
Old 07/16/2015, 02:42   #2
 
ichwillkeinevieren's Avatar
 
elite*gold: 74
Join Date: Sep 2009
Posts: 2,411
Received Thanks: 203

Wenn du was hilfreiches gefunden hast bitte posten, werde ich noch später gebrauchen xD
ichwillkeinevieren is offline  
Old 07/16/2015, 07:34   #3


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Ich vermute nicht, dass es am falschen Request-Typ liegt. Ich denke, libcurl nimmt automatisch GET, wenn keine POST-Daten angegeben sind; sicher bin ich mir da aber auch nicht.
Aber bei der Response, die du vom Einloggen erhältst, werden in der Regel Cookies gesetzt. Diese dienen als Identifikation für die Session. Das heißt, dass du sie auch bei Folgeaktionen, für welche du eingeloggt sein musst, gesetzt haben musst. Ich nehme an, dass dem aktuell nicht so ist. Code kann ich dir dazu auch nicht geben, habe bisher nur wenig mit libcurl gearbeitet und das meiste schon wieder vergessen. Aber Cookies als Stichwort sollte dir schonmal weiterhelfen.
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Old 07/16/2015, 08:35   #4
 
elite*gold: 198
Join Date: Mar 2011
Posts: 835
Received Thanks: 263
ƬheGame is offline  
Old 07/16/2015, 23:13   #5
 
elite*gold: 0
Join Date: Jun 2011
Posts: 225
Received Thanks: 8
Danke schonmal für diese Hinweise

Also wenn ich es richtig verstanden habe:

1. Cookie beim Login speichern.
2. Cookie beim bewegen verwenden

um den Cookie zu speichern habe ich diese Option gefunden

Code:
CURLOPT_COOKIEJAR

Tell libcurl to activate the cookie engine, and when the easy handle is closed save all 
known cookies to the given cookiejar file. Write-only.

und um dieses wieder zu verwenden diese Option:
Code:
 CURLOPT_COOKIEFILE

Tell libcurl to activate the cookie engine, and to read the initial set of cookies from 
the given file. Read-only.
Wie schon erwähnt funktioniert der Login, jedoch escheint normalerweise im Chat dieser Text "XY loggt sich ein"

Doch dieser Text erscheint nicht obwohl ich keinen Error erhalte
Krabat2 is offline  
Old 07/17/2015, 20:10   #6

 
Delinquenz's Avatar
 
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
Man kann Cookies auch aus den Response Headern auslesen, was ich auch eher empfehlen würde, weil man die Cookies dann auch bearbeiten und speichern kann.

Die folgende Funktion kannst du als CURLOPT_WRITEFUNCTION benutzen um den Response Body in eine std::string Variable zu speichern oder eben als CURLOPT_HEADERFUNCTION um den Response Header in eine std::string Variable zu speichern.

Code:
std::size_t writeToString(char* data, std::size_t size, std::size_t nmemb, std::string* string)
{
	if (!string)
	{
		return 0;
	}

	string->append(data, size * nmemb);

	return size * nmemb;
}
Wie macht man das?

Code:
CURL* handle = curl_easy_init();
std::string body;
std::string header;

// ...
// other settings like url
// ...

// save body
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &body);
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, writeToString);

// save header
curl_easy_setopt(handle, CURLOPT_HEADERDATA, &header);
curl_easy_setopt(handle, CURLOPT_HEADERFUNCTION, writeToString);

CURLcode result = curl_easy_perform(handle);

if (result != CURLE_OK)
{
  // do error handling
}
Nun hast du den Response Body in der Variable body und den Response Header in der Variable header gespeichert. Wie ist ein Header aufgebaut?

So könnte ein Header, den du als Antwort auf dein Post Request kriegst, aussehen.

Code:
HTTP/1.0 200 OK
Date: Fri, 31 Dec 1999 23:59:59 GMT
Set-Cookie: sessionToken=abc123; Expires=Wed, 09 Jun 2021 10:18:14 GMT
Content-Type: text/html
Content-Length: 1354
Was wäre für uns interessant? Die Set-Cookie Direktive natürlich. Wie filtern wir diese bloß? Dafür gibt es reguläre Ausdrücke, in C++ auch unter std::regex zu finden.

Code:
std::regex regex("Set-Cookie: ([^=]+?)=([^;]+?);");
std::string cookies;

// get cookies
for (std::sregex_iterator it(header.cbegin(), header.cend(), regex), end_it; it != end_it; ++it)
{
	cookies += it->str(1) + "=" + it->str(2) + ";";
}
W-was!?!? Es sieht komplizierter aus, als es tatsächlich ist.

In der ersten Zeile initialisieren wir einen regulären Ausdruck, der eben dazu da ist, um die Set-Cookie Direktiven herauszufiltern. Direktiven? Ja, es bleibt nämlich nur selten bei einem Cookie. Meistens findet man im Response Header mehr als nur eine Set-Cookie Direktive. Den regulären Ausdruck ansich werde ich nicht erklären, dafür gibt es Google.
In der darauffolgenden Zeile wird die Variable cookies definiert, in die wir die gefilterten Cookies speichern. Wir speichern sie auch direkt in einem Format, mit dem libcurl problemlos umgehen kann.
Für die for-Schleife sollten dir Iteratoren nicht ganz fremd sein: Hier wird durch den header String iteriert anhand des oben initialisierten regulären Ausdruckes, für jeden "Fund" wird der "Body" der for-Schleife ausgeführt. it->str(n) gibt immer die n-te "Capture Group" des regulären Ausdrückes zurück, in unserem Fall also it->str(1) für den Namen und it->str(2) für den Wert des Cookies.

Nun haben wir in unserem Fall einen String mit dem Inhalt sessionToken=abc123;. Wie benutzen wir ihn nun beim nächsten Request?

Code:
CURL* handle2 = curl_easy_init();

// ...
// other options like url
// ...

curl_easy_setopt(handle2, CURLOPT_COOKIE, cookies.c_str());
Wieso std::string::c_str()? Weil libcurl eine C Bibliothek ist und somit kein std::string erkennt. Sollte irgendwann mal deine Applikation abstürzen, kann es sehr gut daran liegen, dass du irgendwo einen Datentyp übergeben hast, mit dem libcurl nicht klarkommt. Pointer stellen da eine Ausnahme dar, weshalb das Beispiel von oben auch problemlos funktioniert.

Voila.
Delinquenz is offline  
Reply


Similar Threads Similar Threads
Tablet gefühlt langsamer nach 1 Woche + Samsungs Aktion?!
01/31/2015 - Hardware Discussions / Questions - 7 Replies
Guten Tag, Und zwar habe ich mir am 21.01.2014 das Samsungs Galaxy Tab Pro 10.1 bei Saturn für 339€ gekauft. Nach nun einer Woche ist das Tablet jedoch schon gefühlt langsamer ( nur beim einschalten sowie Net, apps gehen schnell... Viren Könnens meiner Meinung net sein da iCh nur elitepvpers drauf War und sonst nur auf meiner Uni Seite wegen den Skripten. Nun meine beiden Fragen: 1;Bilde ich mir das ein ( wie gesagt ist n feiner unterschied aber ich habe angst das er noch langsamer...
ich krieg libcurl nicht installiert ;(
11/18/2014 - C/C++ - 6 Replies
Hallo, wollte ein bisschen was mit libcurl schreiben, krieg das Ding nicht in mein Visual C++ 2010 Express rein, bekomme folgende Fehler: dd.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_easy_cleanup" in Funktion "_main". 1>dd.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_easy_strerror" in Funktion "_main". 1>dd.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_easy_perform" in Funktion "_main"....
[C++] Simple libcurl Wrapperklassen
03/09/2014 - Coding Snippets - 8 Replies
Hallo, da curlpp mit der neusten Version der libcurl zickt und ich nur ungern bei den etlichen Webanfragen in meinem Projekt mit Pointern rumhantieren möchte, habe ich mir dafür ein paar Klassen geschrieben, die mir das erleichtern sollen. C++11 wird vorausgesetzt. Ein simples Beispiel #include <iostream> #include <string> #include "curl.hpp" int main()
Autoit soll nach dem Button klicken eine Aktion ausführen (Anfänger)
11/03/2011 - AutoIt - 13 Replies
Hi, ich habe gerade vor 10 Minuten angefangen und meine erste Frage ist,dass wenn ich einen Button klicke,eine Aktion ausgeführt wird.Habe immer mit Delphi gearbeitet und hier komm ich nicht weiter. Hier der Code: #include <GUIConstants.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Form1", 625, 443, 190, 125) $Button1 = GUICtrlCreateButton("Button1", 88, 72, 75, 25, 0) GUISetState(@SW_SHOW)
Libcurl Schaltflächen
12/08/2009 - General Coding - 9 Replies
Hi, ich habe gerade angefangen mich mit libcurl zu beschäftigen und hab gleich eine grundlegende Frage und zwar wie kann ich mich auf einer Website bewegen? mit int main(void) { CURL *curl; CURLcode res;



All times are GMT +1. The time now is 00:25.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.