@wikiメニュー編集表示ツールヘルプブックマーク登録RSS登録
ログイン
新規ページ作成
すでにあるページをコピーして新規ページを作成 スレッドフロート型掲示板から引用して新規ページ作成(α版) ブログの内容から引用して新規ページ作成(α版) ファイルをアップロードして新規ページ作成(α版) 他のホームページから引用して新規ページ作成(α版)
[PR] 無料ホームページ @PAGES [PR] 無料SNSレンタル @PNE [PR] 無料フォーラム型掲示板レンタル @BB [PR] 選べる無料掲示板 @BBS [PR] 2ch型無料レンタル掲示板 @chs
@wikiで新規wikiを作成
このページを編集 このページを編集(メニュー非表示編集;α) このページをコピーして新規ページを作成 このページのページ名を変更 このページの編集モードを変更 このページの閲覧/編集権限の変更
このページにファイルをアップロード
このウィキにファイルをアップロード(FTP機能/管理者のみ利用可)
メニューを編集(メニュー部分は非表示で編集) 右メニューを編集(メニュー部分は非表示で編集)
このページの最新版変更点このページの編集履歴(バックアップ) このページへのリンク元 このページへのトラックバック
このページをPDFで表示(α版)
関連ページ(α版)
このwikiのページ一覧 編集履歴(バックアップ)のあるページ一覧 このwikiのタグ一覧 このwikiの更新情報RSSこのwikiの更新情報RSS このwikiの新着ページRSSこのwikiの新着ページRSS
このwiki内を検索 @wikiパーツ▶  @wiki便利ツール▶  このwikiの管理者に連絡
@wiki助け合いコミュニティ
wiki(ウィキ)って何?
初心者ガイド
ご利用ガイド 良くある質問 プラグイン一覧 編集モードの違いについて 不具合や障害を見つけたら 管理・設定マニュアル
はてなブックマークする FC2ブックマークに追加 Livedoor クリップに追加 Yahoo!ブックマークに登録 del.icio.usに追加
はてなRSSに追加 livedoor ReaderにRSSフィードを登録 Yahoo!にRSSフィードを登録 BloglinesにRSSフィードを登録 NewsGator OnlineにRSSフィードを登録 iGoogleにRSSを追加
@wikiパーツ:あなたのサイトにWikiデータを簡単表示!
最近更新したページの一覧を表示する 最近作成したページの一覧を表示する このwiki内を検索するフォームを表示する このwikiのタグクラウドを表示する 自動リンク辞書を利用する
@wiki便利ツール:トップページ
まとめサイト作成支援ツール RSSかんたん作成 興味キーワードをチェック!!(RSSナビ) いろんなblogのRSSかんたん作成ページ アマゾン商品検索(簡単アフィリエイト) wikiに株式情報(日本)を表示 wikiに株式情報(中国)を表示 かんたんHTML直接入力 Q&Aサイトかんたん連携作成 wikiに為替情報を表示 はてなアンテナと簡単連携
ところてん

日記 > 2008年09月23日 > pixivにログインして画像を保存する方法


pixivから画像をダウンロードするスクリプトを公開したら、pixivの事務局から怒られたでござるの巻。
どうやら不特定多数への配布がまずい臭いので、プログラムの解説だけ書いておく。
誰かが既に書いてそうだけど、まぁいいや。

ログインのプロセスは次のようになる。
  1. 初回アクセス時はcookieがからっぽの状態でログインサーバにアクセスする。
  2. ログインサーバは初回アクセスフラグを立てたCookieを返す。
  3. ユーザーはログインIDとパスワードを入力する際に、サーバから受け取ったCookieも同時に送信する。
  4. サーバはIDとパスが一致していることを確認し、自身が送ったCookieが正しく送られていることを確認する
  5. サーバはログイン状態フラグを立てたCookieを送信する。
  6. 以後クライアントはログイン状態のCookieを使うことで、セッションを継続することができる。


