From 5642e733917b6e062f15f6160e0fef54a012a76f Mon Sep 17 00:00:00 2001 From: shibafu Date: Tue, 10 Sep 2019 23:10:19 +0900 Subject: [PATCH 01/28] =?UTF-8?q?401=20Unauthorized=E3=81=AF=E3=82=88?= =?UTF-8?q?=E3=81=8F=E3=81=AA=E3=81=84=E3=81=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/assets/js/app.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js index 629d2dc..3daf978 100644 --- a/resources/assets/js/app.js +++ b/resources/assets/js/app.js @@ -85,6 +85,9 @@ $(() => { if (xhr.status === 409) { callback(JSON.parse(xhr.responseText)); return; + } else if (xhr.status === 401) { + alert('いいねするためにはログインしてください。'); + return; } console.error(xhr); @@ -98,4 +101,4 @@ $(() => { $this.siblings(".card-link").removeClass("card-spoiler"); $this.remove(); }); -}); \ No newline at end of file +}); From 78bb7dae28e7e556c24375ae9aff606ce5321bf9 Mon Sep 17 00:00:00 2001 From: MitarashiDango Date: Mon, 16 Sep 2019 13:24:22 +0900 Subject: [PATCH 02/28] =?UTF-8?q?=E3=82=BF=E3=82=B0=E4=B8=80=E8=A6=A7?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/TagController.php | 29 ++++++++++++++++++++++++++ resources/assets/sass/app.scss | 3 +++ resources/assets/sass/tag/_index.scss | 22 +++++++++++++++++++ resources/views/layouts/base.blade.php | 3 +++ resources/views/tag/index.blade.php | 20 ++++++++++++++++++ routes/web.php | 2 ++ 6 files changed, 79 insertions(+) create mode 100644 app/Http/Controllers/TagController.php create mode 100644 resources/assets/sass/tag/_index.scss create mode 100644 resources/views/tag/index.blade.php diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php new file mode 100644 index 0000000..3e489d5 --- /dev/null +++ b/app/Http/Controllers/TagController.php @@ -0,0 +1,29 @@ +join('ejaculation_tag', 'tags.id', '=', 'ejaculation_tag.tag_id') + ->join('ejaculations', 'ejaculations.id', '=', 'ejaculation_tag.ejaculation_id') + ->where('ejaculations.is_private', false) + ->groupBy('tags.name') + ->orderByDesc('checkins_count') + ->orderBy('tags.name') + ->paginate(100); + + return view('tag.index', compact('tags')); + } +} diff --git a/resources/assets/sass/app.scss b/resources/assets/sass/app.scss index 0fe2b4f..6f38126 100644 --- a/resources/assets/sass/app.scss +++ b/resources/assets/sass/app.scss @@ -13,3 +13,6 @@ $primary: #e53fb1; // Components @import "components/ejaculation"; @import "components/link-card"; + +// Tag +@import "tag/index"; diff --git a/resources/assets/sass/tag/_index.scss b/resources/assets/sass/tag/_index.scss new file mode 100644 index 0000000..eed3db6 --- /dev/null +++ b/resources/assets/sass/tag/_index.scss @@ -0,0 +1,22 @@ +.tags { + & > .btn-tag { + width: 100%; + + .tag-name { + display: inline-block; + max-width: 80%; + overflow: hidden; + line-height: 40px; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: middle; + } + + .checkins-count { + display: inline-block; + line-height: 40px; + white-space: nowrap; + vertical-align: middle; + } + } +} diff --git a/resources/views/layouts/base.blade.php b/resources/views/layouts/base.blade.php index 14943e4..f4f4f77 100644 --- a/resources/views/layouts/base.blade.php +++ b/resources/views/layouts/base.blade.php @@ -79,6 +79,9 @@ + {{----}} diff --git a/resources/views/tag/index.blade.php b/resources/views/tag/index.blade.php new file mode 100644 index 0000000..fb088b4 --- /dev/null +++ b/resources/views/tag/index.blade.php @@ -0,0 +1,20 @@ +@extends('layouts.base') + +@section('title', 'タグ一覧') + +@section('content') +
+

タグ一覧

+

公開チェックインに付けられているタグを、チェックイン数の多い順で表示しています。

