2

リモートサイトからチャート画像を取得しようとしています。
しかし、画像は呼び出されたときにサイトから動的に作成されたように見えました。
ログインしていない場合は何も返されません。

これは画像のURLです

<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を直接呼び出すと(ブラウザのアドレスバーでログインしている場合のみ)、次のようなコードが表示されます。

"‰PNGIHDR–xŸ-œGPIDATxÚílÇÇIHKB-ËuÄت!Eš°Š!ÈBIÀµ©…œ€$ @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">
ログインに成功すると、サイトはホームページにリダイレクトされます。
そのため、リダイレクトも防止する必要があります。
セッションは数秒後に終了します。

よろしくお願いします、
Eugine PJ

私はそれを動かしました。このコメントを参照してください。
学校のサイトからスケジュールデータを取得できません。cURLでのログインが機能しない

4

3 に答える 3

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ログインが必要なWebサイトからPHPでWebサイトのコンテンツを取得するにはどうすればよいですか?」の回答を参照してください。

于 2012-11-07T09:54:21.620 に答える
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 に答える
0

画像ヘッダーを試しましたか?

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