そういうわけで、まずはHTTPのアクセスにCooikeを使えるようにしなきゃならない。
Pythonの標準ライブラリのurllib2とcookielibを使うことでこれは実現できる。

  1. import urllib2, cookielib
  2.  
  3. cj = cookielib.CookieJar()
  4. cjhdr = urllib2.HTTPCookieProcessor(cj)
  5. opener = urllib2.build_opener(cjhdr)
  6. opener.addheaders = [('User-agent', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1)'),
  7. ('Referer', '')]
  8.  

opener.addheadersはタプルのリストを突っ込んでおくと、それが自動的にヘッダに追加される。
UAを書き換えてブラウザからのアクセスに見せかけないと、弾かれる。
また、Refererは初回アクセスなので、とりあえずからっぽにする。


次にpixivにログインするプロセス。

usernameとpasswordの部分は適宜書き換えて。
pixivのログインページのソースを見れば、ログインフォームのIDがわかるので、
そいつを先ほど作ったcookie管理機能付きのopenerから、postメソッドを使って送ってやる。
基本的にopenしてreadするだけでOK。
これでCookieにログイン情報が書き込まれる。

  1. def loginPixiv():
  2. pixivLoginURL = "http://www.pixiv.net/index.php"
  3.  
  4. postdata = {}
  5. postdata["pixiv_id"] = username
  6. postdata["pass"] = password
  7. params = urllib.urlencode(postdata)
  8.  
  9. opener.open(pixivLoginURL, params).read()
  10.  

これでログイン状態にすることができた。
以後openerでpixivのURLにアクセスすれば、ログイン状態のcookieがあるので、ログイン後の機能を利用することができる。

つぎは画像のダウンロードプロセス。
でっかい画像を表示すると次のようなURLがあらわれる。(XXXXは数字)
http://www.pixiv.net/member_illust.php?mode=big&illust_id=XXXXX
このページのソースを読むと、画像の実体は次のようなURLであることがわかる。

http://img18.pixiv.net/img/USERNAME/XXXXX.png
しかしこのURLに直接アクセスしても、画像ファイルを取得することはできない。
これはRefererの問題で、正常ルート以外でアクセスした場合に表示させないためである。

なので、Refererを正規ルートであるように見せかける。
Iria先生のReferer偽装とかが懐かしいね。

bigIllustPageURLは「http://www.pixiv.net/member_illust.php?mode=big&illust_id=XXXXX」これとかのURLね。
正規表現で適当に抜いてきて、でっかい画像を落とす

  1. def downloadImage(bigIllustPageURL):
  2. bigIllustPage = opener.open(bigIllustPageURL).read()
  3. illustFile = re.search(r'<img src="(?P<url>http://img\d+\.pixiv\.net/img/.+?/\d+\..+)" border="0">', bigIllustPage)
  4. if illustFile:
  5. fileurl = illustFile.group("url") #イラストの実体URL
  6. illustFilename = fileurl.split("/")[-1] #イラストファイル名
  7.  
  8. opener.addheaders[1] = ('Referer', bigIllustPageURL) #refererを書き換えて、アクセス制限を回避
  9. fp = open(illustFilename, "wb") #書き込む
  10. fp.write(opener.open(fileurl).read())
  11. fp.close()
  12.  

これで画像ファイルが落ちてくるんじゃないかな。


カテゴリ: [日記] - TrackBack(0) - 2008年09月23日 23:30:56
  • 怒られたにもかかわらず解説載せるって・・・・どんだけですか -- 名無しさん (2008-09-24 01:15:44)
名前: コメント:

更新履歴

2009-01-14

2009-01-12

2009-01-11

2009-01-10

2009-01-07

2009-01-06

2009-01-03

2009-01-01

2008-12-29

2008-12-28

2008-12-26

2008-12-25

2008-12-24

2008-12-17

2008-12-16