Hatena::ブログ(Diary)

konisimple log RSSフィード Twitter

このブログは、koniがkonisipmleの更新履歴と技術的メモ、思いつきなどを思いつくままに書き留めたものです。
koniの詳しいプロフィールはこちらです。

2010年04月10日

産経新聞が有料会員登録をしなくても無料で紙面と同じように読める件について(PHPで産経新聞紙面を得るスクリプト)

産経新聞のiPhoneアプリのパケット解析してみた - konisimple logに書いたのはお遊びでした。

でも実は産経新聞は紙面データで金とってるそうです!→||| 産経NetView |||

産経さん、今の状態だと10行ぐらい*1コード書くだけで簡単に紙面見れちゃいますよ!

これでいいんですか!?

そんなわけないだろ、というひとのために実際にかいてみました。

例えばPHP使える環境があるなら下のファイルを置くだけで見れちゃう。

かなりセキュリティ甘いのではという気がするのですがどうなんでしょう。

しかも,過去のデータも見れちゃうんですね。どこまで古い奴までみれるかは調査してないけど、割と古いのも見れる。

ウェブ産経新聞を画像で読むPHPスクリプト

f:id:konisimple:20100411050656p:image

こんな感じで普通に見れちゃいます。以下のファイルをsankei.phpとか名前をつけて保存するだけ。

しかも上の画像ではサムネだけだけど、実は原寸大で普通に読めるレベルの解像度です。

