2

我正在尝试从远程站点获取图表图像。
但是该图像似乎是在调用时从站点动态创建的。
未登录时它不会返回任何内容。

这是图片网址

<img src="http://fuelbuyer.dtn.com/energy/view/energy/chart.do?width=150&height=120&chartType=0&ts=1352196066175&rackId=446&productId=179&points=8&showExtraLine=True">

我以某种方式设法使用此代码登录并尝试显示图像。
但它不起作用。

$ch = curl_init();
$url = 'http://fuelbuyer.dtn.com/energy/common/signin.do?';
$login = 'username=$USER&password=$pass&autoLogin=true&partnerId=0&partnerName=';
curl_setopt($ch, CURLOPT_URL, $url.$login);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch); 

直接调用图像 URL(仅在登录时在浏览器地址栏上),将给出一些代码,例如

" ‰PNG IHDR–xŸ-–GPIDATxÚílÇÇ IHKB-ËuÄت!Eš°Š !ÈB IÀµ©...œ€ $@S‡8¶ ªÀ"D²œÐbR Æ`~WjAx;~Äø...ç·ï±;³ýÎk×ûºÙݳ™»Þ_ +´Ü÷v÷·3óÿf¾™òqnAa@„ùÂM›6åÔ5}£¡k訚Ži踶¾USž†Nh(_M'5tJC Á™°‚ðN?ÿ¼3>¾=5µîòåêÕô©V¢:‰ê%º+ QƒD5õ©Y"›D-Õ*Q›Dí}ê¨S¢.‰º%²Käè"³Û¹"߸ÑUPà'^"^—õéôéÓ!rBP¸¡Ÿÿ¼®¨¨F"ïò""´ÂOŠÐ4? G}=ŽŠ"×ÎgdPòc!† #—[WB}"

但是当被称为

<img src="http://fuelbuyer.dtn.com/energy/view/energy/chart.do?width=150&height=120&chartType=0&ts=1352196066175&rackId=446&productId=179&points=8&showExtraLine=True">

将给出正确的图像。

我真的不知道下一步该怎么做。

如何使用 cURL 登录网站并执行此行。
<img src="http://fuelbuyer.dtn.com/energy/view/energy/chart.do?width=150&height=120&chartType=0&ts=1352196066175&rackId=446&productId=179&points=8&showExtraLine=True">
成功登录后,该站点将被重定向到主页。
因此,我也必须防止重定向。
会话将在几秒钟后终止。

提前谢谢你,
尤金PJ

我让它工作了。请参阅此评论。
无法从我的学校网站获取我的日程安排数据。使用 cURL 登录将不起作用

4

3 回答 3

2

您需要让浏览器知道这是一张图片,尝试将其添加到您的 PHP 代码中:

header("Content-Type: image/png");
$ch = curl_init();
$url = 'http://img842.imageshack.us/img842/7650/pngtransparencydemonstr.png';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
echo $output;
于 2012-11-07T09:42:32.083 回答
2

您使用 cURL 收到的图像是正确的(请参阅,您得到一个 PNG 标头)。

如果你想在你的页面上显示它 - 让我们在这里忽略许可问题 - 你需要将你的抓取代码放在它自己的页面中,例如myimage.php

然后在你的 HTML 代码中

<img src="myimage.php" />

在 中myimage.php,一旦你有了$output,你就输出它:

<?php
$ch  = curl_init();
$url = 'http://fuelbuyer.dtn.com/energy/common/signin.do?';
$login = 'username='.$USER.'&password=$pass&autoLogin=true&partnerId=0&partnerName=';
curl_setopt($ch, CURLOPT_URL, $url.$login);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
// $info = curl_getinfo($ch);
curl_close($ch); 

// Let's suppose that $content (what we want to send) is exactly equal to $output
$content = $output;
// If, instead, we have in the output something like <img src="crypto-unique.png" />"
// we will need to parse $output (using XML maybe, or, just this once, a regex)
// and get its URL, then retrieve the image using cURL again, and *this* will be our
// final $content.

// Just output
Header("Content-Type: image/png");
Header("Content-Length: " . strlen($content));
die($content);

// Or if we wanted to manipulate it, e.g. send it as JPEG at 75% quality
$gd = imageCreateFromString($content);
Header('Content-Type: image/jpeg');
ImageJPEG($gd, '', 75);
die();

?>

有关更复杂的登录方案的肮脏细节,请参阅如何从需要 cookie 登录的网站中抓取 PHP 中的网站内容?

于 2012-11-07T09:54:21.620 回答
0

您是否尝试过图像标题?

header("Content-Type: image/png");
header("Content-Disposition: attachment; filename=image.png" );
于 2012-11-07T09:49:45.747 回答