i dont even know if im doing properly.
- ну, конечно, в вашем коде есть пара ошибок,
во-первых, что, по вашему мнению, произойдет, если имя пользователя длиннее 20 байтов или пароль длиннее 25 байтов? попробовать
string username;
getline(cin, username);
вместо этого. C ++ будет увеличивать размер имени пользователя по мере необходимости, пока у вас не закончится память, как и должно быть.
и я вижу, что вы используете CURLOPT_POSTFIELDS
(и неправильно), пока вы не узнаете, что делаете, я рекомендую вместо этого использовать CURLOPT_COPYPOSTFIELDS
. (кстати, я почти всегда сам использую COPYPOSTFIELDS) эта строка неверна:
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "uname=?&password=?", username, password);`
потому что curl_easy_setopt () принимает только 3 параметра, но вы пытаетесь задать его 5. Я не думаю, что он даже скомпилируется, но даже если это произойдет, он определенно не должен работать во время выполнения.
вместо этого попробуйте что-то вроде:
string urlencode(const string& str)
{
char *escaped = curl_escape(str.c_str(), str.length());
if (unlikely(escaped==NULL))
{
throw runtime_error("curl_escape failed!");
}
string ret = escaped;
curl_free(escaped);
return ret;
}
curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, string("uname="+urlencode(username)+"&password="+urlencode(password)).c_str());
Что касается чтения (и захвата) вывода, есть много способов сделать это, но как насчет перехвата CURLOPT_WRITEFUNCTION? это имеет тенденцию работать, что-то вроде:
size_t my_write_function( const void * indata, const size_t size, const size_t count, void *out){
(*(string*)out).append((const char*)indata,size*count);
return size*count;
}
тогда
string response;
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,my_write_function);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,&response);
res = curl_easy_perform(curl);
cout << "response from website: " << response << endl;
теперь вы можете проверить, вошли ли вы в систему или нет, проверив наличие в ответе строки «true» (потому что она должна отвечать что-то вроде {validated:true}
, если вы есть), например,
if(response.find("true")==string::npos){
cout << "failed to authenticate!";
}else{
cout << "authenticated successfully!";
}
(и предупреждение, хотя может быть заманчивым использовать лямбда-колбэк с CURLOPT_WRITEFUNCTION, это ловушка, лямбда-символы c ++ могут вылетать, когда передаются curl в качестве колбэков ... были там, сделали это.)