+
+
+
+ @foreach($tags as $tag) + + @endforeach +
+ {{ $tags->links(null, ['className' => 'mt-4 justify-content-center']) }} +
+@endsection diff --git a/routes/web.php b/routes/web.php index 6eba7e1..6c0fbdb 100644 --- a/routes/web.php +++ b/routes/web.php @@ -46,6 +46,8 @@ Route::redirect('/search', '/search/checkin', 301); Route::get('/search/checkin', 'SearchController@index')->name('search'); Route::get('/search/related-tag', 'SearchController@relatedTag')->name('search.related-tag'); +Route::get('/tag', 'TagController@index')->name('tag'); + Route::middleware('can:admin') ->namespace('Admin') ->prefix('admin') From dd07940aeaabadfb4bb11d5ce08228f6f89d42e3 Mon Sep 17 00:00:00 2001 From: MitarashiDango Date: Mon, 16 Sep 2019 14:02:19 +0900 Subject: [PATCH 03/28] =?UTF-8?q?=E3=82=B9=E3=83=9E=E3=83=9B=E5=90=91?= =?UTF-8?q?=E3=81=91=E3=83=AC=E3=82=A4=E3=82=A2=E3=82=A6=E3=83=88=E3=81=B8?= =?UTF-8?q?=E3=82=BF=E3=82=B0=E4=B8=80=E8=A6=A7=E3=83=9C=E3=82=BF=E3=83=B3?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/views/layouts/base.blade.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/resources/views/layouts/base.blade.php b/resources/views/layouts/base.blade.php index f4f4f77..9d03065 100644 --- a/resources/views/layouts/base.blade.php +++ b/resources/views/layouts/base.blade.php @@ -140,6 +140,13 @@ オカズ +
+ +
+
+
{{--
ランキング From d5ee59825f95fb3b0d19baec9889e5136fcc2a9f Mon Sep 17 00:00:00 2001 From: MitarashiDango Date: Thu, 19 Sep 2019 00:09:41 +0900 Subject: [PATCH 04/28] =?UTF-8?q?=E5=B9=B4=E9=BD=A2=E7=A2=BA=E8=AA=8D?= =?UTF-8?q?=E3=83=80=E3=82=A4=E3=82=A2=E3=83=AD=E3=82=B0=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E6=99=82=E3=81=AE=E3=83=96=E3=83=A9=E3=83=BC=E3=82=92=E3=82=BF?= =?UTF-8?q?=E3=82=B0=E4=B8=80=E8=A6=A7=E3=81=B8=E9=81=A9=E7=94=A8=E3=81=95?= =?UTF-8?q?=E3=81=9B=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/views/tag/index.blade.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/views/tag/index.blade.php b/resources/views/tag/index.blade.php index fb088b4..e097f4c 100644 --- a/resources/views/tag/index.blade.php +++ b/resources/views/tag/index.blade.php @@ -6,15 +6,15 @@

タグ一覧

公開チェックインに付けられているタグを、チェックイン数の多い順で表示しています。

-
-
-
- @foreach($tags as $tag) - - @endforeach +
+
+ @foreach($tags as $tag) + + @endforeach +
+ {{ $tags->links(null, ['className' => 'mt-4 justify-content-center']) }}
- {{ $tags->links(null, ['className' => 'mt-4 justify-content-center']) }}
@endsection From 8772facadfdb991883e1882549c8d7a68b0f5ab1 Mon Sep 17 00:00:00 2001 From: shibafu Date: Sun, 22 Sep 2019 01:44:01 +0900 Subject: [PATCH 05/28] =?UTF-8?q?JSON=E3=83=87=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E5=BE=8C=E3=81=ABHTML=E3=82=A8=E3=83=B3=E3=83=86=E3=82=A3?= =?UTF-8?q?=E3=83=86=E3=82=A3=E3=81=AE=E3=83=87=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=82=92=E8=A1=8C=E3=81=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JSONデコード前にHTMLエンティティのデコードを行ってしまうと " なども解除されてしまい、JSONとして不正な入力になる。 html_decode_entityのオプションで除外しても良いが、改行以外は一応JSONとして正当はなずなので、安全に倒してJSONとしてのデコードを済ませてから処理する。 --- app/MetadataResolver/NijieResolver.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/MetadataResolver/NijieResolver.php b/app/MetadataResolver/NijieResolver.php index 8ce9315..4bbe5ca 100644 --- a/app/MetadataResolver/NijieResolver.php +++ b/app/MetadataResolver/NijieResolver.php @@ -36,12 +36,16 @@ class NijieResolver implements Resolver $metadata = $this->ogpResolver->parse($html); $crawler = new Crawler($html); - // DomCrawler内でjson内の日本語がHTMLエンティティに変換されるのでhtml_entity_decode - $json = html_entity_decode($crawler->filter('script[type="application/ld+json"]')->first()->text()); + $json = $crawler->filter('script[type="application/ld+json"]')->first()->text(); // 改行がそのまま入っていることがあるのでデコード前にエスケープが必要 $data = json_decode(preg_replace('/\r?\n/', '\n', $json), true); + // DomCrawler内でjson内の日本語がHTMLエンティティに変換されるので、全要素に対してhtml_entity_decode + array_walk_recursive($data, function (&$v) { + $v = html_entity_decode($v); + }); + $metadata->title = $data['name']; $metadata->description = '投稿者: ' . $data['author']['name'] . PHP_EOL . $data['description']; if ( From a434a45e4a938f2513bce397a33672eeaf3f14c2 Mon Sep 17 00:00:00 2001 From: MitarashiDango Date: Wed, 25 Sep 2019 23:39:36 +0900 Subject: [PATCH 06/28] =?UTF-8?q?=E3=82=BF=E3=82=B0=E4=B8=80=E8=A6=A7?= =?UTF-8?q?=E3=81=AE=E4=BB=B6=E6=95=B0=E3=82=AB=E3=82=A6=E3=83=B3=E3=83=88?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E3=82=92=E6=A4=9C=E7=B4=A2=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E3=81=A8=E6=8F=83=E3=81=88=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/TagController.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php index 3e489d5..0fb8859 100644 --- a/app/Http/Controllers/TagController.php +++ b/app/Http/Controllers/TagController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Tag; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; class TagController extends Controller @@ -18,7 +19,14 @@ SQL )) ->join('ejaculation_tag', 'tags.id', '=', 'ejaculation_tag.tag_id') ->join('ejaculations', 'ejaculations.id', '=', 'ejaculation_tag.ejaculation_id') + ->join('users', 'users.id', '=', 'ejaculations.user_id') ->where('ejaculations.is_private', false) + ->where(function ($query) { + $query->where('users.is_protected', false); + if (Auth::check()) { + $query->orWhere('users.id', Auth::id()); + } + }) ->groupBy('tags.name') ->orderByDesc('checkins_count') ->orderBy('tags.name') From 900e4c94a7352f86a2902d51adf11a41b4824af2 Mon Sep 17 00:00:00 2001 From: MitarashiDango Date: Wed, 25 Sep 2019 23:46:06 +0900 Subject: [PATCH 07/28] =?UTF-8?q?=E6=80=92=E3=82=89=E3=82=8C=E3=81=9F?= =?UTF-8?q?=E3=81=AE=E3=81=A7=E3=81=AA=E3=81=8A=E3=81=97=E3=81=9F...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/TagController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php index 0fb8859..811153f 100644 --- a/app/Http/Controllers/TagController.php +++ b/app/Http/Controllers/TagController.php @@ -16,7 +16,7 @@ class TagController extends Controller tags.name, count(*) AS "checkins_count" SQL - )) + )) ->join('ejaculation_tag', 'tags.id', '=', 'ejaculation_tag.tag_id') ->join('ejaculations', 'ejaculations.id', '=', 'ejaculation_tag.ejaculation_id') ->join('users', 'users.id', '=', 'ejaculations.user_id') From 579708389a8dd7c2ab140b2a62ee63d509b015f9 Mon Sep 17 00:00:00 2001 From: Yuu Kobayashi Date: Sun, 29 Sep 2019 11:33:05 +0900 Subject: [PATCH 08/28] =?UTF-8?q?Kb10uyShortStoryServerResolver=20?= =?UTF-8?q?=E3=81=A8=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Kb10uyShortStoryServerResolver.php | 42 ++++ app/MetadataResolver/MetadataResolver.php | 1 + .../Kb10uyShortStoryServerResolverTest.php | 35 +++ .../Kb10uyShortStoryServer/tomone.html | 205 ++++++++++++++++++ 4 files changed, 283 insertions(+) create mode 100644 app/MetadataResolver/Kb10uyShortStoryServerResolver.php create mode 100644 tests/Unit/MetadataResolver/Kb10uyShortStoryServerResolverTest.php create mode 100644 tests/fixture/Kb10uyShortStoryServer/tomone.html diff --git a/app/MetadataResolver/Kb10uyShortStoryServerResolver.php b/app/MetadataResolver/Kb10uyShortStoryServerResolver.php new file mode 100644 index 0000000..26a7dd8 --- /dev/null +++ b/app/MetadataResolver/Kb10uyShortStoryServerResolver.php @@ -0,0 +1,42 @@ +client = $client; + } + + public function resolve(string $url): Metadata + { + $res = $this->client->get($url); + if ($res->getStatusCode() !== 200) { + throw new \RuntimeException("{$res->getStatusCode()}: $url"); + + return $this->parse($res->getBody()); + } + + $html = (string) $res->getBody(); + $crawler = new Crawler($html); + $infoElement = $crawler->filter('div.post-info'); + + $metadata = new Metadata(); + $metadata->title = $infoElement->filter('h1')->text(); + $metadata->description = trim($infoElement->filter('p.summary')->text()); + $metadata->tags = array_values(array_diff($infoElement->filter('ul.tags > li.tag > a')->extract('_text'), self::EXCLUDED_TAGS)); + + return $metadata; + } +} diff --git a/app/MetadataResolver/MetadataResolver.php b/app/MetadataResolver/MetadataResolver.php index 9e19fe9..8d25294 100644 --- a/app/MetadataResolver/MetadataResolver.php +++ b/app/MetadataResolver/MetadataResolver.php @@ -32,6 +32,7 @@ class MetadataResolver implements Resolver '~(adult\.)?contents\.fc2\.com\/article_search\.php\?id=\d+~' => FC2ContentsResolver::class, '~store\.steampowered\.com/app/\d+~' => SteamResolver::class, '~www\.xtube\.com/video-watch/.*-\d+$~'=> XtubeResolver::class, + '~ss\.kb10uy\.org/posts/\d+$~' => Kb10uyShortStoryServerResolver::class, ]; public $mimeTypes = [ diff --git a/tests/Unit/MetadataResolver/Kb10uyShortStoryServerResolverTest.php b/tests/Unit/MetadataResolver/Kb10uyShortStoryServerResolverTest.php new file mode 100644 index 0000000..7407b9c --- /dev/null +++ b/tests/Unit/MetadataResolver/Kb10uyShortStoryServerResolverTest.php @@ -0,0 +1,35 @@ +shouldUseMock()) { + sleep(1); + } + } + + public function testNormalPost() + { + $responseText = file_get_contents(__DIR__ . '/../../fixture/Kb10uyShortStoryServer/tomone.html'); + + $this->createResolver(Kb10uyShortStoryServerResolver::class, $responseText); + + $metadata = $this->resolver->resolve('https://ss.kb10uy.org/posts/14'); + $this->assertSame('朋音「は、はぁ?おむつ?」', $metadata->title); + $this->assertSame('自炊したおかずってやつです。とりあえずこのSSの中ではkb10uyの彼女は朋音ってことにしといてください。そうじゃないと出す男が決定できないので。', $metadata->description); + $this->assertSame(['妄想', 'kb10uy', '岩永朋音', 'おむつ'], $metadata->tags); + if ($this->shouldUseMock()) { + $this->assertSame('https://ss.kb10uy.org/posts/14', (string) $this->handler->getLastRequest()->getUri()); + } + } +} diff --git a/tests/fixture/Kb10uyShortStoryServer/tomone.html b/tests/fixture/Kb10uyShortStoryServer/tomone.html new file mode 100644 index 0000000..37dca5a --- /dev/null +++ b/tests/fixture/Kb10uyShortStoryServer/tomone.html @@ -0,0 +1,205 @@ + + + + + + + + + + + + 朋音「は、はぁ?おむつ?」 - ShortStoryServer + + +
+ +
+
+ +
+ + +
+

+kb10uy「うん、今日はこれ穿いて学校行って」 +朋音「あの……アンタ本気で言ってるの?」 +kb10uy「自分の好きでもない子にそんなおむつ穿いてとか言わないよ」 +朋音「そういうことじゃないのよっ……」 +

+

+kb10uy の要求はいたって単純である。 +

+
    +
  • 今日一日、おむつを穿いていること。
  • +
  • 必ずおむつの中に出すこと(大小問わず)。
  • +
  • 必ず人のいる場所で出すこと。
  • +
+

+単純か? +

+

+朋音「いまアンタのカノジョになっちゃったことを心底後悔してるわ……」 +kb10uy「でもやってくれるよね?」 +朋音「うぅ……そうよ、やるわよ……正直、そ、その……やり、たい……し」 +kb10uy「朋音ならそう言ってくれると思った!じゃあよろしくね」 +朋音「何が宜しいのよ……まったく」 +

+
+

+朋音「え、ちょっと待って、ワタシこれ大きいほうもこれにするの!?」 +kb10uy「うん、言ったじゃん」 +朋音「はぁ……」 +kb10uy「嫌だったら我慢して帰ってきてからしてもいいから」 +朋音「言われなくてもそうするわよ!w」 +kb10uy「おしっこは我慢できなさそう?」 +朋音「ん、正直自信ない……」 +kb10uy「まあ大丈夫だって、きっとバレないよ」 +朋音「よくもそんなヘラヘラと……」 +

+
+

+はぁ〜……。もうユウウツだわ……。 +夏稀「トモ、大丈夫?なんか妙に落ち込んでるように見えるけど……」 +朋音「うーん……微妙」 +夏稀「何かあった?」 +朋音「あのさ……kb10uyいるじゃん」 +夏稀「あぁ……1つ上の」 +朋音「多分なつには言ってなかったと思うんだけどさ、ワタシちょっと前からあいつと付き合ってるんだわ」 +夏稀「え、ほんとに!!良かったじゃん、おめでとう〜」 +朋音「それがあんまりおめでたくなくてさ……」 +夏稀「というと」 +朋音「kb10uyって精力絶倫ってウワサじゃん」 +夏稀「そうらしいね」 +朋音「絶倫なだけならまだ良くてさ、ワタシもそういうことするんだろうなってのは覚悟してたし」 +夏稀「したんだ?」 +朋音「ん。プロポーズした日に……」 +夏稀「マジで絶倫なんだ……」 +朋音「いやこっからなのよ問題は。kb10uy、性癖もヤバヤバのヤバでさ」 +夏稀「あー、はぁ……」 +朋音「……誰にも言わない?」 +夏稀「……うん。」 +

+

+朋音「ワタシ今おむつ穿かされてるの」 +夏稀「えっっ!! +

+

+朋音「っ………///」 +夏稀「なるほど……」 +夏稀「でもトモも穿いてるってことはやっぱりムッツリだよね」 +朋音「返す言葉もないわ……」 +

+
+

+実際に中に放尿するシーンはみなさんのご想像におまかせします +

+

+僕は廊下で人とぶつかってその衝撃でジョロロロって感じのシチュエーションで抜きました +

+
+ +
+ + + + From d1abca54161205b951fd6a4c2a53831d349b0ef7 Mon Sep 17 00:00:00 2001 From: Yuu Kobayashi Date: Sun, 29 Sep 2019 18:03:34 +0900 Subject: [PATCH 09/28] =?UTF-8?q?=E6=88=90=E5=90=A6=E5=88=A4=E5=AE=9A?= =?UTF-8?q?=E3=82=92=E9=99=A4=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/MetadataResolver/Kb10uyShortStoryServerResolver.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/MetadataResolver/Kb10uyShortStoryServerResolver.php b/app/MetadataResolver/Kb10uyShortStoryServerResolver.php index 26a7dd8..a29389e 100644 --- a/app/MetadataResolver/Kb10uyShortStoryServerResolver.php +++ b/app/MetadataResolver/Kb10uyShortStoryServerResolver.php @@ -22,12 +22,6 @@ class Kb10uyShortStoryServerResolver implements Resolver public function resolve(string $url): Metadata { $res = $this->client->get($url); - if ($res->getStatusCode() !== 200) { - throw new \RuntimeException("{$res->getStatusCode()}: $url"); - - return $this->parse($res->getBody()); - } - $html = (string) $res->getBody(); $crawler = new Crawler($html); $infoElement = $crawler->filter('div.post-info'); From b3c98613e7b23c6aeddef9bdf179f1da614442b7 Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 3 Oct 2019 23:34:57 +0900 Subject: [PATCH 10/28] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=81=AE?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MetadataResolver/NijieResolverTest.php | 19 +++ .../testHasHtmlInAuthorProfileResponse.html | 114 ++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 tests/fixture/Nijie/testHasHtmlInAuthorProfileResponse.html diff --git a/tests/Unit/MetadataResolver/NijieResolverTest.php b/tests/Unit/MetadataResolver/NijieResolverTest.php index 417a853..f0e8d32 100644 --- a/tests/Unit/MetadataResolver/NijieResolverTest.php +++ b/tests/Unit/MetadataResolver/NijieResolverTest.php @@ -129,4 +129,23 @@ class NijieResolverTest extends TestCase $this->assertSame('https://nijie.info/view.php?id=66384', (string) $this->handler->getLastRequest()->getUri()); } } + + public function testHasHtmlInAuthorProfile() + { + $responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testHasHtmlInAuthorProfileResponse.html'); + + $this->createResolver(NijieResolver::class, $responseText); + + $metadata = $this->resolver->resolve('https://nijie.info/view.php?id=285698'); + $this->assertSame('JK文化祭コスプレ喫茶', $metadata->title); + $this->assertSame('投稿者: ままままま' . PHP_EOL . + 'https://www.pixiv.net/fanbox/creator/32045169' . PHP_EOL . + 'ピクシブのファンボックスでこっちに上げてた一次創作のノリでえっちなやつ描いてます' . PHP_EOL . + '二次創作のえっちなやつは相変わらずこっち' . PHP_EOL . '健全目なのはついったー', $metadata->description); + $this->assertSame('https://pic.nijie.net/02/nijie_picture/540086_20181028112046_0.png', $metadata->image); + $this->assertSame(['バニーガール'], $metadata->tags); + if ($this->shouldUseMock()) { + $this->assertSame('https://nijie.info/view.php?id=285698', (string) $this->handler->getLastRequest()->getUri()); + } + } } diff --git a/tests/fixture/Nijie/testHasHtmlInAuthorProfileResponse.html b/tests/fixture/Nijie/testHasHtmlInAuthorProfileResponse.html new file mode 100644 index 0000000..2cd5313 --- /dev/null +++ b/tests/fixture/Nijie/testHasHtmlInAuthorProfileResponse.html @@ -0,0 +1,114 @@ +JK文化祭コスプレ喫茶 | ままままま | ニジエ +

JK文化祭コスプレ喫茶 | ままままま

+ +
+ + + + +
+ From 99a92c6106353b919a8027cdd0f3bb695736ab07 Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 14 Oct 2019 02:03:57 +0900 Subject: [PATCH 11/28] =?UTF-8?q?=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=81=AE=E7=B7=A8=E9=9B=86=E3=81=AF=E6=9C=AC?= =?UTF-8?q?=E4=BA=BA=E3=81=AE=E3=81=BF=E5=8F=AF=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit bcb5abb1611e0fcf99cff068676d650694fe8232) --- .../Controllers/EjaculationController.php | 13 +++++++++ app/Policies/EjaculationPolicy.php | 27 +++++++++++++++++++ app/Providers/AuthServiceProvider.php | 3 +++ 3 files changed, 43 insertions(+) create mode 100644 app/Policies/EjaculationPolicy.php diff --git a/app/Http/Controllers/EjaculationController.php b/app/Http/Controllers/EjaculationController.php index cf11294..aa770ca 100644 --- a/app/Http/Controllers/EjaculationController.php +++ b/app/Http/Controllers/EjaculationController.php @@ -106,6 +106,10 @@ class EjaculationController extends Controller { $ejaculation = Ejaculation::findOrFail($id); + if (Auth::user()->cant('edit', $ejaculation)) { + abort(403); + } + return view('ejaculation.edit')->with(compact('ejaculation')); } @@ -113,6 +117,10 @@ class EjaculationController extends Controller { $ejaculation = Ejaculation::findOrFail($id); + if (Auth::user()->cant('edit', $ejaculation)) { + abort(403); + } + $inputs = $request->all(); $validator = Validator::make($inputs, [ @@ -163,6 +171,11 @@ class EjaculationController extends Controller public function destroy($id) { $ejaculation = Ejaculation::findOrFail($id); + + if (Auth::user()->cant('edit', $ejaculation)) { + abort(403); + } + $user = User::findOrFail($ejaculation->user_id); $ejaculation->tags()->detach(); $ejaculation->delete(); diff --git a/app/Policies/EjaculationPolicy.php b/app/Policies/EjaculationPolicy.php new file mode 100644 index 0000000..d4f7f9d --- /dev/null +++ b/app/Policies/EjaculationPolicy.php @@ -0,0 +1,27 @@ +id === $ejaculation->user_id; + } +} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 600ff72..dd25e21 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -2,6 +2,8 @@ namespace App\Providers; +use App\Ejaculation; +use App\Policies\EjaculationPolicy; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Gate; @@ -14,6 +16,7 @@ class AuthServiceProvider extends ServiceProvider */ protected $policies = [ 'App\Model' => 'App\Policies\ModelPolicy', + Ejaculation::class => EjaculationPolicy::class, ]; /** From 332b6d7dd0e770965f7c5de60c0465c24403f6e8 Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 14 Oct 2019 02:24:39 +0900 Subject: [PATCH 12/28] =?UTF-8?q?=E3=81=93=E3=81=A3=E3=81=A1=E3=81=AE?= =?UTF-8?q?=E3=81=BB=E3=81=86=E3=81=8C=E3=83=9E=E3=82=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/EjaculationController.php | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/app/Http/Controllers/EjaculationController.php b/app/Http/Controllers/EjaculationController.php index aa770ca..d509bdb 100644 --- a/app/Http/Controllers/EjaculationController.php +++ b/app/Http/Controllers/EjaculationController.php @@ -106,9 +106,7 @@ class EjaculationController extends Controller { $ejaculation = Ejaculation::findOrFail($id); - if (Auth::user()->cant('edit', $ejaculation)) { - abort(403); - } + $this->authorize('edit', $ejaculation); return view('ejaculation.edit')->with(compact('ejaculation')); } @@ -117,9 +115,7 @@ class EjaculationController extends Controller { $ejaculation = Ejaculation::findOrFail($id); - if (Auth::user()->cant('edit', $ejaculation)) { - abort(403); - } + $this->authorize('edit', $ejaculation); $inputs = $request->all(); @@ -172,9 +168,7 @@ class EjaculationController extends Controller { $ejaculation = Ejaculation::findOrFail($id); - if (Auth::user()->cant('edit', $ejaculation)) { - abort(403); - } + $this->authorize('edit', $ejaculation); $user = User::findOrFail($ejaculation->user_id); $ejaculation->tags()->detach(); From 57a847baf52f43b25c864cd111c365b715d3eb67 Mon Sep 17 00:00:00 2001 From: eai04191 Date: Mon, 4 Nov 2019 14:01:42 +0900 Subject: [PATCH 13/28] Update fixture --- tests/fixture/Xtube/video.html | 1041 ++++++++++++++++++++++++-------- 1 file changed, 795 insertions(+), 246 deletions(-) diff --git a/tests/fixture/Xtube/video.html b/tests/fixture/Xtube/video.html index ef4cbc5..893b8b1 100644 --- a/tests/fixture/Xtube/video.html +++ b/tests/fixture/Xtube/video.html @@ -1,9 +1,23 @@ - - - + + + + + + + + + + + + + + + + + @@ -11,21 +25,21 @@ - - - - - + + + + + - + - + - + @@ -136,13 +150,16 @@
    @@ -214,7 +231,7 @@
    - + - + From 16ed4482f46f6d77f50a6ae02c9950b63482330c Mon Sep 17 00:00:00 2001 From: eai04191 Date: Mon, 4 Nov 2019 14:23:30 +0900 Subject: [PATCH 14/28] =?UTF-8?q?OGP=E3=82=92=E5=90=90=E3=81=8F=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=AA=E3=81=A3=E3=81=A6=E3=81=84=E3=81=9F?= =?UTF-8?q?=E3=81=AE=E3=81=A7OGPResolver=E3=81=A7image=E3=82=92=E5=8F=96?= =?UTF-8?q?=E5=BE=97=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/MetadataResolver/XtubeResolver.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app/MetadataResolver/XtubeResolver.php b/app/MetadataResolver/XtubeResolver.php index d2b3272..f2153ce 100644 --- a/app/MetadataResolver/XtubeResolver.php +++ b/app/MetadataResolver/XtubeResolver.php @@ -11,10 +11,15 @@ class XtubeResolver implements Resolver * @var Client */ private $client; + /** + * @var OGPResolver + */ + private $ogpResolver; - public function __construct(Client $client) + public function __construct(Client $client, OGPResolver $ogpResolver) { $this->client = $client; + $this->ogpResolver = $ogpResolver; } public function resolve(string $url): Metadata @@ -25,16 +30,13 @@ class XtubeResolver implements Resolver $res = $this->client->get($url); $html = (string) $res->getBody(); - $metadata = new Metadata(); + $metadata = $this->ogpResolver->parse($html); $crawler = new Crawler($html); - // poster URL抽出 - $playerConfig = explode("\n", trim($crawler->filter('#playerWrapper script')->last()->text())); - preg_match('~https:\\\/\\\/cdn\d+-s-hw-e5\.xtube\.com\\\/m=(?P.{8})\\\/videos\\\/\d{6}\\\/\d{2}\\\/.{5}-.{4}-\\\/original\\\/\d+\.jpg~', $playerConfig[0], $matches); - $metadata->image = str_replace('\/', '/', $matches[0]); - $metadata->title = trim($crawler->filter('.underPlayerRateForm h1')->text('')); $metadata->description = trim($crawler->filter('.fullDescription ')->text('')); + $metadata->image = str_replace('m=eSuQ8f', 'm=eaAaaEFb', $metadata->image); + $metadata->image = str_replace('240X180', 'original', $metadata->image); $metadata->tags = $crawler->filter('.tagsCategories a')->extract('_text'); return $metadata; From dc0eb0a548b3efe7da3658f65f20f4a4de004024 Mon Sep 17 00:00:00 2001 From: eai04191 Date: Mon, 4 Nov 2019 14:24:09 +0900 Subject: [PATCH 15/28] =?UTF-8?q?tag=E3=81=AE=E5=90=84=E8=A6=81=E7=B4=A0?= =?UTF-8?q?=E3=82=92trim()=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/MetadataResolver/XtubeResolver.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/MetadataResolver/XtubeResolver.php b/app/MetadataResolver/XtubeResolver.php index f2153ce..ed1e258 100644 --- a/app/MetadataResolver/XtubeResolver.php +++ b/app/MetadataResolver/XtubeResolver.php @@ -37,7 +37,13 @@ class XtubeResolver implements Resolver $metadata->description = trim($crawler->filter('.fullDescription ')->text('')); $metadata->image = str_replace('m=eSuQ8f', 'm=eaAaaEFb', $metadata->image); $metadata->image = str_replace('240X180', 'original', $metadata->image); - $metadata->tags = $crawler->filter('.tagsCategories a')->extract('_text'); + $metadata->tags = + array_map( + function ($text) { + return trim($text); + }, + $crawler->filter('.tagsCategories a')->extract('_text') + ); return $metadata; } From 12fd228e7505244a83aec255d1729e15290fad2a Mon Sep 17 00:00:00 2001 From: eai04191 Date: Tue, 5 Nov 2019 05:59:00 +0900 Subject: [PATCH 16/28] =?UTF-8?q?array=5Fmap=E3=81=AEcallback=E3=82=92?= =?UTF-8?q?=E3=82=B7=E3=83=B3=E3=83=97=E3=83=AB=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/MetadataResolver/XtubeResolver.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/MetadataResolver/XtubeResolver.php b/app/MetadataResolver/XtubeResolver.php index ed1e258..58608dd 100644 --- a/app/MetadataResolver/XtubeResolver.php +++ b/app/MetadataResolver/XtubeResolver.php @@ -37,13 +37,7 @@ class XtubeResolver implements Resolver $metadata->description = trim($crawler->filter('.fullDescription ')->text('')); $metadata->image = str_replace('m=eSuQ8f', 'm=eaAaaEFb', $metadata->image); $metadata->image = str_replace('240X180', 'original', $metadata->image); - $metadata->tags = - array_map( - function ($text) { - return trim($text); - }, - $crawler->filter('.tagsCategories a')->extract('_text') - ); + $metadata->tags = array_map('trim', $crawler->filter('.tagsCategories a')->extract('_text')); return $metadata; } From d8e170ff8538c3f4822b63510b44f8f268e582ab Mon Sep 17 00:00:00 2001 From: eai04191 Date: Fri, 8 Nov 2019 05:36:40 +0900 Subject: [PATCH 17/28] =?UTF-8?q?DLsite=E3=81=AE=E6=96=B0=E3=81=97?= =?UTF-8?q?=E3=81=84=E3=82=A2=E3=83=95=E3=82=A3=E3=83=AA=E3=82=A8=E3=82=A4?= =?UTF-8?q?=E3=83=88URL=E6=A7=8B=E9=80=A0=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/MetadataResolver/DLsiteResolver.php | 14 ++++---- app/MetadataResolver/MetadataResolver.php | 2 +- .../MetadataResolver/DLsiteResolverTest.php | 34 ++++++++++++++++++- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/app/MetadataResolver/DLsiteResolver.php b/app/MetadataResolver/DLsiteResolver.php index 957a5d1..589b7a2 100644 --- a/app/MetadataResolver/DLsiteResolver.php +++ b/app/MetadataResolver/DLsiteResolver.php @@ -53,17 +53,19 @@ class DLsiteResolver implements Resolver public function resolve(string $url): Metadata { //アフィリエイトの場合は普通のURLに変換 - if (strpos($url, '/dlaf/=/link/') !== false) { - preg_match('~www\.dlsite\.com/(?P.+)/dlaf/=/link/work/aid/.+/id/(?P..\d+)(\.html)?~', $url, $matches); + // ID型 + if (strpos($url, '/dlaf/=/link/') !== false || preg_match('~/dlaf/=(/.+/.+)?/link/~', $url)) { + preg_match('~www\.dlsite\.com/(?P.+)/dlaf/=(/.+/.+)?/link/work/aid/(?P.+)/id/(?P..\d+)(\.html)?~', $url, $matches); $url = "https://www.dlsite.com/{$matches['genre']}/work/=/product_id/{$matches['titleId']}.html"; } + // URL型 if (strpos($url, '/dlaf/=/aid/') !== false) { preg_match('~www\.dlsite\.com/.+/dlaf/=/aid/.+/url/(?P.+)~', $url, $matches); - $affiliate_url = urldecode($matches['url']); - if (preg_match('~www\.dlsite\.com/.+/(work|announce)/=/product_id/..\d+(\.html)?~', $affiliate_url, $matches)) { - $url = $affiliate_url; + $affiliateUrl = urldecode($matches['url']); + if (preg_match('~www\.dlsite\.com/.+/(work|announce)/=/product_id/..\d+(\.html)?~', $affiliateUrl, $matches)) { + $url = $affiliateUrl; } else { - throw new \RuntimeException("アフィリエイト先のリンクがDLsiteのタイトルではありません: $affiliate_url"); + throw new \RuntimeException("アフィリエイト先のリンクがDLsiteのタイトルではありません: $affiliateUrl"); } } diff --git a/app/MetadataResolver/MetadataResolver.php b/app/MetadataResolver/MetadataResolver.php index 8d25294..bb2ec08 100644 --- a/app/MetadataResolver/MetadataResolver.php +++ b/app/MetadataResolver/MetadataResolver.php @@ -16,7 +16,7 @@ class MetadataResolver implements Resolver '~ec\.toranoana\.(jp|shop)/(tora|joshi)(_[rd]+)?/(ec|digi)/item/~' => ToranoanaResolver::class, '~iwara\.tv/(videos|images)/.*~' => IwaraResolver::class, '~www\.dlsite\.com/.*/(work|announce)/=/product_id/..\d+(\.html)?~' => DLsiteResolver::class, - '~www\.dlsite\.com/.*/dlaf/=/link/(work|announce)/aid/.+/..\d+(\.html)?~' => DLsiteResolver::class, + '~www\.dlsite\.com/.*/dlaf/=(/.+/.+)?/link/work/aid/.+(/id)?/..\d+(\.html)?~' => DLsiteResolver::class, '~www\.dlsite\.com/.*/dlaf/=/aid/.+/url/.+~' => DLsiteResolver::class, '~dlsite\.jp/...tw/..\d+~' => DLsiteResolver::class, '~www\.pixiv\.net/member_illust\.php\?illust_id=\d+~' => PixivResolver::class, diff --git a/tests/Unit/MetadataResolver/DLsiteResolverTest.php b/tests/Unit/MetadataResolver/DLsiteResolverTest.php index ff164ba..3267039 100644 --- a/tests/Unit/MetadataResolver/DLsiteResolverTest.php +++ b/tests/Unit/MetadataResolver/DLsiteResolverTest.php @@ -227,7 +227,7 @@ class DLsiteResolverTest extends TestCase } } - public function testAffiliateLink() + public function testOldAffiliateLink() { $responseText = file_get_contents(__DIR__ . '/../../fixture/DLsite/testHome.html'); @@ -243,6 +243,38 @@ class DLsiteResolverTest extends TestCase } } + public function testSnsAffiliateLink() + { + $responseText = file_get_contents(__DIR__ . '/../../fixture/DLsite/testHome.html'); + + $this->createResolver(DLsiteResolver::class, $responseText); + + $metadata = $this->resolver->resolve('https://www.dlsite.com/home/dlaf/=/t/s/link/work/aid/eai04191/id/RJ221761.html'); + $this->assertEquals('ひつじ、数えてあげるっ', $metadata->title); + $this->assertEquals('サークル名: Butterfly Dream' . PHP_EOL . '眠れないあなたに彼女が羊を数えてくれる音声です。', $metadata->description); + $this->assertEquals('https://img.dlsite.jp/modpub/images2/work/doujin/RJ222000/RJ221761_img_main.jpg', $metadata->image); + $this->assertEquals(['癒し', 'バイノーラル/ダミヘ', '日常/生活', 'ほのぼの', '恋人同士'], $metadata->tags); + if ($this->shouldUseMock()) { + $this->assertSame('https://www.dlsite.com/home/work/=/product_id/RJ221761.html', (string) $this->handler->getLastRequest()->getUri()); + } + } + + public function testAffiliateLink() + { + $responseText = file_get_contents(__DIR__ . '/../../fixture/DLsite/testHome.html'); + + $this->createResolver(DLsiteResolver::class, $responseText); + + $metadata = $this->resolver->resolve('https://www.dlsite.com/home/dlaf/=/t/t/link/work/aid/eai04191/id/RJ221761.html'); + $this->assertEquals('ひつじ、数えてあげるっ', $metadata->title); + $this->assertEquals('サークル名: Butterfly Dream' . PHP_EOL . '眠れないあなたに彼女が羊を数えてくれる音声です。', $metadata->description); + $this->assertEquals('https://img.dlsite.jp/modpub/images2/work/doujin/RJ222000/RJ221761_img_main.jpg', $metadata->image); + $this->assertEquals(['癒し', 'バイノーラル/ダミヘ', '日常/生活', 'ほのぼの', '恋人同士'], $metadata->tags); + if ($this->shouldUseMock()) { + $this->assertSame('https://www.dlsite.com/home/work/=/product_id/RJ221761.html', (string) $this->handler->getLastRequest()->getUri()); + } + } + public function testAffiliateUrl() { $responseText = file_get_contents(__DIR__ . '/../../fixture/DLsite/testHome.html'); From c8cee801447f2a2e373d5570d5806f54b1e8a3d1 Mon Sep 17 00:00:00 2001 From: eai04191 Date: Sat, 9 Nov 2019 18:28:47 +0900 Subject: [PATCH 18/28] =?UTF-8?q?=E5=86=97=E9=95=B7=E3=81=AA=E8=A9=95?= =?UTF-8?q?=E4=BE=A1=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/MetadataResolver/DLsiteResolver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/MetadataResolver/DLsiteResolver.php b/app/MetadataResolver/DLsiteResolver.php index 589b7a2..f9aee84 100644 --- a/app/MetadataResolver/DLsiteResolver.php +++ b/app/MetadataResolver/DLsiteResolver.php @@ -54,7 +54,7 @@ class DLsiteResolver implements Resolver { //アフィリエイトの場合は普通のURLに変換 // ID型 - if (strpos($url, '/dlaf/=/link/') !== false || preg_match('~/dlaf/=(/.+/.+)?/link/~', $url)) { + if (preg_match('~/dlaf/=(/.+/.+)?/link/~', $url)) { preg_match('~www\.dlsite\.com/(?P.+)/dlaf/=(/.+/.+)?/link/work/aid/(?P.+)/id/(?P..\d+)(\.html)?~', $url, $matches); $url = "https://www.dlsite.com/{$matches['genre']}/work/=/product_id/{$matches['titleId']}.html"; } From 26be8a086e5b34dbdf602839d4cf4d030b0bf6ee Mon Sep 17 00:00:00 2001 From: shibafu Date: Sat, 9 Nov 2019 23:19:28 +0900 Subject: [PATCH 19/28] =?UTF-8?q?=E7=A9=BA=E6=96=87=E5=AD=97=E5=88=97?= =?UTF-8?q?=E3=81=AE=E3=82=BF=E3=82=B0=E3=81=AF=E4=BF=9D=E5=AD=98=E3=81=9B?= =?UTF-8?q?=E3=81=9A=E6=8D=A8=E3=81=A6=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/EjaculationController.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/Http/Controllers/EjaculationController.php b/app/Http/Controllers/EjaculationController.php index d509bdb..c0d6277 100644 --- a/app/Http/Controllers/EjaculationController.php +++ b/app/Http/Controllers/EjaculationController.php @@ -65,6 +65,10 @@ class EjaculationController extends Controller if (!empty($inputs['tags'])) { $tags = explode(' ', $inputs['tags']); foreach ($tags as $tag) { + if ($tag === '') { + continue; + } + $tag = Tag::firstOrCreate(['name' => $tag]); $tagIds[] = $tag->id; } @@ -151,6 +155,10 @@ class EjaculationController extends Controller if (!empty($inputs['tags'])) { $tags = explode(' ', $inputs['tags']); foreach ($tags as $tag) { + if ($tag === '') { + continue; + } + $tag = Tag::firstOrCreate(['name' => $tag]); $tagIds[] = $tag->id; } From a01bc6989e7de437fc44f4c2cecb367f387b3858 Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 14 Nov 2019 00:59:23 +0900 Subject: [PATCH 20/28] =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E3=81=B8=E3=81=AE=E3=83=AA=E3=83=B3=E3=82=AF=E3=81=8C=E3=83=A2?= =?UTF-8?q?=E3=83=90=E3=82=A4=E3=83=AB=E3=81=A7=E8=A1=A8=E7=A4=BA=E3=81=95?= =?UTF-8?q?=E3=82=8C=E3=81=AA=E3=81=84=E3=83=90=E3=82=B0=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/views/layouts/base.blade.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/views/layouts/base.blade.php b/resources/views/layouts/base.blade.php index 9d03065..00e0d46 100644 --- a/resources/views/layouts/base.blade.php +++ b/resources/views/layouts/base.blade.php @@ -54,6 +54,9 @@ いいね 設定 + @can ('admin') + 管理 + @endcan ログアウト
From f132955be75690804c52b184e72bc535b492f569 Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 12 Sep 2019 00:54:36 +0900 Subject: [PATCH 21/28] =?UTF-8?q?=E3=82=A2=E3=82=AB=E3=82=A6=E3=83=B3?= =?UTF-8?q?=E3=83=88=E5=89=8A=E9=99=A4=E7=94=BB=E9=9D=A2=E3=81=AE=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/DeactivatedUser.php | 18 +++++++ app/Http/Controllers/SettingController.php | 49 +++++++++++++++++++ app/User.php | 5 ++ ..._003449_create_deactivated_users_table.php | 33 +++++++++++++ resources/assets/js/setting/deactivate.js | 5 ++ resources/views/setting/base.blade.php | 4 +- resources/views/setting/deactivate.blade.php | 32 ++++++++++++ resources/views/setting/deactivated.blade.php | 16 ++++++ routes/web.php | 2 + webpack.mix.js | 1 + 10 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 app/DeactivatedUser.php create mode 100644 database/migrations/2019_11_14_003449_create_deactivated_users_table.php create mode 100644 resources/assets/js/setting/deactivate.js create mode 100644 resources/views/setting/deactivate.blade.php create mode 100644 resources/views/setting/deactivated.blade.php diff --git a/app/DeactivatedUser.php b/app/DeactivatedUser.php new file mode 100644 index 0000000..7cc4b55 --- /dev/null +++ b/app/DeactivatedUser.php @@ -0,0 +1,18 @@ +route('setting.privacy')->with('status', 'プライバシー設定を更新しました。'); } + public function deactivate() + { + return view('setting.deactivate'); + } + + public function destroyUser(Request $request) + { + // パスワードチェック + $validated = $request->validate([ + 'password' => 'required|string' + ]); + + if (!Hash::check($validated['password'], Auth::user()->getAuthPassword())) { + throw ValidationException::withMessages([ + 'password' => 'パスワードが正しくありません。' + ]); + } + + // データの削除 + set_time_limit(0); + DB::transaction(function () { + $user = Auth::user(); + + // 関連レコードの削除 + // TODO: 別にDELETE文相当のクエリを一発発行するだけでもいい? + foreach ($user->ejaculations as $ejaculation) { + $ejaculation->delete(); + } + foreach ($user->likes as $like) { + $like->delete(); + } + + // 先にログアウトしないとユーザーは消せない + Auth::logout(); + + // ユーザーの削除 + $user->delete(); + + // ユーザー名履歴に追記 + DeactivatedUser::create(['name' => $user->name]); + }); + + return view('setting.deactivated'); + } + // ( ◠‿◠ )☛ここに気づいたか・・・消えてもらう ▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああああ // public function password() // { diff --git a/app/User.php b/app/User.php index 1cafaa2..c82e5d0 100644 --- a/app/User.php +++ b/app/User.php @@ -53,6 +53,11 @@ class User extends Authenticatable return Auth::check() && $this->id === Auth::user()->id; } + public function ejaculations() + { + return $this->hasMany(Ejaculation::class); + } + public function likes() { return $this->hasMany(Like::class); diff --git a/database/migrations/2019_11_14_003449_create_deactivated_users_table.php b/database/migrations/2019_11_14_003449_create_deactivated_users_table.php new file mode 100644 index 0000000..3e4f475 --- /dev/null +++ b/database/migrations/2019_11_14_003449_create_deactivated_users_table.php @@ -0,0 +1,33 @@ +string('name', 15); + $table->timestamps(); + + $table->primary('name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('deactivated_users'); + } +} diff --git a/resources/assets/js/setting/deactivate.js b/resources/assets/js/setting/deactivate.js new file mode 100644 index 0000000..e99acd0 --- /dev/null +++ b/resources/assets/js/setting/deactivate.js @@ -0,0 +1,5 @@ +$('#deactivate-form').on('submit', function () { + if (!confirm('本当にアカウントを削除してもよろしいですか?')) { + return false; + } +}); diff --git a/resources/views/setting/base.blade.php b/resources/views/setting/base.blade.php index d3274cf..2d53e94 100644 --- a/resources/views/setting/base.blade.php +++ b/resources/views/setting/base.blade.php @@ -10,6 +10,8 @@ href="{{ route('setting') }}"> プロフィール プライバシー + アカウントの削除 {{-- パスワード--}}
@@ -19,4 +21,4 @@ -@endsection \ No newline at end of file +@endsection diff --git a/resources/views/setting/deactivate.blade.php b/resources/views/setting/deactivate.blade.php new file mode 100644 index 0000000..07df952 --- /dev/null +++ b/resources/views/setting/deactivate.blade.php @@ -0,0 +1,32 @@ +@extends('setting.base') + +@section('title', 'アカウントの削除') + +@section('tab-content') +

アカウントの削除

+
+

Tissueからあなたのアカウントに関する情報を削除します。

+
+

警告

+

削除はすぐに実行され、取り消すことはできません!

+

なりすましを防止するため、あなたのユーザー名はサーバーに記録されます。今後、同じユーザー名を使って再登録することはできません。

+
+ +
+ {{ csrf_field() }} +
+

上記の条件に同意してアカウントを削除する場合は、パスワードを入力して削除ボタンを押してください。

+ + + @if ($errors->has('password')) +
{{ $errors->first('password') }}
+ @endif +
+ + +
+@endsection + +@push('script') + +@endpush diff --git a/resources/views/setting/deactivated.blade.php b/resources/views/setting/deactivated.blade.php new file mode 100644 index 0000000..1e5fafa --- /dev/null +++ b/resources/views/setting/deactivated.blade.php @@ -0,0 +1,16 @@ +@extends('layouts.base') + +@section('title', 'アカウント削除完了') + +@section('content') +
+

アカウントを削除しました

+
+

Tissueをご利用いただき、ありがとうございました。

+

トップページへ

+
+@endsection + +@push('script') + +@endpush diff --git a/routes/web.php b/routes/web.php index 6c0fbdb..184bd18 100644 --- a/routes/web.php +++ b/routes/web.php @@ -36,6 +36,8 @@ Route::middleware('auth')->group(function () { Route::post('/setting/profile', 'SettingController@updateProfile')->name('setting.profile.update'); Route::get('/setting/privacy', 'SettingController@privacy')->name('setting.privacy'); Route::post('/setting/privacy', 'SettingController@updatePrivacy')->name('setting.privacy.update'); + Route::get('/setting/deactivate', 'SettingController@deactivate')->name('setting.deactivate'); + Route::post('/setting/deactivate', 'SettingController@destroyUser')->name('setting.deactivate.destroy'); // Route::get('/setting/password', 'SettingController@password')->name('setting.password'); }); diff --git a/webpack.mix.js b/webpack.mix.js index 3532d8b..bf24e44 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -16,6 +16,7 @@ mix.js('resources/assets/js/app.js', 'public/js') .js('resources/assets/js/home.js', 'public/js') .js('resources/assets/js/user/stats.js', 'public/js/user') .js('resources/assets/js/setting/privacy.js', 'public/js/setting') + .js('resources/assets/js/setting/deactivate.js', 'public/js/setting') .ts('resources/assets/js/checkin.ts', 'public/js') .sass('resources/assets/sass/app.scss', 'public/css') .autoload({ From 73ee9f108bd6d441a0c800b12d9ec24c88b66f3a Mon Sep 17 00:00:00 2001 From: shibafu Date: Sat, 16 Nov 2019 00:25:43 +0900 Subject: [PATCH 22/28] =?UTF-8?q?=E9=81=8E=E5=8E=BB=E3=81=AB=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E3=81=95=E3=82=8C=E3=81=9F=E3=83=A6=E3=83=BC=E3=82=B6?= =?UTF-8?q?=E3=83=BC=E5=90=8D=E3=81=A7=E7=99=BB=E9=8C=B2=E3=81=A7=E3=81=8D?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Auth/RegisterController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 0f6dfcb..9fd7886 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -48,7 +48,7 @@ class RegisterController extends Controller protected function validator(array $data) { $rules = [ - 'name' => 'required|string|regex:/^[a-zA-Z0-9_-]+$/u|max:15|unique:users', + 'name' => 'required|string|regex:/^[a-zA-Z0-9_-]+$/u|max:15|unique:users|unique:deactivated_users', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:6|confirmed' ]; From 67ae0e159f1285d043e926bc0d4a892b3a04f3ed Mon Sep 17 00:00:00 2001 From: unarist Date: Sun, 24 Nov 2019 12:17:53 +0000 Subject: [PATCH 23/28] =?UTF-8?q?ActivityPubResolver=E3=81=AFNote=E3=81=A0?= =?UTF-8?q?=E3=81=91=E5=87=A6=E7=90=86=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/MetadataResolver/ActivityPubResolver.php | 4 ++++ app/MetadataResolver/MetadataResolver.php | 19 +++++++++++-------- .../UnsupportedContentException.php | 12 ++++++++++++ 3 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 app/MetadataResolver/UnsupportedContentException.php diff --git a/app/MetadataResolver/ActivityPubResolver.php b/app/MetadataResolver/ActivityPubResolver.php index 7cf3e00..c0580c8 100644 --- a/app/MetadataResolver/ActivityPubResolver.php +++ b/app/MetadataResolver/ActivityPubResolver.php @@ -37,6 +37,10 @@ class ActivityPubResolver implements Resolver, Parser $activityOrObject = json_decode($json, true); $object = $activityOrObject['object'] ?? $activityOrObject; + if ($object['type'] !== 'Note') { + throw new UnsupportedContentException('Unsupported object type: ' . $object['type']); + } + $metadata = new Metadata(); $metadata->title = isset($object['attributedTo']) ? $this->getTitleFromActor($object['attributedTo']) : ''; diff --git a/app/MetadataResolver/MetadataResolver.php b/app/MetadataResolver/MetadataResolver.php index bb2ec08..41869b8 100644 --- a/app/MetadataResolver/MetadataResolver.php +++ b/app/MetadataResolver/MetadataResolver.php @@ -48,16 +48,19 @@ class MetadataResolver implements Resolver { foreach ($this->rules as $pattern => $class) { if (preg_match($pattern, $url) === 1) { - /** @var Resolver $resolver */ - $resolver = app($class); + try { + /** @var Resolver $resolver */ + $resolver = app($class); - return $resolver->resolve($url); + return $resolver->resolve($url); + } catch (UnsupportedContentException $e) { + } } } - $result = $this->resolveWithAcceptHeader($url); - if ($result !== null) { - return $result; + try { + return $this->resolveWithAcceptHeader($url); + } catch (UnsupportedContentException $e) { } if (isset($this->defaultResolver)) { @@ -70,7 +73,7 @@ class MetadataResolver implements Resolver throw new \UnexpectedValueException('URL not matched.'); } - public function resolveWithAcceptHeader(string $url): ?Metadata + public function resolveWithAcceptHeader(string $url): Metadata { try { // Rails等はAcceptに */* が入っていると、ブラウザの適当なAcceptヘッダだと判断して全部無視してしまう。 @@ -115,6 +118,6 @@ class MetadataResolver implements Resolver // 5xx は変なAcceptが原因かもしれない(?)ので無視してフォールバック } - return null; + throw new UnsupportedContentException(); } } diff --git a/app/MetadataResolver/UnsupportedContentException.php b/app/MetadataResolver/UnsupportedContentException.php new file mode 100644 index 0000000..6ca6ed3 --- /dev/null +++ b/app/MetadataResolver/UnsupportedContentException.php @@ -0,0 +1,12 @@ + Date: Tue, 20 Aug 2019 20:23:02 +0900 Subject: [PATCH 24/28] =?UTF-8?q?jakeasmith/http=5Fbuild=5Furl=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 1 + composer.lock | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 2c46aed..3b89d39 100644 --- a/composer.json +++ b/composer.json @@ -10,6 +10,7 @@ "doctrine/dbal": "^2.9", "fideloper/proxy": "~3.3", "guzzlehttp/guzzle": "^6.3", + "jakeasmith/http_build_url": "^1.0", "laravel/framework": "5.5.*", "laravel/tinker": "~1.0", "misd/linkify": "^1.1", diff --git a/composer.lock b/composer.lock index eaf81d3..fb352b4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "28abd730d4572663d10ae815393c73cd", + "content-hash": "b6dfb80c350a7276bb2513a1aeb3d602", "packages": [ { "name": "anhskohbo/no-captcha", @@ -806,6 +806,39 @@ ], "time": "2019-07-01T23:21:34+00:00" }, + { + "name": "jakeasmith/http_build_url", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/jakeasmith/http_build_url.git", + "reference": "93c273e77cb1edead0cf8bcf8cd2003428e74e37" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jakeasmith/http_build_url/zipball/93c273e77cb1edead0cf8bcf8cd2003428e74e37", + "reference": "93c273e77cb1edead0cf8bcf8cd2003428e74e37", + "shasum": "" + }, + "type": "library", + "autoload": { + "files": [ + "src/http_build_url.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jake A. Smith", + "email": "theman@jakeasmith.com" + } + ], + "description": "Provides functionality for http_build_url() to environments without pecl_http.", + "time": "2017-05-01T15:36:40+00:00" + }, { "name": "jakub-onderka/php-console-color", "version": "v0.2", From cdc6335a0687705b65f53eaba5ead73de1e7d77a Mon Sep 17 00:00:00 2001 From: eai04191 Date: Tue, 20 Aug 2019 23:07:15 +0900 Subject: [PATCH 25/28] =?UTF-8?q?HentaiFoundryResolver=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HentaiFoundryResolver.php | 56 +++ app/MetadataResolver/MetadataResolver.php | 1 + .../HentaiFoundryResolverTest.php | 36 ++ tests/fixture/HentaiFoundry/illust.html | 350 ++++++++++++++++++ 4 files changed, 443 insertions(+) create mode 100644 app/MetadataResolver/HentaiFoundryResolver.php create mode 100644 tests/Unit/MetadataResolver/HentaiFoundryResolverTest.php create mode 100644 tests/fixture/HentaiFoundry/illust.html diff --git a/app/MetadataResolver/HentaiFoundryResolver.php b/app/MetadataResolver/HentaiFoundryResolver.php new file mode 100644 index 0000000..87131a5 --- /dev/null +++ b/app/MetadataResolver/HentaiFoundryResolver.php @@ -0,0 +1,56 @@ +client = $client; + $this->ogpResolver = $ogpResolver; + } + + private function nbsp2space(string $string): string + { + return str_replace("\xc2\xa0", ' ', $string); + } + + private function br2nl(string $string): string + { + return str_replace('
', PHP_EOL, $string); + } + + public function resolve(string $url): Metadata + { + $res = $this->client->get( + http_build_url($url, ['query' => 'enterAgree=1']), + ['cookies' => new CookieJar()] + ); + + $metadata = new Metadata(); + $crawler = new Crawler((string) $res->getBody()); + + $author = $crawler->filter('#picBox .boxtitle a')->text(); + $description = trim(strip_tags($this->nbsp2space($this->br2nl($crawler->filter('.picDescript')->html())))); + + $metadata->title = $crawler->filter('#picBox .boxtitle .imageTitle')->text(); + $metadata->description = 'by ' . $author . PHP_EOL . $description; + $metadata->image = 'https:' . $crawler->filter('img[src^="//picture"]')->attr('src'); + $metadata->tags = $crawler->filter('a[rel="tag"]')->extract('_text'); + + return $metadata; + } +} diff --git a/app/MetadataResolver/MetadataResolver.php b/app/MetadataResolver/MetadataResolver.php index bb2ec08..e12f662 100644 --- a/app/MetadataResolver/MetadataResolver.php +++ b/app/MetadataResolver/MetadataResolver.php @@ -33,6 +33,7 @@ class MetadataResolver implements Resolver '~store\.steampowered\.com/app/\d+~' => SteamResolver::class, '~www\.xtube\.com/video-watch/.*-\d+$~'=> XtubeResolver::class, '~ss\.kb10uy\.org/posts/\d+$~' => Kb10uyShortStoryServerResolver::class, + '~www\.hentai-foundry\.com/pictures/user/.+/\d+/.+~'=> HentaiFoundryResolver::class, ]; public $mimeTypes = [ diff --git a/tests/Unit/MetadataResolver/HentaiFoundryResolverTest.php b/tests/Unit/MetadataResolver/HentaiFoundryResolverTest.php new file mode 100644 index 0000000..f781bb1 --- /dev/null +++ b/tests/Unit/MetadataResolver/HentaiFoundryResolverTest.php @@ -0,0 +1,36 @@ +shouldUseMock()) { + sleep(1); + } + } + + public function test() + { + $responseText = file_get_contents(__DIR__ . '/../../fixture/HentaiFoundry/illust.html'); + + $this->createResolver(HentaiFoundryResolver::class, $responseText); + + $metadata = $this->resolver->resolve('https://www.hentai-foundry.com/pictures/user/DevilHS/723498/Witchcraft'); + $this->assertSame('Witchcraft', $metadata->title); + $this->assertSame('by DevilHS' . PHP_EOL . 'gift for Liru', $metadata->description); + $this->assertEquals(['witch', 'futa'], $metadata->tags); + $this->assertSame('https://pictures.hentai-foundry.com/d/DevilHS/723498/DevilHS-723498-Witchcraft.png', $metadata->image); + if ($this->shouldUseMock()) { + $this->assertSame('https://www.hentai-foundry.com/pictures/user/DevilHS/723498/Witchcraft?enterAgree=1', (string) $this->handler->getLastRequest()->getUri()); + } + } +} diff --git a/tests/fixture/HentaiFoundry/illust.html b/tests/fixture/HentaiFoundry/illust.html new file mode 100644 index 0000000..fc5b11c --- /dev/null +++ b/tests/fixture/HentaiFoundry/illust.html @@ -0,0 +1,350 @@ + + + + + + + + + + + + + + + + + + + +Witchcraft by DevilHS - Hentai Foundry + + + + + + + + + + + + + + +
+ + + + + +
+
+ Username   + Password   + +
+ Remember +   Register   + |   Forgot your password? +
+
+
+ + +
+

Witchcraft

+

+ + +
+ + + +
+

Witchcraft

+
Witchcraft by DevilHS
+
+
+Witchcraft by DevilHS
+
+
+

Description

+
Description
+
+
+DevilHS
gift for Liru
+
+

General Info

+
General Info
+
+
+
+
+ + + + + + + +
Ratings
NSxTg
Comments 11
Category +Original » Futanari (Dickgirls) Media Digital drawing or painting
Date Submitted Time Taken
Views 20597 Reference
Favorites... 876 Keywords ,
Vote Score 649 License Berne Convention
+
+

Comments

+
Comments (11)
+
+
+

You are not authorized to comment here. Your must be registered and logged in to comment

+

Kessandra on August 15, 2019, 8:21:56 AM

+
Kessandra on
+
+
+
KessandraLooks like some beautiful magic is going on. 
+
+

TrueInsanity on July 28, 2019, 4:34:52 AM

+
TrueInsanity on
+
+
+
TrueInsanityOh hell yes
+
+

Kaze26 on July 27, 2019, 5:23:29 AM

+
Kaze26 on
+
+
+
Kaze26Spectacular
+
+

QuarterLife on July 25, 2019, 6:39:08 PM

+
QuarterLife on
+
+
+
QuarterLifeI'm curious as to what she's casting, is it to help her last longer or is it why she has a cock and balls?
+
+Either way it's a good picture, good job, nice tight.
+
+

DevilHS on July 25, 2019, 10:59:26 PM

+
DevilHS on
+
+
+
DevilHSShe casted herself a magic dick.
+
+

QuarterLife on July 26, 2019, 12:00:08 AM

+
QuarterLife on
+
+
+
QuarterLifeAh alright, not just a regular dick, but a magic dick, looks like a good dick too. :D
+
+

XSUBREADERX on July 25, 2019, 9:59:58 PM

+
XSUBREADERX on
+
+
+
XSUBREADERXVery Nice!
+
+

AceSR on July 25, 2019, 6:41:45 PM

+
AceSR on
+
+
+
AceSRNice gift
+
+

FloridasSonShines on July 25, 2019, 2:47:00 PM

+
FloridasSonShines on
+
+
+
FloridasSonShinesAwesome!
+
+

Kreegan on July 25, 2019, 12:39:04 PM

+
Kreegan on
+
+
+
KreeganGreat :D
+
+
+
+
+
+
+ +
+
Site Copyright © 2006-2019 All Rights Reserved
Site design by Sticky
+
Art and stories Copyright their artists/writers
+Series & Characters Copyright their respective creators/studios
+

All characters depicted are 18 or older, even if otherwise specified.

+ + ipv6 ready + +
+
+
+ + +
+
+ +
+ + + + \ No newline at end of file From 010a0a9c8fdd3592caf369dad593e3c272f3d802 Mon Sep 17 00:00:00 2001 From: eai04191 Date: Tue, 10 Dec 2019 13:12:37 +0900 Subject: [PATCH 26/28] =?UTF-8?q?=E8=8B=B1=E8=AA=9E=E7=89=88Pixiv=E3=81=AB?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/MetadataResolver/MetadataResolver.php | 2 +- app/MetadataResolver/PixivResolver.php | 4 ++-- .../Unit/MetadataResolver/PixivResolverTest.php | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/MetadataResolver/MetadataResolver.php b/app/MetadataResolver/MetadataResolver.php index bb2ec08..f1dca76 100644 --- a/app/MetadataResolver/MetadataResolver.php +++ b/app/MetadataResolver/MetadataResolver.php @@ -20,7 +20,7 @@ class MetadataResolver implements Resolver '~www\.dlsite\.com/.*/dlaf/=/aid/.+/url/.+~' => DLsiteResolver::class, '~dlsite\.jp/...tw/..\d+~' => DLsiteResolver::class, '~www\.pixiv\.net/member_illust\.php\?illust_id=\d+~' => PixivResolver::class, - '~www\.pixiv\.net/artworks/\d+~' => PixivResolver::class, + '~www\.pixiv\.net/(en/)?artworks/\d+~' => PixivResolver::class, '~www\.pixiv\.net/user/\d+/series/\d+~' => PixivResolver::class, '~fantia\.jp/posts/\d+~' => FantiaResolver::class, '~dmm\.co\.jp/~' => FanzaResolver::class, diff --git a/app/MetadataResolver/PixivResolver.php b/app/MetadataResolver/PixivResolver.php index e6690ac..c7435a8 100644 --- a/app/MetadataResolver/PixivResolver.php +++ b/app/MetadataResolver/PixivResolver.php @@ -45,8 +45,8 @@ class PixivResolver implements Resolver } $page = 0; - if (preg_match('~www\.pixiv\.net/artworks/(\d+)~', $url, $matches)) { - $illustId = $matches[1]; + if (preg_match('~www\.pixiv\.net/(en/)?artworks/(?P\d+)~', $url, $matches)) { + $illustId = $matches['illustId']; } else { parse_str(parse_url($url, PHP_URL_QUERY), $params); $illustId = $params['illust_id']; diff --git a/tests/Unit/MetadataResolver/PixivResolverTest.php b/tests/Unit/MetadataResolver/PixivResolverTest.php index df5e83a..5565b7c 100644 --- a/tests/Unit/MetadataResolver/PixivResolverTest.php +++ b/tests/Unit/MetadataResolver/PixivResolverTest.php @@ -81,4 +81,20 @@ class PixivResolverTest extends TestCase $this->assertSame('https://www.pixiv.net/ajax/illust/68188073', (string) $this->handler->getLastRequest()->getUri()); } } + + public function testArtworkUrlEn() + { + $responseText = file_get_contents(__DIR__ . '/../../fixture/Pixiv/illust.json'); + + $this->createResolver(PixivResolver::class, $responseText); + + $metadata = $this->resolver->resolve('https://www.pixiv.net/en/artworks/68188073'); + $this->assertEquals('coffee break', $metadata->title); + $this->assertEquals('投稿者: 裕' . PHP_EOL, $metadata->description); + $this->assertEquals('https://i.pixiv.cat/img-master/img/2018/04/12/00/01/28/68188073_p0_master1200.jpg', $metadata->image); + $this->assertEquals(['オリジナル', 'カフェ', '眼鏡', 'イヤホン', 'ぱっつん', '艶ぼくろ', '眼鏡っ娘', 'オリジナル5000users入り'], $metadata->tags); + if ($this->shouldUseMock()) { + $this->assertSame('https://www.pixiv.net/ajax/illust/68188073', (string) $this->handler->getLastRequest()->getUri()); + } + } } From 695f45750527a0418633f7a53beab6a49f98a218 Mon Sep 17 00:00:00 2001 From: shibafu Date: Wed, 11 Dec 2019 01:32:55 +0900 Subject: [PATCH 27/28] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=92?= =?UTF-8?q?=E3=81=97=E3=81=BE=E3=81=97=E3=82=87=E3=81=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/factories/EjaculationFactory.php | 12 +++++ database/factories/LikeFactory.php | 10 ++++ database/factories/ModelFactory.php | 24 --------- database/factories/UserFactory.php | 21 ++++++++ tests/Feature/SettingTest.php | 63 +++++++++++++++++++++++ 5 files changed, 106 insertions(+), 24 deletions(-) create mode 100644 database/factories/EjaculationFactory.php create mode 100644 database/factories/LikeFactory.php delete mode 100644 database/factories/ModelFactory.php create mode 100644 database/factories/UserFactory.php create mode 100644 tests/Feature/SettingTest.php diff --git a/database/factories/EjaculationFactory.php b/database/factories/EjaculationFactory.php new file mode 100644 index 0000000..65fbb6e --- /dev/null +++ b/database/factories/EjaculationFactory.php @@ -0,0 +1,12 @@ +define(Ejaculation::class, function (Faker $faker) { + return [ + 'ejaculated_date' => $faker->date('Y-m-d H:i:s'), + 'note' => $faker->text, + ]; +}); diff --git a/database/factories/LikeFactory.php b/database/factories/LikeFactory.php new file mode 100644 index 0000000..38e82a4 --- /dev/null +++ b/database/factories/LikeFactory.php @@ -0,0 +1,10 @@ +define(App\Like::class, function (Faker $faker) { + return [ + // + ]; +}); diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php deleted file mode 100644 index 7926c79..0000000 --- a/database/factories/ModelFactory.php +++ /dev/null @@ -1,24 +0,0 @@ -define(App\User::class, function (Faker\Generator $faker) { - static $password; - - return [ - 'name' => $faker->name, - 'email' => $faker->unique()->safeEmail, - 'password' => $password ?: $password = bcrypt('secret'), - 'remember_token' => str_random(10), - ]; -}); diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..fed18ec --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,21 @@ +define(App\User::class, function (Faker\Generator $faker) { + static $password; + + return [ + 'name' => substr($faker->userName, 0, 15), + 'email' => $faker->unique()->safeEmail, + 'password' => $password ?: $password = bcrypt('secret'), + 'remember_token' => str_random(10), + 'display_name' => substr($faker->name, 0, 20), + 'is_protected' => false, + 'accept_analytics' => false, + 'private_likes' => false, + ]; +}); + +$factory->state(App\User::class, 'protected', [ + 'is_protected' => true, +]); diff --git a/tests/Feature/SettingTest.php b/tests/Feature/SettingTest.php new file mode 100644 index 0000000..2cd2984 --- /dev/null +++ b/tests/Feature/SettingTest.php @@ -0,0 +1,63 @@ +create(); + $ejaculation = factory(Ejaculation::class)->create(['user_id' => $user->id]); + + $anotherUser = factory(User::class)->create(); + $anotherEjaculation = factory(Ejaculation::class)->create(['user_id' => $anotherUser->id]); + + $like = factory(Like::class)->create([ + 'user_id' => $user->id, + 'ejaculation_id' => $anotherEjaculation->id, + ]); + $anotherLike = factory(Like::class)->create([ + 'user_id' => $anotherUser->id, + 'ejaculation_id' => $ejaculation->id, + ]); + + $token = $this->getCsrfToken($user, '/setting/deactivate'); + $response = $this->actingAs($user) + ->followingRedirects() + ->post('/setting/deactivate', [ + '_token' => $token, + 'password' => 'secret', + ]); + + $response->assertStatus(200) + ->assertViewIs('setting.deactivated'); + $this->assertGuest(); + $this->assertDatabaseMissing('users', ['id' => $user->id]); + $this->assertDatabaseMissing('ejaculations', ['id' => $ejaculation->id]); + $this->assertDatabaseMissing('likes', ['id' => $like->id]); + $this->assertDatabaseMissing('likes', ['id' => $anotherLike->id]); + } + + /** + * テスト対象を呼び出す前にGETリクエストを行い、CSRFトークンを得る + * @param Authenticatable $user 認証情報 + * @param string $uri リクエスト先 + * @return string CSRFトークン + */ + private function getCsrfToken(Authenticatable $user, string $uri): string + { + $response = $this->actingAs($user)->get($uri); + $crawler = new Crawler($response->getContent()); + + return $crawler->filter('input[name=_token]')->attr('value'); + } +} From bba945113b5588671cc89accef1db4b0ae658960 Mon Sep 17 00:00:00 2001 From: shibafu Date: Wed, 11 Dec 2019 01:42:15 +0900 Subject: [PATCH 28/28] =?UTF-8?q?deactivated=5Fusers=E3=81=AB=E7=99=BB?= =?UTF-8?q?=E9=8C=B2=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=E3=82=8B=E3=81=93?= =?UTF-8?q?=E3=81=A8=E3=82=92=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=81=97?= =?UTF-8?q?=E5=BF=98=E3=82=8C=E3=81=A6=E3=81=84=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/Feature/SettingTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Feature/SettingTest.php b/tests/Feature/SettingTest.php index 2cd2984..c54fd84 100644 --- a/tests/Feature/SettingTest.php +++ b/tests/Feature/SettingTest.php @@ -45,6 +45,7 @@ class SettingTest extends TestCase $this->assertDatabaseMissing('ejaculations', ['id' => $ejaculation->id]); $this->assertDatabaseMissing('likes', ['id' => $like->id]); $this->assertDatabaseMissing('likes', ['id' => $anotherLike->id]); + $this->assertDatabaseHas('deactivated_users', ['name' => $user->name]); } /**