pixivのOGP画像で常にプロキシURLを使用する (#92)

This commit is contained in:
Eai 2019-02-12 22:48:44 +09:00 committed by shibafu
parent 116dd3b798
commit cedee0a20e

View File

@ -8,6 +8,7 @@ class PixivResolver implements Resolver
* サムネイル画像 URL から最大長辺 1200px の画像 URL に変換する * サムネイル画像 URL から最大長辺 1200px の画像 URL に変換する
* *
* @param string $thumbnailUrl サムネイル画像 URL * @param string $thumbnailUrl サムネイル画像 URL
*
* @return string 1200px の画像 URL * @return string 1200px の画像 URL
*/ */
public function thumbnailToMasterUrl(string $thumbnailUrl): string public function thumbnailToMasterUrl(string $thumbnailUrl): string
@ -23,6 +24,7 @@ class PixivResolver implements Resolver
* HUGE THANKS TO PIXIV.CAT! * HUGE THANKS TO PIXIV.CAT!
* *
* @param string $pixivUrl i.pximg URL * @param string $pixivUrl i.pximg URL
*
* @return string i.pixiv.cat URL * @return string i.pixiv.cat URL
*/ */
public function proxize(string $pixivUrl): string public function proxize(string $pixivUrl): string
@ -41,52 +43,24 @@ class PixivResolver implements Resolver
// 未ログインでは漫画ページを開けないため、URL を作品ページに変換する // 未ログインでは漫画ページを開けないため、URL を作品ページに変換する
$url = preg_replace('~mode=manga(_big)?~', 'mode=medium', $url); $url = preg_replace('~mode=manga(_big)?~', 'mode=medium', $url);
}
$client = new \GuzzleHttp\Client(); $client = new \GuzzleHttp\Client();
$res = $client->get($url); $res = $client->get($url);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver(); $ogpResolver = new OGPResolver();
$metadata = $ogpResolver->parse($res->getBody()); $metadata = $ogpResolver->parse($res->getBody());
preg_match("~https://i\.pximg\.net/c/128x128/img-master/img/\d{4}/\d{2}/\d{2}/\d{2}/\d{2}/\d{2}/{$illustId}_p0_square1200\.jpg~", $res->getBody(), $match); preg_match("~https://i\.pximg\.net/c/128x128/img-master/img/\d{4}/\d{2}/\d{2}/\d{2}/\d{2}/\d{2}/{$illustId}(_p0)?_square1200\.jpg~", $res->getBody(), $match);
$illustThumbnailUrl = $match[0]; $illustThumbnailUrl = $match[0];
$illustUrl = $this->thumbnailToMasterUrl($illustThumbnailUrl); $illustUrl = $this->thumbnailToMasterUrl($illustThumbnailUrl);
// 指定ページに変換 $metadata->image = $this->proxize($illustUrl);
$illustUrl = str_replace('p0_master', "p{$page}_master", $illustUrl);
$metadata->image = $this->proxize($illustUrl); return $metadata;
return $metadata;
} else {
throw new \RuntimeException("{$res->getStatusCode()}: $url");
}
} else { } else {
$client = new \GuzzleHttp\Client(); throw new \RuntimeException("{$res->getStatusCode()}: $url");
$res = $client->get($url);
if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver();
$metadata = $ogpResolver->parse($res->getBody());
// OGP がデフォルト画像であるようならなんとかして画像を取得する
if (strpos($metadata->image, 'pixiv_logo.gif') || strpos($metadata->image, 'pictures.jpg')) {
// 作品ページの場合のみ対応
if ($params['mode'] === 'medium') {
preg_match("~https://i\.pximg\.net/c/128x128/img-master/img/\d{4}/\d{2}/\d{2}/\d{2}/\d{2}/\d{2}/{$illustId}(_p0)?_square1200\.jpg~", $res->getBody(), $match);
$illustThumbnailUrl = $match[0];
$illustUrl = $this->thumbnailToMasterUrl($illustThumbnailUrl);
$metadata->image = $this->proxize($illustUrl);
}
}
return $metadata;
} else {
throw new \RuntimeException("{$res->getStatusCode()}: $url");
}
} }
} }
} }