2015-01-01 341 views
1

我正在嘗試通過CURL登錄Twitter。 這是我的代碼:使用libcurl發送post請求

#include <iostream> 
#include <string> 
#include <curl\curl.h> 
#include <sstream> 

using std::string; 

size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) 
{ 
    std::string buf = std::string(static_cast<char *>(ptr), size * nmemb); 
    std::stringstream *response = static_cast<std::stringstream *>(stream); 
    response->write(buf.c_str(), (std::streamsize)buf.size()); 
    return size * nmemb; 
} 

int main(int argc, char*argv[]) 
{ 
    std::string target = "https://twitter.com/login"; 
    CURL *curl; 
    CURLcode res; 
    std::stringstream response; 
    char* data = "session[username_or_email]=user&session[password]=pass"; 
    struct curl_slist *chunk = NULL; 
    curl_global_init(CURL_GLOBAL_DEFAULT); 
    curl = curl_easy_init(); 
    if (curl) { 

     curl_easy_setopt(curl, CURLOPT_URL, target.c_str()); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
     curl_easy_setopt(curl, CURLOPT_VERBOSE, true); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); 
     curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)"); 
     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); 
     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); 
     curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); 
     res = curl_easy_perform(curl); 

     curl_easy_cleanup(curl); 
     curl_global_cleanup(); 
    } 
    std::cout << response.str() << std::endl; 
    cin.ignore(); 
    return 0; 
} 

而且我得到這個消息:

403禁止:服務器理解了請求,但拒絕履行 它

什麼我應該怎麼做?

回答

2

我建議你的請求被正確識別爲來自程序而不是人類,因此被拒絕。

這將是一個從「真正的」(即瀏覽器)會話捕獲所有正確的標題和cookie的問題......但真的,我認爲你會更好地使用Twitter API,因爲這是它的設計目的是什麼。

+0

非常感謝! 我在Chrome瀏覽器中查看網絡並複製了標題。 – JohnMiz