2012-03-14 22 views
-1

我想要一个POST请求,在此页面上获取车次时间表:http://www.indianrail.gov.in/train_Schedule.html使用curl使POST请求,没有工作

我使用这个代码,但它无法正常工作。由此产生的错误在下面附件中显示。 可能是什么问题?
PS:我使用Firebug

$data = array('lccp_trnname' => '14553', 'getIt' => 'Get Schedule'); 

    $ch = curl_init(); 
    $useragent= "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"; 
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent); // set user agent 
    curl_setopt($ch, CURLOPT_URL, 'http://www.indianrail.gov.in/cgi_bin/inet_trnnum_cgi.cgi'); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 

    $txResult = curl_exec($ch); 

    print "$txResult\n"; 

enter image description here得到了CGI路径和参数在$数据:

+0

http://www.indianrail.gov.in在网站上使用是非法的。而你的URL也wrong.FAILED IN CHK ENV 0埃罗RIS有 – sandeep 2012-03-14 10:43:11

+0

也添加了referer(“http://www.indianrail.gov.in/train_Schedule.html”)到你的代码,这似乎没有帮助。无法看到任何表格值错过...他们已经采取了保护措施,以阻止外部请求。我会建议找到一个不同的(更开放的)数据源。 – Ing 2012-03-14 10:47:50

+0

@Ing明白了;请看下面。 – AgA 2012-03-14 11:04:01

回答

0

你需要两样东西:

推荐人
“应用程序lication/X WWW的形式,进行了urlencoded” POST数据

$params = 'lccp_trnname='.urlencode('14553').'&getIt='.urlencode('Get Schedule'); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $params); 
curl_setopt($ch,CURLOPT_REFERER, "http://www.indianrail.gov.in/train_Schedule.html"); 
+0

辉煌!第三行不是必需的。第一行做到了。谢谢 – AgA 2012-03-14 11:02:53

1

假设你有权限以编程方式消耗在该网站上的数据.....

问题是您将发布数据传递给cURL的方式。

CURLOPT_POSTFIELDS

完整的数据张贴在HTTP “POST” 操作。要发布文件,请使用@预先指定文件名并使用完整路径。文件类型可以通过跟随具有格式'; type = mimetype'格式的文件名来显式指定。此参数可以作为urlencoded字符串传递,如'para1 = val1 & para2 = val2 & ...'或作为字段名称作为键和字段数据作为值的数组。如果value是一个数组,则Content-Type头将被设置为multipart/form-data。从PHP 5.2.0开始,使用@前缀传递给此选项的文件必须以数组形式工作。

http://php.net/manual/en/function.curl-setopt.php

尝试后数据自己的编码和将它作为一个字符串:

$data = array('lccp_trnname' => '14553', 'getIt' => 'Get Schedule'); 

$fields_string = ''; 
foreach($data as $key=>$value) { $fields_string .= urlencode($key).'='.urlencode($value).'&'; } 
rtrim($fields_string,'&'); 

然后设置选项:

curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); 
+0

+1为解释和链接 – JScoobyCed 2012-03-14 11:07:34