PHP のプログラムでは、グラフのイメージが正しく取れてたのに、<img> で同じリクエストを出すようにしたら、イメージが取得できなくなった、ということですよね?
<img> を使うと、Referer: が、それを抱えているページのものになるのですが、それがはじかれて 403 になっているようです。
以下、telnet で試した結果です。
<img> を使ったときのヘッダを模したもの。
GET /esignalprod//esigchartspon?cont=NKD+Z1&period=V&varminutes=5&size=560x384&bartype=CANDLE&bardensity=HIGH&showextendednames=true HTTP/1.1
Host: quotes.esignal.com
Referer: http://www.w-stock.biz/
その応答。
HTTP/1.1 403 Invalid Referrer
Server: Resin/3.0.23
Content-Type: text/html
Transfer-Encoding: chunked
Date: Tue, 04 Oct 2011 14:36:45 GMT
ステータス 403 が返される。Referer: が問題らしいことが、ステータスの後の文字列で分かる。
Referer: を quotes.esignal.com にしたもの (PHP のプログラムでやってたこと)。
GET /esignalprod//esigchartspon?cont=NKD+Z1&period=V&varminutes=5&size=560x384&bartype=CANDLE&bardensity=HIGH&showextendednames=true HTTP/1.1
Host: quotes.esignal.com
Referer: http://quotes.esignal.com/
その応答。
HTTP/1.1 200 OK
Server: Resin/3.0.23
Content-Type: image/png
Transfer-Encoding: chunked
Date: Tue, 04 Oct 2011 14:29:41 GMT
正しくイメージを取得できる。
直リンク相当のヘッダ (Referer: が無い) の場合。
GET /esignalprod//esigchartspon?cont=NKD+Z1&period=V&varminutes=5&size=560x384&bartype=CANDLE&bardensity=HIGH&showextendednames=true HTTP/1.1
Host: quotes.esignal.com
その応答。
HTTP/1.1 200 OK
Server: Resin/3.0.23
Content-Type: image/png
Transfer-Encoding: chunked
Date: Tue, 04 Oct 2011 14:39:28 GMT
これでも、正しくイメージを取得できる。
<img> を使う限りは、ヘッダを自由にできないので、PHP のプログラムを介してイメージを取得するしかないと思います。
a-kuma3さま
ありがとうございます。
質問者のidetuyoと申します。
詳細のご回答誠にありがとうございます。
以前、以下のようなPHPプログラムを解して
イメージを取得していたのですが・・・
仕様が変ったのか、イメージ取得できなくなってしまいました。
プログラムは以下の通りです。
こちらのPHPプログラムでなく
別のプログラムでイメージ取得は出来ないでしょうか?
恐れ入りますが、アドバイス頂けたら幸いです。
$type = ‘Content-type: image/png’; //画像データのMIME-type
$host = ‘charts.marketcenter.com’; //目的のホスト
$path = ‘/cis/cbotcis?cont=NKD%20Z1&period=V&bartype=CANDLE&bardensity=MEDIUM&showextendednames=true&headerbackground=255,255,255&headerforeground=0,0,0&headerdatacolor=0,0,0&size=650X314&varminutes=5
‘; //目的のパス
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (! $fp) {
echo “$errstr ($errno)
\n”;
} else {
$out = “GET $path HTTP/1.1\r\n”;
$out .= “Host: $host\r\n”;
$out .= “User-Agent: Mozilla/5.0\r\n”;
$out .= “Connection: Close\r\n\r\n”;
fwrite($fp, $out);
//HTTPヘッダを読み飛ばす
while (! feof($fp)) {
$headers = fgets($fp, 8192);
if (trim($headers) == ”) {
break;
}
}
//画像を読み込む(chunked形式)
$img = ”;
while (! feof($fp)) {
$ss = fgets($fp);
$cnt = intval($ss, 16);
while ($cnt > 0) {
$bb = fread($fp, $cnt);
$cnt -= strlen($bb);
$img .= $bb;
}
fread($fp, 2); //\r\nをスキップ
}
fclose($fp);
header($type) ;
echo $img;
}
?>