<?php
	$date=$_GET["date"];
	if(strlen($date)==0 OR !checkdate($date[5].$date[6],$date[8].$date[9],$date[0].$date[1].$date[2].$date[3])){
		$url1="http://www.sankei.co.jp/netview/iphone/current_edition.xml";
		$xml1=simplexml_load_file($url1);
		$date=substr($xml1->attributes()->Root,0,10);
	}
	$url2="http://www.sankei.co.jp/netview/iphone/{$date}_i/{$date}_i.xml";
	$xml2=simplexml_load_file($url2);
	foreach($xml2->Pages->Page as $item){
		$html.="<h2 id='p{$item->attributes()->PageNumber}'>{$item->attributes()->PageNumber}面 ({$item->attributes()->Section})</h2><div>";
		for($i=0;$i<=3;$i++){
			for($j=0;$j<=3;$j++){
				$url="http://www.sankei.co.jp/netview/iphone/{$date}_i/";
				$url.="pages_images/".substr($item->attributes()->XMLLocation,10,22);
				$url.="/lv3_{$j}_{$i}.jpg";
				$z=0.7;
				$w=372*$z;
				$h=502*$z;
				$html.="<img src='{$url}' width='{$w}' height='{$h}'>";
			}
		$html.="<br>";
		}
			$html.="</div>";
		$thumb.= "<a href='#p{$item->attributes()->PageNumber}'><img src='http://www.sankei.co.jp/netview/iphone/{$date}_i/{$item->attributes()->ThumbnailURL}' width='182' height='252'></a>";
	}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<meta http-equiv="Content-Script-Type" content="text/javascript">
		<meta http-equiv="Content-Style-Type" content="text/css">
		<style type="text/css">
			body{margin:10px;}
			div{margin:0;}
			h2{margin:0 10px;border-bottom:1px dotted #000;padding:5px;}
		</style>
		<title>俺専用産経新聞</title>
	</head>
	<body>
	<h1>俺専用産経新聞 </h1>
	<form>日付指定(YYYY_MM_DD形式):<input type="text" value="<?=$date?>" name="date"><input type="submit" value="見る"></form>
	<h2><?=$date?>の目次</h2>
	<?=$thumb?>
	<?=$html?>
	<p><a href="http://d.hatena.ne.jp/konisimple/">konisimple log</a>  <a href="http://twitter.com/koni">@koni</a>
	<p>2010/4/11 04:59ver
	</body>
</html>

注意

  • このスクリプトを悪用しないこと。このファイルを公開領域に置くと、あんまりよくないことがおこる気がします
  • 上のスクリプトは公開することを想定していないのでXSS脆弱性とかは対策してないです。他にも何か脆弱性があるかも。あしからず。
  • 著作権侵害とかの意図は一切ないです。

さすがにこのファイルを公開するのは怖いからしないけど、簡単に再現できちゃうはずです。

産経新聞のiPhoneアプリのパケット解析してみた

産経新聞(iPhone版)というのがあります。

これは無料で産経新聞が紙の紙面の構成のまま読めるというとても便利なアプリです。

今回、暇だったので、WireSharkというバケット解析ソフトでiPhoneウェブとの通信を盗聴?してみました。

産経新聞iPhoneアプリの仕組み

最新の新聞データを得る(current_edition.xml)

バケット解析の結果、産経新聞アプリを起動するとまず、決まったURLアクセスする。ここには最新の紙面の情報があるxmlURLが書いてある。

http://www.sankei.co.jp/netview/iphone/current_edition.xml

<CurrentEdition Root="2010_04_10_i" XMLFileName="2010_04_10_i.xml"/>
その日の新聞の目次(日付/日付_i.xml)

上のxmlを見て、この日の新聞の何面にどの情報が書いてあるかとかの情報を得る。なんかxmlだと新聞社のウェブサイトよりとてもセマンティックって感じ。

http://www.sankei.co.jp/netview/iphone/2010_04_10_i/2010_04_10_i.xml

<Edition Newspaper="iphone" Name="2010_04_10_i" Date="2010/04/10" Version="1.01" FrontPageURL="" PageWidth="38" PageHeight="51.5">
 <Sections>
  <Section Name="総合" Index="3"/>
  <Section Name="国際" Index="4"/>
    ...
  </Sections>
 <Pages>
  <Page ID="12984" XMLLocation="pages_xml/page12984_netviews1958.xml" PageNumber="1" ThumbnailURL="thumbnails/page1.jpg" Section="総合"/>
 </Pages>
</Edition>
ページ情報

次は上のxmlからページの画像の格納されているURLを示すxmlアクセスする。

http://www.sankei.co.jp/netview/iphone/2010_04_10_i/pages_xml/page12984_netviews1958.xml

<Pages ID="12984" PageTitle="" PageNumber="1">
 <LevelImages Level1Partitions="1" Level2Partitions="2" Level3Partitions="4" Directory="pages_images/page12984_netviews1958/" FileType="jpg" BasePixelWidth="372" BasePixelHeight="504"/>
 <Articles/>
 <Regions/>
 <RichMedias/>
 <Titles/>
 <Links/>
</Pages>
新聞紙面の画像データ

実はこれでもうすべての画像データにアクセスできるようになった。

まず、画像データの基本のURL

http://www.sankei.co.jp/netview/iphone/2010_04_10_i/pages_images/page12984_netviews1958/lv1_0_0.jpg

である。

あとは末尾のファイル名を変えればよい。

下にファイル名と内容を一覧にしてみた。

ファイル名内容
lv1_0_0.jpgページ全体
lv2_0_0.jpgズームした左上
lv2_0_1.jpgズームした左下
lv2_1_0.jpgズームした右上
lv2_1_1.jpgズームした右下
lv3_0_0.jpgもっとズームした左上
lv3_0_1.jpgもっとズームした中央
lv3_0_2.jpgもっとズームした右上
......
lv3_3_3.jpgもっとズームした右下

なるほど。ズームのレベルに応じて3つのファイルに分けてるんですね。

まとめ

というわけで、これを利用すれば別にiPhoneアプリ使わなくても産経新聞がPC上で読めるアプリも簡単に作れそうですね。

ウェブアプリとかも作れそうですね。

ここらへんもっとちゃんとガードされてるのかと思いましたが、意外に寛容でした。

まぁどう考えても著作権的にアウトなので、そんなことする人はいないと思ってるんでしょうね。

パスワードはないにしてもアプリによる正規のアクセスかどうか認証する*2ぐらいはすればいいのにという気はします。

まぁそういうのが一切ないので不正アクセス防止法とかにはひっかからないはず。

パケット解析のおもしろさがわかる(?)、産経新聞iPhoneアプリはどういう仕組み?っていう話でした。

追記(10/4/11 05:12)

結局書いちゃった。

これでいいのか!産経さん!紙面データダダ漏れですよ!(PHPで紙面を得てみる) - konisimple log

erockr携帯版に広告をつけてみました。

二つの携帯PPC広告をランダムで表示するようにしてみました。

どのぐらい入るのかなぁ。

*1:下の例はxml処理に10行と表示を整形するのに40行使っている。

*2:チャレンジレスポンス認証してセッション処理するとか