2017-08-18 12 views
0

管理対象C++のアプリケーションから自分のWebサイトにログインしようとしています。私はこれを行うためにカールを使用していますが、私はエラーを受け取っていませんが、ログインが成功したかどうかを確認するために必要な情報を取得する方法を混乱させています。私は残念ながら私と同様の問題を持つ人を見つけることができませんでしたので、何か助けていただきありがとうございます。CURL(C++)を使用したフォーラムにログイン

private: System::Void bLogin_Click (System::Object^ sender, System::EventArgs^ e) 
{ 
    if (System::String::IsNullOrEmpty (tbUsername->Text)) 
    { 
     System::String^ str = gcnew System::String ("Login failed! Please enter a valid username."); 
     System::Windows::Forms::MessageBox::Show (str); 

     return; 
    } 
    if (System::String::IsNullOrEmpty (tbUsername->Text)) 
    { 
     System::String^ str = gcnew System::String ("Login failed! Please enter a valid password"); 
     System::Windows::Forms::MessageBox::Show (str); 

     return; 
    } 

    using System::Runtime::InteropServices::Marshal; 

    curl_global_init (CURL_GLOBAL_ALL); 

    CURL* curl = curl_easy_init(); 
    if (!curl) 
    { 
     curl_global_cleanup(); 
     return; 
    } 

    curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 1L); 
    curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 1L); 

    curl_easy_setopt (curl, CURLOPT_USERAGENT, "Mozilla/4.0"); 
    curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1); 
    curl_easy_setopt (curl, CURLOPT_URL, "https://www.myurl.com/member.php?action=login"); 

    const char* szUser = static_cast< const char* >(Marshal::StringToHGlobalAnsi (tbUsername->Text).ToPointer()); 
    const char* szPass = static_cast< const char* >(Marshal::StringToHGlobalAnsi (tbPassword->Text).ToPointer()); 


    curl_easy_setopt (curl, CURLOPT_POST, 1L); 
    curl_easy_setopt (curl, CURLOPT_POSTFIELDS, Fmt::Fmt ("username=%s&password=%s", szUser, szPass)); 
    //curl_easy_setopt (curl, CURLOPT_USERPWD, Fmt::Fmt ("%s:%s", szUser, szPass)); 

    std::string strData; 
    curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, WriteCallback); 
    curl_easy_setopt (curl, CURLOPT_WRITEDATA, &strData); 


    CURLcode res = curl_easy_perform (curl); 
    /* its always CURLE_OK */ 
    if (res != CURLE_OK) 
    { 
     System::Windows::Forms::MessageBox::Show ("A error has occured during the login process."); 
    } 

    Marshal::FreeHGlobal (System::IntPtr (reinterpret_cast< long long >(szUser))); 
    Marshal::FreeHGlobal (System::IntPtr (reinterpret_cast< long long >(szPass))); 

    /* check if suceeded here... but everything in strData is the same whether the credentials are right or wrong */ 


    curl_easy_cleanup (curl); 
    curl_global_cleanup(); 
} 

また、私のウェブサイトには「ワイルドカードSSL」が付属していますが、その点についてはわかりません。 私はこのすべてにかなり新しいので、何か間違っているとすみません。

+0

私にはC++のようには見えません。 'System :: String^str = something'のように、'^'文字は算術演算子であり、コンパイラは構文エラーを投げられるはずです... – hanshenrik

+0

それはC++で管理されています – Mike

答えて

0

成功したログインと失敗したログインの区別は、サーバーが提供する応答に完全に依存します。どのWebアプリケーションが関係しているのかわからないので、より正確な情報を提供することはできません。

第2に、管理されたC++プロジェクトのcurlを使用することは非常に奇妙です。あなたは、使いやすいHTTPクライアントを提供する.NETフレームワークにアクセスし、すべての手動クリーンアップ/マーシャリングを回避します。

+0

ありがとう、ありがとう。私はWebRequestクラスを使用して、 "do_login"パラメータを追加して、結果に「ログイン」が含まれているかどうかを確認しました。今は完璧に動作しています!再度、感謝します – Mike

0

D.Jurcauが提案したように、私はWebRequestクラスを使用しました。また、action=do_loginをparamsに追加し、成功した場合は文字列をチェックします。

関連する問題