【发布时间】:2011-03-27 14:37:24
【问题描述】:
为了训练自己使用 php 和 HTML 表单,我决定制作一个小型 Web 应用程序,它从另一个网站收集数据,但将其显示在移动设备上。
在本次练习中,我选择了我所在地区的公交公司站点:http://delijn.be/en/index.htm。我分析了网站,发现了一个名为“form1”的表单,它通过POST方法向网站发送数据:http://reisinfo.delijn.be/reisinfo/RouteplannerHomeBeperktServlet?taal=en。
我开始编写 php 代码并在互联网上发现您可以使用 cURL 发送 POST 字段。所以我做了。不幸的是,它不起作用。我得到了网站的错误页面。所以我猜有些字段一定是丢失了,但我已经检查了所有内容,但找不到另一个字段。就这样,我再次来到这里,寻求帮助。
Web 应用程序托管在 my home server 上,也可以是 downloaded 那里。
如果有人能帮我解决这个问题,我将不胜感激,
ief2
PS:部分代码是荷兰语写的,所以这里有一些翻译:
- Gemeente = 城镇/城市
- 普拉茨 = 位置
- 数字 = 数字
- 基准 = 日期
- Dag = Day
- Maand = 月
- Jaar = 年
- Uur = 小时
- Aankomst = 到达
- Vertrek = 出发
- Berekenen = 计算
PPS:下载链接貌似失效了,但是我下载没问题,所以这里有一些代码片段:
index.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>De Lijn Mobile</title>
<meta name="viewport" content="width = device-width">
</head>
<body>
<form name="main" action="calculateRoute.php" method="post">
<b>Vertrek:</b><br>
Gemeente: <input type="text" name="vertrekGemeente"><br>
Straat: <input type="text" name="vertrekStraat"><br>
Nummer: <input type="text" name="vertrekNummer"><br>
<hr>
<b>Aankomst:</b><br>
Gemeente: <input type="text" name="aankomstGemeente"><br>
Straat: <input type="text" name="aankomstStraat"><br>
Nummer: <input type="text" name="aankomstNummer"><br>
<hr>
<b>Datum:</b><br>
<?php
require("./Date.php");
$now = new Date();
?>
<input type="radio" name="datumType" value="aankomst" checked> Aankomst<br>
<input type="radio" name="datumType" value="vertrek"> Vertrek<br>
Dag: <input type="text" size="2" name="datumDag" value="<?php echo $now->day; ?>"><br>
Maand: <input type="text" size="2" name="datumMaand" value="<?php echo $now->month; ?>"><br>
Jaar: <input type="text" size="4" name="datumJaar" value="<?php echo $now->year; ?>"><br>
Tijdstip: <input type="text" size="2" name="datumUur" value="<?php echo $now->hour; ?>"> :
<input type="text" size="2" name="datumMinuten" value="<?php echo $now->minutes; ?>"><br>
<hr>
<input type="submit" value="Bereken"><br>
</form>
</body>
</html>
calculateRoute.php
<DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>De Lijn Mobile - Berekeningen</title>
</head>
<body>
<?php
require_once("./Plaats.php");
require_once("./Date.php");
require_once("./DeLijn.php");
echo "Gathering data...<br>";
$gemeente = $_POST["vertrekGemeente"];
$straat = $_POST["vertrekStraat"];
$nummer = $_POST["vertrekNummer"];
$vertrekPlaats = new Plaats($gemeente, $straat, $nummer);
$gemeente = $_POST["aankomstGemeente"];
$straat = $_POST["aankomstStraat"];
$nummer = $_POST["aankomstNummer"];
$aankomstPlaats = new Plaats($gemeente, $straat, $nummer);
$datumType = $_POST["datumType"];
$dag = $_POST["datumDag"];
$maand = $_POST["datumMaand"];
$jaar = $_POST["datumJaar"];
$uur = $_POST["datumUur"];
$min = $_POST["datumMinuten"];
$datum = Date::withDate($jaar, $maand, $dag, $uur, $min);
$datum->month = $maand;
echo "Searching...<br>";
searchDeLijn($vertrekPlaats,
$aankomstPlaats,
$datumType,
$datum);
?>
</body>
</html>
DeLijn.php
<?php
require_once("Route.php");
require_once("Date.php");
require_once("Plaats.php");
// ==== Returns of Route objects or null
define('DATE_ARRIVAL', "aankomst");
define('DATE_DEPARTURE', "vertrek");
function searchDeLijn($dep, $ar, $dateType, $date) {
$vertrekkenOfAankomen = "aankomen";
if(DATE_DEPARTURE === $dateType) {
$vertrekkenOfAankomen = "vertrekken";
}
$myMins = (int)$date->minutes;
$myMins -= ($myMins % 5);
$postFields = array(
"form1:vertrekGemeenteInput" => $dep->gemeente,
"form1:vertrekStraatInput" => $dep->straat,
"form1:vertrekNrInput" => $dep->nummer,
"form1:aankomstGemeenteInput" => $ar->gemeente,
"form1:aankomstStraatInput" => $ar->straat,
"form1:aankomstNrInput" => $ar->nummer,
"form1:vertrekkenOfAankomenRadio" => $vertrekkenOfAankomen,
"form1:dagCombo" => (string)(int)$date->day,
"form1:maandCombo" => (string)(int)$date->month,
"form1:jaarCombo" => $date->year,
"form1:uurCombo" => (string)(int)$date->hour,
"form1:minutenCombo" => (string)$myMins);
print_r($postFields);
// do the curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,
'http://reisinfo.delijn.be/reisinfo/RouteplannerHomeBeperktServlet?taal=nl');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
curl_close($ch);
if($contents == false) {
return null;
}
echo $contents;
$myRouteObjects = extractRoutesFromXMLData($contents);
return $myRouteObjects;
}
// ==== Returns array of Route objects or null
function extractRoutesFromXMLData($dataString) {
$tableBody = getResultsTableBody($dataString);
if($tableBody != null) { return null; }
$tableRows = getTableRowsOfTableBody($tableBody);
if($tableRows != null) { return null; }
// put them in an array
$myArray = array();
$count = $tableRows->length;
for($i = 0; $i < $count; $i++) {
$aNode = $tableRows->item(0);
$myArray[] = $aNode;
}
return $myArray;
}
// ==== Returns XMLDocument or null
function getResultsTableBody($dataString) {
// Get table element
$status = preg_match('/<TABLE id="routeplanner_overzicht".*?>.*?<\/TABLE>/is',
$docString, $matches);
if($status == 0) {
return null;
}
$tableElement = $matches[0];
// Extract body
$status = preg_match('/<TBODY>.*?<\/TBODY>/is',
$tableElement, $matches);
if($status == 0) {
return null;
}
$doc = new DOMDocument();
$doc->loadXML($matches[0]);
return $doc;
}
// ==== Retunrs XMLNodeList or null
function getTableRowsOfTableBody($xmlDoc) {
$xpath = new DOMXPath($domDoc);
$xpathres = $xpath->evaluate("//tbody[0]/tr");
if($xpathres == false) {
return null;
}
return $xpathres;
}
?>
Date.php、Plaats.php 和 Route.php 都包含分别封装日期、位置和可能路线的类。
【问题讨论】:
-
document.forms[1].elements.length说有 14 个,但您只列出了 11 个。此外,有些网站拒绝在没有 cookie 的情况下运行(一个跟踪和两个 javascript 测试)。查看 Firebug 网络流量。 -
我确实忘记了 13 个中的一个(有一个收音机),但您正在查看
Route.php那是结果解析器,它有一个包含 11 列的表。但无论如何,我检查了饼干,我认为你是对的。当我禁用 cookie 时,网站会显示“Uw sessie is verlopen”(=“您的会话已过期”)。现在可以手工制作这样的饼干吗?还是有其他方法可以解决这个问题? -
没有查看您的代码。下载链接无效。最好在此处粘贴摘录。 -- cURL 允许以某种方式设置 cookie,请参阅各种
CURLOPT_COOKIE*标志。我认为这是此类任务最常见的问题。