последовательные отправки с помощью libcURL (C / C )

#c #curl #submit #form-submit #libcurl

#c #curl #Отправить #форма-отправить #libcurl

Вопрос:

Я новичок в использовании libcURL и у меня проблема с выполнением задачи.

Мне нужно выполнить две последовательные отправки, чтобы изменить текстовое поле.

Во-первых: в Интернете есть поле выбора (группа) и кнопка отправки.

Второе: после первой отправки вы получаете определенную страницу с

Это мой код, но не работает (обе отправки):

 #include <stdio.h>
#include <iostream>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>

int main(void)
{
    CURL *curl;
    CURLcode res;

    struct curl_httppost *formpost = NULL;
    struct curl_httppost *lastptr = NULL;
    struct curl_slist *headerlist = NULL;
    static const char buf[] = "Expect:";

    curl_global_init(CURL_GLOBAL_ALL); 

    curl_formadd(amp;formpost, amp;lastptr, CURLFORM_COPYNAME, "group", CURLFORM_COPYCONTENTS, "ImageSource", CURLFORM_END);
    curl_formadd(amp;formpost, amp;lastptr, CURLFORM_COPYNAME, "submit", CURLFORM_COPYCONTENTS, "Select group", CURLFORM_END);
    curl_formadd(amp;formpost, amp;lastptr, CURLFORM_COPYNAME, "root_ImageSource_I0_Name", CURLFORM_COPYCONTENTS, "weboCam", CURLFORM_END);
    curl_formadd(amp;formpost, amp;lastptr, CURLFORM_COPYNAME, "submit", CURLFORM_COPYCONTENTS, "Save", CURLFORM_END);

    curl = curl_easy_init();
    headerlist = curl_slist_append(headerlist, buf);

    if(curl) 
    {
      /* First set the URL that is about to receive our POST. This URL can
         just as well be a https:// URL if that is what should receive the
         data. */ 
        curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.90/admin/config.shtml");
        curl_easy_setopt(curl, CURLOPT_USERPWD, "xxxx:xxxx");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
        curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);   

        res = curl_easy_perform(curl);

        long http_code = 0;

        curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, amp;http_code);

        if (http_code == 200 amp;amp; res != CURLE_ABORTED_BY_CALLBACK)
        {
            cout << "Todo ha ido perfecto." << endl;         //Succeeded
        }
        else
        {
            cout << "Ha habido un error." << endl; //Failed
        }

        curl_formfree( formpost );

        curl_easy_cleanup(curl);
    }
  

Другая проблема: код компилируется и показывает, что все идет правильно, но на самом деле отображается только код страницы по умолчанию http://192.168.0.90/admin/config.shtml

Заранее спасибо

Комментарии:

1. Я не понимаю. Если вам нужны две отправки, почему ваша программа вызывает curl_easy_perform() только один раз?

2. потому что прежде всего я хочу посмотреть, работают ли первые два curl_formadd. В исходном коде последние два curl_formadd прокомментированы.

Ответ №1:

Первый шаг выполнен.

Этот код выполняет первый шаг.

 char *data1="group=ImageSource";
    char *data2="root_ImageSource_I0_Name=weboCam";

    curl = curl_easy_init();

    if(curl) 
    {
        // Put the original page
        curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.90/admin/config.shtml");
        curl_easy_setopt(curl, CURLOPT_USERPWD, "root:root");       
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data1);
  

Сделайте выбор из первого выбранного.
введите описание изображения здесь

После выполнения этого я хочу изменить это текстовое поле введите описание изображения здесь

Подведем итог: я хочу изменить текстовое поле на втором уровне страницы. Проблема заключается в том, что libcurl при втором easy_perform возврате на верхний уровень.