tags:

views:

637

answers:

2

Hi am trying to post some data on a website using CURL. The posting process has 3 steps. 1. enter a URL, submit and get to the 2nd step with some fields already completed 2. submit again, after you entered some more data and preview the form. 3. submit the final data.

The problem is that after the second step, the form data looks like this

POSTDATA =-----------------------------12249266671528
Content-Disposition: form-data; name="title"

Filme 2010, filme 2009, filme noi, programe TV, program cinema, premiere cinema, trailere filme - CineMagia.ro
-----------------------------12249266671528
Content-Disposition: form-data; name="category"

3
-----------------------------12249266671528
Content-Disposition: form-data; name="tags"

filme, programe tv, program cinema
-----------------------------12249266671528
Content-Disposition: form-data; name="bodytext"

Filme 2010, filme 2009, filme noi, programe TV, program cinema, premiere cinema, trailere filme
-----------------------------12249266671528
Content-Disposition: form-data; name="trackback"


-----------------------------12249266671528
Content-Disposition: form-data; name="url"

http://cinemagia.ro
-----------------------------12249266671528
Content-Disposition: form-data; name="phase"

2
-----------------------------12249266671528
Content-Disposition: form-data; name="randkey"

9510520
-----------------------------12249266671528
Content-Disposition: form-data; name="id"

17753
-----------------------------12249266671528--

I am stuck trying to devise an algorithm that will generate this kind of POST data for the second step. Just to mention the URL of the form never changes. It is always: http://www.xxx.com/submit. There is only a hidden input called "phase" that changes according to the step i am currently on (phase = 1, phase = 2, phase = 3). Any help, be it either code, pseudo-code or just guidance would be greatly appreciated.

My code so far:

function postBlvsocialbookmarkingcom($curl,$vars) {
    extract($vars);

    $baseUrl = "http://www.blv-socialbookmarking.com/";

    //step 1: login
    $curl->setRedirect();
    $page = $curl->post ($baseUrl.'login.php?return=/index.php', array ('username' => $username, 'password' => $password, 'processlogin' => '1', 'return' => '/index.php'));
    if ($err = $curl->getError ()) {
        return $err;
    }
    //post step 1----
    //get random key
    $page = $curl->post($baseUrl.'/submit', array());
    $randomKey = explode('<input type="hidden" name="randkey" value="',$page);
    $randKey = explode('"',$randomKey[1]);
    //-------------------------------------
    $page = $curl->post($baseUrl.'/submit', array('url'=>$address,'phase'=>'1','randkey'=>$randKey[0],'id'=>'c_1'));
    if ($err = $curl->getError ()) {
        return $err;
    }
    //echo $page;
    //
    //post step 2
    $page = $curl->post ($baseUrl.'/submit', array ('title' => $title, 'category'=>'1', 'tags' => $tags, 'bodytext' => $description, 'phase' => '2'));
    if ($err = $curl->getError ()) {
        return $err;
    }
    echo $page;
    //post step 3
    $page = $curl->post ($baseUrl.'/submit', array ('phase' => '3'));
    if ($err = $curl->getError ()) {
        return $err;
    }
    echo $page;

}
+1  A: 

To track this down properly, use a tool like LiveHTTPHeaders and record a full "manual" session that you do with your browser.

Then you work on using curl to mimic that recorded session as closely as possible. Pay attention to cookies, referer, user-agent etc as well as the post fields.

Daniel Stenberg
A: 

When sending multipart data, boundaries are used as separators between each field. These boundaries are automatically created by cURL and you shouldn't need to worry about them. You should simply send the post parameters as an array and set the Content-Type header to multipart/form-data.

Michael