как залогиниться с libcurl на сайте?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by eldar85, 18 Apr 2010.

  1. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    столкнулся с такой проблемой, не могу залогиниться на сайте...
    хочу чтобы прога сама логинелась на моей страничке, но по моему получается полная чушь...
    вот код, что я делаю не так?

    int main(int argc, char* argv[])
    {

    CURL* curl;
    char url[] = "http://love.ngs.ru/login/";
    char proxy[] = "92.50.163.114";
    long port = 8085;
    char error[200];
    char referer[] = "http://love.ngs.ru/";
    struct curl_httppost* post = NULL;
    struct curl_httppost* last = NULL;
    char postdata[] = "send=ok&l=8j4w4w4w@rambler.ru&p=8j4w4w4w&remember_me=1";

    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();


    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_REFERER, referer);
    curl_easy_setopt(curl, CURLOPT_PROXY, "117.102.91.6:8080");
    //curl_easy_setopt(curl, CURLOPT_PROXYPORT, port);
    //curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
    curl_easy_setopt(curl, CURLOPT_HEADER, 0);
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
    // printf("\nTrying proxy [%s:%d]:\n", proxy, port);

    curl_easy_setopt(curl, CURLOPT_HTTPPOST, 1);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 54);

    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 7);
    curl_easy_perform(curl);
    // printf("Cannot perform\nError:%s\n", error);
    int i;
    std::cin >> i;

    return 0;
    }

    в итоге в консоль выводиться только хедер, а html кода нету и вообще не понятно залогинелся я или нет)
     
    #1 eldar85, 18 Apr 2010
    Last edited: 18 Apr 2010
  2. Dark_cracker

    Dark_cracker Member

    Joined:
    29 May 2009
    Messages:
    73
    Likes Received:
    8
    Reputations:
    1
    попробуй поставить это
    curl_easy_setopt(curl, CURLOPT_POST, true);
    перед этим
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata);
    типа сказать курлу что есть пост данные
     
  3. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    попробывал так:

    int main(int argc, char* argv[])
    {
    CURL* curl;
    char url[] = "http://love.ngs.ru/login/";
    char proxy[] = "92.50.163.114";
    long port = 8085;
    char error[200];
    char referer[] = "http://love.ngs.ru/";
    struct curl_httppost* post = NULL;
    struct curl_httppost* last = NULL;
    char postdata[] = "send=ok&l=8j4w4w4w%40rambler.ru&p=8j4w4w4w&remember_me=1";

    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();

    //curl_formadd(&post, &last, CURLFORM_COPYNAME, "method", CURLFORM_COPYCONTENTS, "post", CURLFORM_END);
    // curl_formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_FILE, "c:/2.jpg", CURLFORM_CONTENTTYPE, "image/jpeg", CURLFORM_END);
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_REFERER, referer);
    curl_easy_setopt(curl, CURLOPT_PROXY, "117.102.91.6:8080");

    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
    curl_easy_setopt(curl, CURLOPT_HEADER, 0);
    curl_easy_setopt(curl, CURLOPT_NOBODY, 1);

    curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie.txt");
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie.txt");

    curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");


    curl_easy_setopt(curl, CURLOPT_HTTPPOST, 1);
    curl_easy_setopt(curl, CURLOPT_POST, true);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata);


    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
    curl_easy_perform(curl);

    int i;
    std::cin >> i;

    return 0;
    }

    и вроде все нормально))) спасибо за совет)
    но я не пойму как сделать так чтобы он еще и тело сайта вывел в консоль, а то так выводит только хедер и то что прокси и рефер установлены??
    и еще один вопросик, куда сохраняются куки?? я прописал cookie.txt и создал текстовой файл возле экзэшника, но там пустота)) хотелось бы посмотреть куда он их сохраняет) или он после использования сразу их стерает из файла?)
     
    #3 eldar85, 18 Apr 2010
    Last edited: 18 Apr 2010
  4. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    и вообще я все правильно с куками делаю или нет?) их так находят в коде или может чего то еще не хватает?
     
  5. Dark_cracker

    Dark_cracker Member

    Joined:
    29 May 2009
    Messages:
    73
    Likes Received:
    8
    Reputations:
    1
    а чё за язык используешь ?
    попробуй сделать так /cookie.txt
    или там полный путь от диска пропиши
     
  6. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    на плюсах, под Qt))
     
  7. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    а вообще в файле он должен какие нить записи оставить после выполнения программы?
     
  8. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    блин, ну все, вывел уже не в консоль, а в GUI, теперь то точно видно что стал логиниться))) большое спасибо за помощь)))
     
  9. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    прописал путь:
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "c:/cookie.txt");
    но файл все равно пустой как не странно...
     
  10. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    но без этих двух строчек нифига не логиниться как не странно))
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie.txt");
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie.txt");
     
  11. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie.txt"); - файл, куда сохраняются куки
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie.txt"); - файл, из которого они загружаются.

    если нет необходимости хранить куки в файлах, а нужно только автоматически их использовать, то:
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
    или
    curl_easy_setopt(curl, CURLOPT_COOKIELIST, "");
     
  12. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    сталкнулся со странной проблемкой, сделал многопоточную программку, она с каждого акка запускает свой поток, но так как я курлом сохраняю куки вот так:
    то почему то мне кажется что там дофига куков для одного сайта с каждого акка сохраняется и получается каша или я не прав??? помогите разобраться плиз...
    может лучше в переменную как то сохранять куки???
     
  13. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    поможет ли такой вариант
    ??????????????
     
  14. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,582
    Likes Received:
    1,310
    Reputations:
    1,557
    Не уверен, что ты делаешь то, что хотел.
    CURLOPT_COOKIEJAR - имя файла, в который сохраняются куки
    CURLOPT_COOKIEFILE - имя файла, из которого загружаются куки

    В либкурле много возможностей для работы с куками, но для твоих целей должно хватить и этого:
    p.s.: не забудь, для каждого потока - свой curl ;)
     
  15. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    ага спасибо)
    ну я делаю вот так:
    я же правильно в каждом run() создаю новый курл?
     
  16. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    НУ вы блин гении реальные.
    1) Выводит хидер. Ну да, а что ты хочешь еще видеть? Даю 99% что код ответа 302 Moved и в теле заголовка есть Location: ****
    2) Коль любите юзать всякую авторизацию и тому подобные вещи, то полюбите юзать авторедирект
     
  17. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,582
    Likes Received:
    1,310
    Reputations:
    1,557
    В некоторых случаях авторедирект заметно увеличивает время авторизации. Он не нужен, если для авторизации и определения ее результата достаточно наличия редиректа в заголовке.

    Если это параллельные потоки, как они еще должны выводить страницы? Потока у тебя 2, а экран 1 -> гугл -> "синхронизация потоков"
     
    #17 M_script, 4 Jul 2010
    Last edited: 4 Jul 2010
  18. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 M_script я говорю про случаи когда данных в заголовке недостаточно для точного знания залогинелся или нет. ПО этому авторедирект помогает хорошо, вместо того чтобы делать еще один запрос

    А вообще зачем выводить в консоль? не проще ли сразу делать вывод в буфер?
     
  19. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,582
    Likes Received:
    1,310
    Reputations:
    1,557
    На всякий случай для eldar85 и всех, кто использует курл - авторедирект включается одной строкой:
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
     
    1 person likes this.
  20. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ну и желательно еще добавлять curl_easy_setopt(ret->curl, CURLOPT_AUTOREFERER, 1);
    чтобы реферер сам вбивался при редиректах и следующих запросах