Guzzle\Clientをモッカブルにする

This commit is contained in:
hina 2019-02-17 02:58:36 +09:00
parent 9f1cd607d7
commit 24dee801ad
No known key found for this signature in database
GPG Key ID: 6136D5E22A0EE24B
17 changed files with 263 additions and 58 deletions

View File

@ -21,7 +21,8 @@ class LinkCollector
/** /**
* Create the event listener. * Create the event listener.
* *
* @return void * @param Formatter $formatter
* @param MetadataResolver $metadataResolver
*/ */
public function __construct(Formatter $formatter, MetadataResolver $metadataResolver) public function __construct(Formatter $formatter, MetadataResolver $metadataResolver)
{ {

View File

@ -3,16 +3,30 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use Carbon\Carbon; use Carbon\Carbon;
use GuzzleHttp\Client;
class CienResolver extends MetadataResolver class CienResolver extends MetadataResolver
{ {
/**
* @var Client
*/
private $client;
/**
* @var OGPResolver
*/
private $ogpResolver;
public function __construct(Client $client, OGPResolver $ogpResolver)
{
$this->client = $client;
$this->ogpResolver = $ogpResolver;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
$client = new \GuzzleHttp\Client(); $res = $this->client->get($url);
$res = $client->get($url);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver(); $metadata = $this->ogpResolver->parse($res->getBody());
$metadata = $ogpResolver->parse($res->getBody());
// 画像URLから有効期限の起点を拾う // 画像URLから有効期限の起点を拾う
parse_str(parse_url($metadata->image, PHP_URL_QUERY), $params); parse_str(parse_url($metadata->image, PHP_URL_QUERY), $params);

View File

@ -2,16 +2,31 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use GuzzleHttp\Client;
class DLsiteResolver implements Resolver class DLsiteResolver implements Resolver
{ {
/**
* @var Client
*/
private $client;
/**
* @var OGPResolver
*/
private $ogpResolver;
public function __construct(Client $client, OGPResolver $ogpResolver)
{
$this->client = $client;
$this->ogpResolver = $ogpResolver;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
$client = new \GuzzleHttp\Client(); $res = $this->client->get($url);
$res = $client->get($url);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver(); $metadata = $this->ogpResolver->parse($res->getBody());
$metadata = $ogpResolver->parse($res->getBody()); $metadata->image = str_replace('img_sam.jpg', 'img_main.jpg', $metadata->image);
$metadata->image = str_replace('img_sam.jpg', 'img_main.jpg', $metadata->image);
return $metadata; return $metadata;
} else { } else {

View File

@ -2,15 +2,30 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use GuzzleHttp\Client;
class DeviantArtResolver implements Resolver class DeviantArtResolver implements Resolver
{ {
/**
* @var Client
*/
private $client;
/**
* @var OGPResolver
*/
private $ogpResolver;
public function __construct(Client $client, OGPResolver $ogpResolver)
{
$this->client = $client;
$this->ogpResolver = $ogpResolver;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
$client = new \GuzzleHttp\Client(); $res = $this->client->get($url);
$res = $client->get($url);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver(); $metadata = $this->ogpResolver->parse($res->getBody());
$metadata = $ogpResolver->parse($res->getBody());
$dom = new \DOMDocument(); $dom = new \DOMDocument();
@$dom->loadHTML(mb_convert_encoding($res->getBody(), 'HTML-ENTITIES', 'UTF-8')); @$dom->loadHTML(mb_convert_encoding($res->getBody(), 'HTML-ENTITIES', 'UTF-8'));

View File

@ -2,20 +2,33 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
class FantiaResolver implements Resolver class FantiaResolver implements Resolver
{ {
/**
* @var Client
*/
private $client;
/**
* @var OGPResolver
*/
private $ogpResolver;
public function __construct(Client $client, OGPResolver $ogpResolver)
{
$this->client = $client;
$this->ogpResolver = $ogpResolver;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
preg_match("~\d+~", $url, $match); preg_match("~\d+~", $url, $match);
$postId = $match[0]; $postId = $match[0];
$client = new \GuzzleHttp\Client(); $res = $this->client->get($url);
$res = $client->get($url);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver(); $metadata = $this->ogpResolver->parse($res->getBody());
$metadata = $ogpResolver->parse($res->getBody());
$dom = new \DOMDocument(); $dom = new \DOMDocument();
@$dom->loadHTML(mb_convert_encoding($res->getBody(), 'HTML-ENTITIES', 'UTF-8')); @$dom->loadHTML(mb_convert_encoding($res->getBody(), 'HTML-ENTITIES', 'UTF-8'));

View File

@ -2,16 +2,31 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use GuzzleHttp\Client;
class FanzaResolver implements Resolver class FanzaResolver implements Resolver
{ {
/**
* @var Client
*/
private $client;
/**
* @var OGPResolver
*/
private $ogpResolver;
public function __construct(Client $client, OGPResolver $ogpResolver)
{
$this->client = $client;
$this->ogpResolver = $ogpResolver;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
$client = new \GuzzleHttp\Client(); $res = $this->client->get($url);
$res = $client->get($url);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver(); $metadata = $this->ogpResolver->parse($res->getBody());
$metadata = $ogpResolver->parse($res->getBody()); $metadata->image = preg_replace("~(pr|ps)\.jpg$~", 'pl.jpg', $metadata->image);
$metadata->image = preg_replace("~(pr|ps)\.jpg$~", 'pl.jpg', $metadata->image);
return $metadata; return $metadata;
} else { } else {

View File

@ -2,12 +2,24 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use GuzzleHttp\Client;
class IwaraResolver implements Resolver class IwaraResolver implements Resolver
{ {
/**
* @var Client
*/
private $client;
public function __construct(Client $client)
{
$this->client = $client;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
$client = new \GuzzleHttp\Client(); $res = $this->client->get($url);
$res = $client->get($url);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$dom = new \DOMDocument(); $dom = new \DOMDocument();
@$dom->loadHTML(mb_convert_encoding($res->getBody(), 'HTML-ENTITIES', 'UTF-8')); @$dom->loadHTML(mb_convert_encoding($res->getBody(), 'HTML-ENTITIES', 'UTF-8'));

View File

@ -2,8 +2,20 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use GuzzleHttp\Client;
class KomifloResolver implements Resolver class KomifloResolver implements Resolver
{ {
/**
* @var Client
*/
private $client;
public function __construct(Client $client)
{
$this->client = $client;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
if (preg_match('~komiflo\.com(?:/#!)?/comics/(\\d+)~', $url, $matches) !== 1) { if (preg_match('~komiflo\.com(?:/#!)?/comics/(\\d+)~', $url, $matches) !== 1) {
@ -11,8 +23,7 @@ class KomifloResolver implements Resolver
} }
$id = $matches[1]; $id = $matches[1];
$client = new \GuzzleHttp\Client(); $res = $this->client->get('https://api.komiflo.com/content/id/' . $id);
$res = $client->get('https://api.komiflo.com/content/id/' . $id);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$json = json_decode($res->getBody()->getContents(), true); $json = json_decode($res->getBody()->getContents(), true);
$metadata = new Metadata(); $metadata = new Metadata();

View File

@ -2,19 +2,33 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar; use GuzzleHttp\Cookie\CookieJar;
class MelonbooksResolver implements Resolver class MelonbooksResolver implements Resolver
{ {
/**
* @var Client
*/
private $client;
/**
* @var OGPResolver
*/
private $ogpResolver;
public function __construct(Client $client, OGPResolver $ogpResolver)
{
$this->client = $client;
$this->ogpResolver = $ogpResolver;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
$cookieJar = CookieJar::fromArray(['AUTH_ADULT' => '1'], 'www.melonbooks.co.jp'); $cookieJar = CookieJar::fromArray(['AUTH_ADULT' => '1'], 'www.melonbooks.co.jp');
$client = new \GuzzleHttp\Client(); $res = $this->client->get($url, ['cookies' => $cookieJar]);
$res = $client->get($url, ['cookies' => $cookieJar]);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver(); $metadata = $this->ogpResolver->parse($res->getBody());
$metadata = $ogpResolver->parse($res->getBody());
// censoredフラグの除去 // censoredフラグの除去
if (mb_strpos($metadata->image, '&c=1') !== false) { if (mb_strpos($metadata->image, '&c=1') !== false) {

View File

@ -37,7 +37,8 @@ class MetadataResolver implements Resolver
{ {
foreach ($this->rules as $pattern => $class) { foreach ($this->rules as $pattern => $class) {
if (preg_match($pattern, $url) === 1) { if (preg_match($pattern, $url) === 1) {
$resolver = new $class(); /** @var Resolver $resolver */
$resolver = app($class);
return $resolver->resolve($url); return $resolver->resolve($url);
} }
@ -49,13 +50,14 @@ class MetadataResolver implements Resolver
} }
if (isset($this->defaultResolver)) { if (isset($this->defaultResolver)) {
$resolver = new $this->defaultResolver(); /** @var Resolver $resolver */
$resolver = app($this->defaultResolver);
return $resolver->resolve($url); return $resolver->resolve($url);
} }
throw new \UnexpectedValueException('URL not matched.'); throw new \UnexpectedValueException('URL not matched.');
} }
public function resolveWithAcceptHeader(string $url): ?Metadata public function resolveWithAcceptHeader(string $url): ?Metadata
{ {
try { try {

View File

@ -2,19 +2,33 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar; use GuzzleHttp\Cookie\CookieJar;
class NarouResolver implements Resolver class NarouResolver implements Resolver
{ {
/**
* @var Client
*/
private $client;
/**
* @var OGPResolver
*/
private $ogpResolver;
public function __construct(Client $client, OGPResolver $ogpResolver)
{
$this->client = $client;
$this->ogpResolver = $ogpResolver;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
$cookieJar = CookieJar::fromArray(['over18' => 'yes'], '.syosetu.com'); $cookieJar = CookieJar::fromArray(['over18' => 'yes'], '.syosetu.com');
$client = new \GuzzleHttp\Client(); $res = $this->client->get($url, ['cookies' => $cookieJar]);
$res = $client->get($url, ['cookies' => $cookieJar]);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver(); $metadata = $this->ogpResolver->parse($res->getBody());
$metadata = $ogpResolver->parse($res->getBody());
$metadata->description = ''; $metadata->description = '';
$dom = new \DOMDocument(); $dom = new \DOMDocument();

View File

@ -2,15 +2,30 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use GuzzleHttp\Client;
class NicoSeigaResolver implements Resolver class NicoSeigaResolver implements Resolver
{ {
/**
* @var Client
*/
private $client;
/**
* @var OGPResolver
*/
private $ogpResolver;
public function __construct(Client $client, OGPResolver $ogpResolver)
{
$this->client = $client;
$this->ogpResolver = $ogpResolver;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
$client = new \GuzzleHttp\Client(); $res = $this->client->get($url);
$res = $client->get($url);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver(); $metadata = $this->ogpResolver->parse($res->getBody());
$metadata = $ogpResolver->parse($res->getBody());
// ページURLからサムネイルURLに変換 // ページURLからサムネイルURLに変換
preg_match('~http://(?:(?:sp\\.)?seiga\\.nicovideo\\.jp/seiga(?:/#!)?|nico\\.ms)/im(\\d+)~', $url, $matches); preg_match('~http://(?:(?:sp\\.)?seiga\\.nicovideo\\.jp/seiga(?:/#!)?|nico\\.ms)/im(\\d+)~', $url, $matches);

View File

@ -2,8 +2,18 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use GuzzleHttp\Client;
class NijieResolver implements Resolver class NijieResolver implements Resolver
{ {
/** @var Client */
protected $client;
public function __construct(Client $client)
{
$this->client = $client;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
if (mb_strpos($url, '//sp.nijie.info') !== false) { if (mb_strpos($url, '//sp.nijie.info') !== false) {
@ -13,7 +23,7 @@ class NijieResolver implements Resolver
$url = preg_replace('~view_popup\.php~', 'view.php', $url); $url = preg_replace('~view_popup\.php~', 'view.php', $url);
} }
$client = new \GuzzleHttp\Client(); $client = $this->client;
$res = $client->get($url); $res = $client->get($url);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver(); $ogpResolver = new OGPResolver();

View File

@ -2,12 +2,23 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use GuzzleHttp\Client;
class OGPResolver implements Resolver, Parser class OGPResolver implements Resolver, Parser
{ {
/**
* @var Client
*/
private $client;
public function __construct(Client $client)
{
$this->client = $client;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
$client = new \GuzzleHttp\Client(); $res = $this->client->get($url);
$res = $client->get($url);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
return $this->parse($res->getBody()); return $this->parse($res->getBody());
} else { } else {

View File

@ -3,19 +3,33 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use Carbon\Carbon; use Carbon\Carbon;
use GuzzleHttp\Client;
class PatreonResolver implements Resolver class PatreonResolver implements Resolver
{ {
/**
* @var Client
*/
private $client;
/**
* @var OGPResolver
*/
private $ogpResolver;
public function __construct(Client $client, OGPResolver $ogpResolver)
{
$this->client = $client;
$this->ogpResolver = $ogpResolver;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
$client = new \GuzzleHttp\Client(); $res = $this->client->get($url);
$res = $client->get($url);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver(); $metadata = $this->ogpResolver->parse($res->getBody());
$metadata = $ogpResolver->parse($res->getBody());
parse_str(parse_url($metadata->image, PHP_URL_QUERY), $temp); parse_str(parse_url($metadata->image, PHP_URL_QUERY), $temp);
$expires_at_unixtime = $temp["token-time"]; $expires_at_unixtime = $temp['token-time'];
$expires_at = Carbon::createFromTimestamp($expires_at_unixtime); $expires_at = Carbon::createFromTimestamp($expires_at_unixtime);
$metadata->expires_at = $expires_at; $metadata->expires_at = $expires_at;

View File

@ -2,8 +2,25 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use GuzzleHttp\Client;
class PixivResolver implements Resolver class PixivResolver implements Resolver
{ {
/**
* @var Client
*/
private $client;
/**
* @var OGPResolver
*/
private $ogpResolver;
public function __construct(Client $client, OGPResolver $ogpResolver)
{
$this->client = $client;
$this->ogpResolver = $ogpResolver;
}
/** /**
* サムネイル画像 URL から最大長辺 1200px の画像 URL に変換する * サムネイル画像 URL から最大長辺 1200px の画像 URL に変換する
* *
@ -45,11 +62,9 @@ class PixivResolver implements Resolver
$url = preg_replace('~mode=manga(_big)?~', 'mode=medium', $url); $url = preg_replace('~mode=manga(_big)?~', 'mode=medium', $url);
} }
$client = new \GuzzleHttp\Client(); $res = $this->client->get($url);
$res = $client->get($url);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver(); $metadata = $this->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];

View File

@ -2,20 +2,34 @@
namespace App\MetadataResolver; namespace App\MetadataResolver;
use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar; use GuzzleHttp\Cookie\CookieJar;
class ToranoanaResolver implements Resolver class ToranoanaResolver implements Resolver
{ {
/**
* @var Client
*/
private $client;
/**
* @var OGPResolver
*/
private $ogpResolver;
public function __construct(Client $client, OGPResolver $ogpResolver)
{
$this->client = $client;
$this->ogpResolver = $ogpResolver;
}
public function resolve(string $url): Metadata public function resolve(string $url): Metadata
{ {
$cookieJar = CookieJar::fromArray(['adflg' => '0'], 'ec.toranoana.jp'); $cookieJar = CookieJar::fromArray(['adflg' => '0'], 'ec.toranoana.jp');
$client = new \GuzzleHttp\Client(); $res = $this->client->get($url, ['cookies' => $cookieJar]);
$res = $client->get($url, ['cookies' => $cookieJar]);
if ($res->getStatusCode() === 200) { if ($res->getStatusCode() === 200) {
$ogpResolver = new OGPResolver();
return $ogpResolver->parse($res->getBody()); return $this->ogpResolver->parse($res->getBody());
} else { } else {
throw new \RuntimeException("{$res->getStatusCode()}: $url"); throw new \RuntimeException("{$res->getStatusCode()}: $url");
} }