Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

美女サイトのデータハッキング方法をまとめてみた



美女サイト

  • 美人時計 http://www.bijint.com/
  • 美女暦 http://www.bijogoyomi.com/
  • 今更ではあるが2つのサイトのデータをハッキングしてみた。
  • 以下の内容を試す場合は自己責任でお願いします。また内容はすぐに消す可能性があります。

美人時計の画像

  • 数分置きに美人が入れ替わる仕組みで、画像のURLは日付に関係なく時間で固定。例えば http://www.bijint.com/jp/tokei_images/1200.jpg
  • URLが時間で固定なので好みの美人の画像に巡り会えない可能性がある。
  • アクセスする際にrefererを仕込んでおこないとエラーになるので、refererhttp://www.bijint.com/jp/とする。
  • プロフィールが掲載されているhtmlパーツもほぼ同じ仕組みで取得可能。

画像、htmlパーツ取得のheader情報

  • 実際にブラウザ上でどのようにデータが取得されているのかを見てみる。ツールはwebインスペクタやfirebugでheader情報を参照する。以下の内容はsafari => webインスペクタ => ネットワーク => ヘッダを参照したもの。
  • 画像
URL を要求:http://www.bijint.com/jp/tokei_images/0000.jpg
リクエストメソッド:GET
ステータスコード:200 OK

リクエストヘッダソースの表示
Referer:http://www.bijint.com/jp/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22

レスポンスヘッダソースの表示
Accept-Ranges:bytes
Connection:close
Content-Length:156987
Content-Type:image/jpeg
Date:Wed, 23 Nov 2011 16:00:00 GMT
Last-Modified:Mon, 03 Oct 2011 05:04:15 GMT
Server:Apache
  • htmlパーツ
URL を要求:http://www.bijint.com/jp/cache/0000.html
リクエストメソッド:GET
ステータスコード:200 OK

リクエストヘッダソースの表示
Referer:http://www.bijint.com/jp/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22

レスポンスヘッダソースの表示
Accept-Ranges:bytes
Connection:close
Content-Length:1831
Content-Type:text/html
Date:Wed, 23 Nov 2011 15:55:01 GMT
Server:Apache

現在時刻の美人時計htmlパーツを保存する

  • 以下はpythonのサンプルコード。処理はべた書き。htmlパーツと画像をダウンロードして保存する処理。時間固定のURLでもスクリプト実行でお気に入りの美人を保存可能。
  • 24時間分のデータが欲しい人は適当にfor文で0000.html 0000.jpgから回すように修正が必要。集中アクセスしないようにsleepを挟むような優しさが必要。
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import os,urllib2,re
from datetime import *

def mkdir():
    if os.path.isdir( 'image/%s' % ( datetime.now().strftime( '%Y%m%d' ) ) ) == False:
        os.makedirs( 'image/%s' % ( datetime.now().strftime( '%Y%m%d' ) ) )
    if os.path.isdir( 'html/%s' % ( datetime.now().strftime( '%Y%m%d' ) ) ) == False:
        os.makedirs( 'html/%s' % ( datetime.now().strftime( '%Y%m%d' ) ) )

def setOpener():
    ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22'
    opener = urllib2.build_opener()
    referer = 'http://www.bijint.com/jp/'
    opener.addheaders = [( 'User-Agent', ua ),( 'Referer', referer )] 
    return opener

def getHtml():
    opener = setOpener() 
    baseurl = 'http://www.bijint.com/jp/cache/'
    url = '%s%s.html' % ( baseurl, datetime.now().strftime( '%H%M' ) )
    contents = opener.open( url ).read()
    r = re.compile( r'tokei_images' )
    contents = r.sub( '../../image/%s' % ( datetime.now().strftime( '%Y%m%d' ) ) , contents )
    contents = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body>' + contents + '</body></html>'
    f = open( 'html/%s/%s.html' % ( datetime.now().strftime( '%Y%m%d' ), datetime.now().strftime( '%H%M' ) ), 'w' )
    f.write( contents )
    f.close

def getImage():
    opener = setOpener()
    baseurl = 'http://www.bijint.com/jp/tokei_images/'
    url = '%s%s.jpg' % ( baseurl, datetime.now().strftime( '%H%M' ) ) 
    contents = opener.open( url ).read()
    f = open( 'image/%s/%s.jpg' % ( datetime.now().strftime( '%Y%m%d' ), datetime.now().strftime( '%H%M' ) ), 'w' )
    f.write( contents )
    f.close

def main():
    mkdir()
    getImage()
    getHtml()

if __name__ == '__main__':
    main()

保存したhtmlパーツのサンプル

美女暦の画像

  • 1日1人の美人にフォーカスしたサイトでページURLに日付が埋め込まれている。美人時計と異なり画像データが消える事は無い。 http://www.bijogoyomi.com/bijo3/index.php/2011/11/24
  • 土日/祝日は美人を公開していない。
  • 1人につき20枚ほど様々な角度からの写真が用意されており、日付のURLにアクセスしてスクレイプすると画像のURLが取得可能。
  • 美人時計と異なりrefererの制限がなく、画像に直接アクセスすれば見れてしまう。

美女暦のhtml

  • 以下をスクレイプの対象とする。
  • 画像 : imgタグを抽出する。
