0

如何使用 curl 在提交按钮上没有 name 属性提交表单?

例如,目标站点具有以下提交按钮:

<input id='some' value='value' type='submit' >

这就是我所拥有的:

$post_data['name'] = 'xyz';
$post_data['some'] = 'value';

foreach ( $post_data as $key => $value) {
            $post_items[] = $key . '=' . $value;
        }
        //create the final string to be posted using implode()
        $post_string = implode ('&', $post_items);

    $ch = curl_init($web3);
        //set options
        //curl_setopt($ch, CURLOPT_COOKIESESSION, true);
        curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); 
        curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($ch, CURLOPT_USERAGENT,
          "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
        //curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        //set data to be posted
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
        //perform our request
        $result = curl_exec($ch);
4

2 回答 2

3

您(通常)不需要进行编码$post_data,下面的代码提交表单。

按钮不是必需的。运行时curl_exec,服务器会收到等价的填写好的表格(前提post_data是正确的)。

如果操作未继续,则可能缺少某些字段,或者会话中的某些内容。尝试使用 cURL 打开显示表单的同一页面,然后提交表单。

$post_data['name'] = 'xyz';
$post_data['some'] = 'value';

$ch = curl_init();
//set options
//curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_USERAGENT,
      "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
//curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

//set data to be posted
curl_setopt($ch,CURLOPT_POST, true);

// Note -- this will encode using www-form-data
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);

curl_setopt($ch, CURLOPT_URL, $web3);

$result = curl_exec($ch);

更新

那么让我们看看正常情况下会发生什么以及 cURL 会发生什么:

   Browser                          cURL
1. Goes to www.xyz.com/form         curl_exec's a GET on www.xyz.com/form
2. Server sends HTML                Server sends HTML
3. User types in fields             We populate $post_data
4. User clicks "SUBMIT"             We run curl_exec and POST $post_data
5. Browser contacts server          cURL contacts server
6. Browser sends fields             cURL sends fields
7. Server acts upon request         Server acts upon request
8. Profit                           Profit

上面的代码只实现了阶段 3-6。阶段 2 也可能发送会话 cookie 并设置一些数据,这是阶段 7 所需的。因此,您还需要使用另一个 curl_exec (可能是 GET 方法,这一次)实现阶段 1,然后才能成功执行以下阶段。

于 2012-08-30T21:28:20.930 回答
2

根本不提供该输入表单字段的名称 - 浏览器实际上会为您做什么。

于 2012-08-30T20:27:26.290 回答