FantiaResolverを更新・テストを追加

APIを見つけたのでAPIを使用するように
タグを追加
テストを追加
This commit is contained in:
eai04191 committed 2019-09-12 06:56:28 +09:00
1 parent 92847fefe0
commit a9a0f3b99a
3 files changed
+51 -26

No files matched your search

+14 -26
View File
@@ -3,7 +3,6 @@
namespace App\MetadataResolver;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Log;
class FantiaResolver implements Resolver
{
@@ -11,41 +10,30 @@ class FantiaResolver implements Resolver
* @var Client
*/
private $client;
/**
* @var OGPResolver
*/
private $ogpResolver;
public function __construct(Client $client, OGPResolver $ogpResolver)
public function __construct(Client $client)
{
$this->client = $client;
$this->ogpResolver = $ogpResolver;
}
public function resolve(string $url): Metadata
{
preg_match("~\d+~", $url, $match);
$postId = $match[0];
preg_match("~posts/(\d+)~", $url, $match);
$postId = $match[1];
$res = $this->client->get($url);
$metadata = $this->ogpResolver->parse($res->getBody());
$res = $this->client->get("https://fantia.jp/api/v1/posts/{$postId}");
$data = json_decode(str_replace('\r\n', '\n', (string) $res->getBody()), true);
$post = $data['post'];
$dom = new \DOMDocument();
@$dom->loadHTML(mb_convert_encoding($res->getBody(), 'HTML-ENTITIES', 'UTF-8'));
$xpath = new \DOMXPath($dom);
$tags = array_map(function ($tag) {
return $tag['name'];
}, $post['tags']);
$node = $xpath->query("//meta[@property='twitter:image']")->item(0);
$ogpUrl = $node->getAttribute('content');
// 投稿に画像がない場合(ogp.jpgでない場合)のみ大きい画像に変換する
if ($ogpUrl != 'http://fantia.jp/images/ogp.jpg') {
preg_match("~https://fantia\.s3\.amazonaws\.com/uploads/post/file/{$postId}/ogp_(.*?)\.(jpg|png)~", $ogpUrl, $match);
$uuid = $match[1];
$extension = $match[2];
// 大きい画像に変換
$metadata->image = "https://c.fantia.jp/uploads/post/file/{$postId}/main_{$uuid}.{$extension}";
}
$metadata = new Metadata();
$metadata->title = $post['title'] ?? '';
$metadata->description = 'サークル: ' . $post['fanclub']['fanclub_name_with_creator_name'] . PHP_EOL . $post['comment'];
$metadata->image = str_replace('micro', 'main', $post['thumb_micro']) ?? '';
$metadata->tags = array_merge($tags, [$post['fanclub']['creator_name']]);
return $metadata;
}
@@ -0,0 +1,36 @@
<?php
namespace Tests\Unit\MetadataResolver;
use App\MetadataResolver\FantiaResolver;
use Tests\TestCase;
class FantiaResolverTest extends TestCase
{
use CreateMockedResolver;
public function setUp()
{
parent::setUp();
if (!$this->shouldUseMock()) {
sleep(1);
}
}
public function test()
{
$responseText = file_get_contents(__DIR__ . '/../../fixture/Fantia/test.json');
$this->createResolver(FantiaResolver::class, $responseText);
$metadata = $this->resolver->resolve('https://fantia.jp/posts/206561');
$this->assertSame('召喚士アルドラ', $metadata->title);
$this->assertSame('サークル: サークルぬるま湯 (ナナナナ)' . PHP_EOL . 'コミッション' . PHP_EOL . 'クイーンズブレイドリベリオンの召喚士アルドラです。', $metadata->description);
$this->assertSame('https://c.fantia.jp/uploads/post/file/206561/main_dbcc59e5-4090-4650-b969-8855a721c6a5.jpg', $metadata->image);
$this->assertSame(['ふたなり', '超乳', '超根', 'クイーンズブレイド', 'ナナナナ'], $metadata->tags);
if ($this->shouldUseMock()) {
$this->assertSame('https://fantia.jp/api/v1/posts/206561', (string) $this->handler->getLastRequest()->getUri());
}
}
}
+1
View File
@@ -0,0 +1 @@
{"post":{"id":206561,"title":"召喚士アルドラ","comment":"コミッション\r\nクイーンズブレイドリベリオンの召喚士アルドラです。","tags":[{"name":"ふたなり","uri":"/posts?tag=%E3%81%B5%E3%81%9F%E3%81%AA%E3%82%8A"},{"name":"超乳","uri":"/posts?tag=%E8%B6%85%E4%B9%B3"},{"name":"超根","uri":"/posts?tag=%E8%B6%85%E6%A0%B9"},{"name":"クイーンズブレイド","uri":"/posts?tag=%E3%82%AF%E3%82%A4%E3%83%BC%E3%83%B3%E3%82%BA%E3%83%96%E3%83%AC%E3%82%A4%E3%83%89"}],"rating":"adult","thumb":null,"thumb_micro":"https://c.fantia.jp/uploads/post/file/206561/micro_dbcc59e5-4090-4650-b969-8855a721c6a5.jpg","show_adult_thumb":true,"posted_at":"Sun, 08 Sep 2019 21:13:44 +0900","likes_count":4,"liked":null,"is_contributor":false,"uri":{"show":"/posts/206561","edit":null},"is_pulish_open":true,"is_blog":false,"fanclub":{"id":2396,"user":{"id":47923,"toranoana_identify_token":"tus_1vhtg9h2yug0q","name":"ナナナナ","image":{"small":"/images/fallback/user/default_3.png","medium":"/images/fallback/user/default_3.png","large":"/images/fallback/user/default_3.png"},"profile_text":"大きいチンコとおっぱい、大きすぎるチンコとおっぱい、\r\n一般からすれば奇形と言われかねない、特大のエロを描いています。\r\nそれでもOKという人は是非支援のほどを!\r\n※御用の方は画面上のメニューにあるメッセージからできます。\r\n※リクエストは現在描いてる物以降は、「SM、スカトロ」等、ナナナナがちょっとそれは・・・、と思ったものはお断りさせていただく場合があります。\r\nご了承ください。","has_fanclub":true},"category":{"id":1,"name":"イラスト","slug":"illust","uri":{"fanclub":"/fanclubs?category=illust","products":"/products?category=illust","posts":"/posts?category=illust"}},"fanclub_name_with_creator_name":"サークルぬるま湯 (ナナナナ)","fanclub_name_or_creator_name":"サークルぬるま湯","title":"ふたなりとでっかいおっぱい好きです\r\n","cover":{"thumb":"https://c.fantia.jp/uploads/fanclub/cover_image/2396/thumb_32d4ee9a-7d42-4058-b2ca-1797c0e23a96.jpg","medium":"https://c.fantia.jp/uploads/fanclub/cover_image/2396/medium_32d4ee9a-7d42-4058-b2ca-1797c0e23a96.jpg","main":"https://c.fantia.jp/uploads/fanclub/cover_image/2396/main_32d4ee9a-7d42-4058-b2ca-1797c0e23a96.jpg","ogp":"https://c.fantia.jp/uploads/fanclub/cover_image/2396/ogp_32d4ee9a-7d42-4058-b2ca-1797c0e23a96.jpg","original":"https://c.fantia.jp/uploads/fanclub/cover_image/2396/32d4ee9a-7d42-4058-b2ca-1797c0e23a96.jpg"},"icon":{"thumb":"https://c.fantia.jp/uploads/fanclub/icon_image/2396/thumb_7d2caeac-7392-4b68-87ba-ffd68573465f.jpg","main":"https://c.fantia.jp/uploads/fanclub/icon_image/2396/main_7d2caeac-7392-4b68-87ba-ffd68573465f.jpg","original":"https://c.fantia.jp/uploads/fanclub/icon_image/2396/7d2caeac-7392-4b68-87ba-ffd68573465f.jpg"},"is_join":false,"fan_count":1236,"posts_count":271,"products_count":10,"uri":{"show":"/fanclubs/2396","posts":"/fanclubs/2396/posts","plans":"/fanclubs/2396/plans","products":"/fanclubs/2396/products","users":"/fanclubs/2396/users"},"user_support_point":0,"creator_name":"ナナナナ","name":"サークルぬるま湯","fanclub_name":"サークルぬるま湯","comment":"大きいチンコとおっぱい、大きすぎるチンコとおっぱい、 一般からすれば奇形と言われかねない、特大のエロを描いています。\r\n(普通のエロもたまに書くよ)\r\n それでもOKという人は是非支援のほどを! \r\n何か御用があれば上のメニューのメッセージからお願いします。\r\n ※リクエストは、「SM、スカトロ」等、ナナナナがちょっとそれは・・・、と思ったものはお断りさせていただく場合があります。 ご了承ください。","recent_posts":[],"recent_products":[{"id":29737,"name":"【二人まで】カラーイラストリクエスト権","type":"download","category":{"id":1,"name":"オーダーメイド","uri":"/products?product_category=%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%A1%E3%82%A4%E3%83%89"},"thumb":null,"show_adult_thumb":true,"stock":"many","price":16000,"buyable_lowest_plan":{"id":3873,"price":0,"name":"無料プラン","description":"無料プランです","limit":10000,"thumb":"https://fantia.jp/images/fallback/plan/thumb_default.png"},"likes":{"count":0,"has_like":false},"uri":"/products/29737","reactions":{"get_url":"https://id.fantia.jp/fantia/api/products/29737/reactions?client_id=EUtcltNGEX\u0026identify_token=","post_uri":null,"delete_uri":"/api/v1/products/29737/reactions/:id"}},{"id":29736,"name":"【一人まで】カラーイラストリクエスト権","type":"download","category":{"id":1,"name":"オーダーメイド","uri":"/products?product_category=%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%A1%E3%82%A4%E3%83%89"},"thumb":null,"show_adult_thumb":true,"stockLine truncated