<!--window-->
<tr>
<td colspan="2" height="559px">
<div class="img_window">
<div class="coda-slider-wrapper">
<div class="coda-slider preload" id="coda-slider-1">
<div class="panel">
<div class="panel-wrapper">
<span id="coda-nav-right-1"><a href="#"><img height="517" src="/bijo/img2.php?m=if&i=20111124_4cacc2_pc_01.jpg"></a></span>
</div>
</div>
<div class="panel">
<div class="panel-wrapper">
<span id="coda-nav-right-1"><a href="#"><img height="517" src="/bijo/img2.php?m=if&i=20111124_4cacc2_pc_02.jpg"></a></span>
</div>
</div>
<div class="panel">
<div class="panel-wrapper">
<span id="coda-nav-right-1"><a href="#"><img height="517" src="/bijo/img2.php?m=if&i=20111124_4cacc2_pc_03.jpg"></a></span>
</div>
</div>

(略)
  • プロフィール : 以下のタグを丸ごと抽出。
<span class="flow_text">
<ul id="profile_ticker">
<li>名前<strong>*****さん</strong></li>
<li>年齢<strong>19歳</strong></li>
<li>出身地<strong>埼玉県</strong></li>
<li>血液型<strong>A型</strong></li>
<li>星座<strong>うお座</strong></li>
<li>身長<strong>163cm</strong></li>
<li>ブログリンク<strong><a href="*****" target="_target">****</a></strong></li>
<li>職業<strong>大学生</strong></li>
<li>趣味/特技<strong>映画を観ること</strong></li>
<li>将来の夢<strong>エンターテイナー</strong></li>
<li>チャームポイント<strong>くちびる</strong></li>
<li>彼氏の有無<strong></strong></li>
<li>彼氏に求める条件(3つ)<strong>やさしい/背が高い/可愛らしい</strong></li>
<li>男性に対して何フェチ?<strong>後ろから見た二の腕</strong></li>
<li>理想の告白のされ方は?<strong>面と向かってなら何でもOK</strong></li>
<li>結婚したい有名人<strong>佐藤健</strong></li>
<li>憧れの女性有名人<strong>吉高由里子</strong></li>
<li>最近行きつけの美味しいお店<strong></strong></li>
<li>一言コメント<strong>現役女子大生です。ブログ遊びにきてくださ〜い!</strong></li>
<li>好きなファッションブランドはなんですか?<strong>TOP SHOP</strong></li>
<li>使ってる携帯はiPhone?アンドロイド?ガラケー?<strong>iPhone3Gs</strong></li>
<li>よく使うアプリはなんですか?<strong>写真加工アプリ</strong></li>
<li>ファッションのコーディネートで気を使うポイントは?<strong>足を出す!</strong></li>
<li>冬にチャレンジしてみたいあなたのコーディネートはなんですか?<strong>モコモコのファーコートorファーアイテムが欲しいです&#9825;</strong></li>
</ul>
</span>

画像付きhtmlを保存

  • pythonで記述。元画像が大きいので画像のサイズをリサイズして一覧で表示。python正規表現で抽出。
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import os,urllib2,re
from datetime import *

def mkdir():
    if os.path.isdir( 'html/%s' % ( datetime.now().strftime( '%Y%m%d' ) ) ) == False:
        os.makedirs( 'html/%s' % ( datetime.now().strftime( '%Y%m%d' ) ) )

def setOpener():
    ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22'
    opener = urllib2.build_opener()
    referer = 'http://www.bijogoyomi.com/'
    opener.addheaders = [( 'User-Agent', ua ),( 'Referer', referer )] 
    return opener

def getHtml():
    opener = setOpener() 
    baseurl = 'http://www.bijogoyomi.com/bijo3/index.php/'
    url = '%s%s' % ( baseurl, datetime.now().strftime( '%Y/%m/%d' ) )
    contents = opener.open( url ).read()
    return contents

def getPersonData( html ):
    if re.compile( r'(<span class="flow_text">(.|\n)*?</span>)'  ).search( html ) is None:
        exit()
    return re.compile( r'(<span class="flow_text">(.|\n)*?</span>)'  ).search( html ).group()

def getImages( html ):
    if re.compile( r'<span id="coda-nav-right-1">.*?<img.*?src="(.*?)"' ).findall( html ) is None:
        exit()
    return re.compile( r'<span id="coda-nav-right-1">.*?<img.*?src="(.*?)"' ).findall( html )

def saveHtml( images,pdata ):
    baseurl = 'http://www.bijogoyomi.com'
    count = 0
    contents = '<html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8" /></head><body>'
    contents += pdata 
    for i in images:
        contents += '<img src="' + baseurl + i + '" width="400" height="250" />'
        if count % 3 == 2:
            contents += '<br/>'
        count = count + 1
    contents += '</body></html>'
    f = open( 'html/%s/bijogoyomi.html' % ( datetime.now().strftime( '%Y%m%d' ) ), 'w' )
    f.write( contents )
    f.close

def main():
    mkdir()
    html = getHtml()
    pdata = getPersonData( html )
    images = getImages( html )
    saveHtml( images,pdata )

if __name__ == '__main__':
    main()

保存したhtmlサンプル