2

C と libcurl を使用して Web サイトにログインし、フォームから値を取得しています (つまり、文字列 "username=random" を char 配列に入れます)。これは私がこれまでに持っているものです:

curl = curl_easy_init();
if(curl) {
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/4.0");
    curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 );
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1 );
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, " "); 
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.website.com/login");
    curl_easy_perform(curl);
    curl_easy_setopt(curl, CURLOPT_REFERER, "http://www.website.com/login");
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS,fields );
    curl_easy_perform(curl);
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.website.com/form-with-data");

    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    }

しかし、そこからどこへ行くべきかわかりません。ページ全体をファイルに書き込んでから、手動で文字列を検索しようとしましたが、うまくいきませんでした。

これには簡単な答えがあると確信しています。私はCとlibcurlの両方が初めてです:)

4

2 に答える 2

2

現在のコードは1つのことを行います。それは、データを標準出力に書き込むことです。データを蓄積するには、次のようなことを行う必要があります。

size_t write_clbk(void *data, size_t blksz, size_t nblk, void *ctx)
{
    static size_t sz = 0;
    size_t currsz = blksz * nblk;

    size_t prevsz = sz;
    sz += currsz;
    void *tmp = realloc(*(char **)ctx, sz);
    if (tmp == NULL) {
        // handle error
        free(*(char **)ctx);
        *(char **)ctx = NULL;
        return 0;
    }
    *(char **)ctx = tmp;

    memcpy(*(char **)ctx + prevsz, data, currsz);
    return currsz;
}

hndl = curl_easy_init();
// Set up the easy handle, i. e. specify URL, user agent, etc.
// Do the ENTIRE setup BEFORE calling `curl_easy_perform()'.
// Afterwards the calls to `curl_easy_setopt()' won't be effective anymore

char *buf = NULL;
curl_easy_setopt(hndl, CURLOPT_WRITEFUNCTION, write_clbk);
curl_easy_setopt(hndl, CURLOPT_WRITEDATA, &buf);
curl_easy_perform(hndl);
curl_easy_cleanup(hndl);

// here `buf' will contain the data
// after use, don't forget:
free(buf);
于 2012-10-29T06:24:40.870 に答える
1

HTTPHTMLに精通していますか? GET少なくとも、 、HEAD、およびPOSTリクエストとは何か、またフォームがユーザーによってブラウザから送信されたときにプロトコル レベルで何が起こるかを知っておく必要があります。telnetを使用し、HTTP 要求を手動で入力して練習することができます。

次に、POSTプログラムでリクエストを行います。libcurlにはいくつかの例があります。postit2.cの中を見てください。

HTTP cookieに関心があり、 cookie_interface.c の例を調べることができます。あなたCURLOPT_COOKIEFILEは間違っています(単一のスペースで名前を付けたファイルを指定しています)。

コンパイル時にすべての警告とデバッグ情報を有効にすることを忘れないでください。Linux の場合は、gcc -Wall -g yourexample.c -lcurl -o yourprog警告が表示されなくなるまでコードをコンパイルして改善します。次にgdb、デバッグに使用する方法を学びます。

于 2012-10-29T06:04:08.343 に答える