1. まとめトップ

PHPでpixivの画像保存(PHP初心者向け)

pixivのオリジナルサイズの画像を取得・保存(ダウンロード)するPHPの解説です。APIを使わない簡単な方法です。

更新日: 2016年11月22日

3 お気に入り 9744 view
お気に入り追加

この記事は私がまとめました

とりあえずPHPで何か作ってみたい方、PHPを覚えようとしたけどことがあるけど挫折した方を想定しています。
PHPがメインですがJavaScript(jQuery)も少し出てきます。

これくらいなら自分も1から作れそうだなーと思ってもらえると嬉しいです。

便宜上オリジナルサイズではない画像すべてをサムネイル画像と呼んでいます。

仕様

・一般、R18の両方に対応
・オリジナルサイズの画像を自動でフォルダに保存
・pixivアカウント不要、API不使用
・ローカルサーバーでの使用を想定
・対応はjpgとpngのみ
・理解しやすさ重視のコード

デモとソース

デモ
http://html-css-javascript.com/demo/pixiv/

ソースのダウンロード
http://html-css-javascript.com/demo/pixiv/pixiv_php.zip

※ダウンロードしたソースが動作しない場合は、
PHPの開始タグの下に「ini_set('display_errors', 0);」を追記してください。これはエラーを非表示にするためのコードです。
環境によってはjpg画像を取得できなかった時に出力されるエラーにより、png画像の表示ができず画像がないと見なされ処理が止まるためです。

ファイル構成

・index.html
・pixiv.php(今回のメイン)
・pixiv.js
・d(保存用のフォルダ)


いっぱいあるように見えますが、PHPファイル39行、HTMLファイル19行、JavaScriptファイル24行と保存用の空のフォルダです。

PHPファイルの概要

・pixivからhtmlを取得
・html内のサムネイル画像URLを抽出
・上記URLからオリジナルサイズの画像URLに変換
・画像を取得して表示、保存

PHPの終了タグ「?>」について

PHPの終了タグ「?>」はHTMLとPHPが混在する場合のみ必要なもので、「PHPコードのみのファイルの場合は、書かない方が無難」です。
書いたことにより問題になることはめったにないですが、なくて問題になることはありません。

「'」と「"」

「'」のほうが挙動が素直なので、何も考えずに「'」を使っておけばおかしなことになりにくいです。
ただし、改行コード(\n)が「"」の中でしか使えないということだけはうっすら覚えておいてください。

2.3行目

$id = $_GET['id’];
$i = $_GET['i'];

渡されたURLからパラメータを取得します。
idはイラストページごとに割り振られているているもの、iは1ページ内に複数枚の画像がまとまっていることがあるので、何枚目の画像なのか区別する際に使用します。

5行目

$url = 'http://www.pixiv.net/member_illust.php?mode=medium&illust_id='.$id;

ベースになるURLにidをくっつけます。
出来上がるのはパソコンからpixivのイラストページを見たときのURLと同じです。

6行目

$html = file_get_contents($url);

5行目でつくったURLのHTMLを取得して、$htmlという変数に入れておきます。

7行目

$pos = strpos($html,$id.'_p');

strpos()を使うと特定の文字がどこにあるのかを取得することができ、
「strpos('この中から','これを探す'')」という形になっています。

例えば$idが12345678だったとしたら、先ほど取得したhtmlから「12345678_p」の場所を探して教えてくれます。
strpos()は見つかった時点で処理が終わる為、複数含まれている場合でも最初の一つの場所しかわかりません。

8行目

$html = substr($html, $pos-65,91);

substr()を使うと文字を抜き出すことができ、
「substr('この中の','この場所から'','何文字')」という形になっています。

strpos()でわかった場所をもとに抜き出す場所をsubstr()に指定しています。
今回は「12345678_p」の65文字手前から、91文字分抜き出しています。
そうするとサムネイル画像のURLを取得できます。

例:http://x0.xxxxx.net/x/000x000/xxx-xxxxxx/img/0000/00/00/00/00/00/12345678_p0_xxxxxx0000.jpg

strpos()とsubstr()の組み合わせは形の決まったものにしか対応できませんが、わかりやすいので最初に使い方を覚えておくと便利です。
単純なことしかできない分動作が高速なので、大量のデータを扱う前に明らかに不要な部分を取り除く際にも使われます。

ちなみに日本語(マルチバイト)の文章からこの文字の位置を調べる、〇文字抜き出すというような場合は、strpos()やsubstr()のかわりにmb_substr()、mb_strpos()を使います。

9行目

$html = str_replace('="', '', $html);

str_replace()を使うと文字列を置き換えることができ、
「str_replace('これがあったら', 'これに置き換える', この中から)」という形になっています。
「これに置き換える」の部分に何もいれず削除として使うことが多いです。

一般とR18ではサムネイル画像のURLの文字数が異なってしまうため、先頭に「="」という文字がくっついてしまう場合への対応です。

11.12行目

$a = substr($html, 0,20);
$b = substr($html, -47,21);

このようなURLだった場合、
http://x0.xxxxx.net/x/000x000/xxx-xxxxxx/img/0000/00/00/00/00/00/12345678_p0_xxxxxx0000.jpg

$aは「http://x0.xxxxx.net/
$bは「/0000/00/00/00/00/00/」
になります。

マイナス47文字目ってどこだろう?と思うかもしれませんが、開始する場所にマイナスを指定すると後ろから数えます。
わざわざ後ろからなのは、サムネイル画像のURLの文字数にぶれがある為です。

【補足】
〇文字目という指定の仕方をしているので、最近のイラストIDである8桁以外のIDだと不都合がありそうですが、桁が少ない分には特に問題ありません。

桁が少ないと後ろにゴミ(不要な文字)がついてきてしまいますが、ゴミも含めて後ろから数えると結局は同じ場所にたどり着くためです。

13行目

$c = $a.'img-original/img'.$b.$id;

先ほど取得した$aと$bを元にオリジナルサイズ画像のURLのベースを作ります。

1 2 3