From 86c87dc1d5c18b4dc78412799f9c93773c8be375 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Mon, 16 Oct 2023 00:06:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=A6=96=E9=A1=B5=E5=8A=A8=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common/widgets/video_card_v.dart | 34 +++++++++++- lib/http/api.dart | 6 ++ lib/http/dynamics.dart | 31 +++++++++++ lib/http/html.dart | 82 +++++++++++++++++----------- lib/pages/html/view.dart | 2 +- 5 files changed, 121 insertions(+), 34 deletions(-) diff --git a/lib/common/widgets/video_card_v.dart b/lib/common/widgets/video_card_v.dart index 04f6ee3f..0c315f7b 100644 --- a/lib/common/widgets/video_card_v.dart +++ b/lib/common/widgets/video_card_v.dart @@ -5,6 +5,7 @@ import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/widgets/badge.dart'; import 'package:pilipala/common/widgets/stat/danmu.dart'; import 'package:pilipala/common/widgets/stat/view.dart'; +import 'package:pilipala/http/dynamics.dart'; import 'package:pilipala/http/search.dart'; import 'package:pilipala/http/user.dart'; import 'package:pilipala/models/common/search_type.dart'; @@ -27,6 +28,11 @@ class VideoCardV extends StatelessWidget { this.longPressEnd, }) : super(key: key); + bool isStringNumeric(String str) { + RegExp numericRegex = RegExp(r'^\d+$'); + return numericRegex.hasMatch(str); + } + void onPushDetail(heroTag) async { String goto = videoItem.goto; switch (goto) { @@ -64,11 +70,35 @@ class VideoCardV extends StatelessWidget { break; // 动态 case 'picture': + String dynamicType = 'picture'; + String uri = videoItem.uri; + if (videoItem.uri.contains('bilibili://article/')) { + dynamicType = 'article'; + RegExp regex = RegExp(r'\d+'); + Match match = regex.firstMatch(videoItem.uri)!; + String matchedNumber = match.group(0)!; + videoItem.param = 'cv' + matchedNumber; + } + if (uri.startsWith('http')) { + String path = Uri.parse(uri).path; + if (isStringNumeric(path.split('/')[1])) { + // 请求接口 + var res = await DynamicsHttp.dynamicDetail(id: path.split('/')[1]); + if (res['status']) { + Get.toNamed('/dynamicDetail', arguments: { + 'item': res['data'], + 'floor': 1, + 'action': 'detail' + }); + } + return; + } + } Get.toNamed('/htmlRender', parameters: { - 'url': videoItem.uri, + 'url': uri, 'title': videoItem.title, 'id': videoItem.param.toString(), - 'dynamicType': 'picture' + 'dynamicType': dynamicType }); break; default: diff --git a/lib/http/api.dart b/lib/http/api.dart index 50106dae..14f55319 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -321,4 +321,10 @@ class Api { // 获取指定分组下的up static const String followUpGroup = '/x/relation/tag'; + + // 获取某个动态详情 + // timezone_offset=-480 + // id=849312409672744983 + // features=itemOpusStyle + static const String dynamicDetail = '/x/polymer/web-dynamic/v1/detail'; } diff --git a/lib/http/dynamics.dart b/lib/http/dynamics.dart index da18cfa4..7a22ab13 100644 --- a/lib/http/dynamics.dart +++ b/lib/http/dynamics.dart @@ -86,4 +86,35 @@ class DynamicsHttp { }; } } + + // + static Future dynamicDetail({ + String? id, + }) async { + var res = await Request().get(Api.dynamicDetail, data: { + 'timezone_offset': -480, + 'id': id, + 'features': 'itemOpusStyle', + }); + if (res.data['code'] == 0) { + try { + return { + 'status': true, + 'data': DynamicItemModel.fromJson(res.data['data']['item']), + }; + } catch (err) { + return { + 'status': false, + 'data': [], + 'msg': err.toString(), + }; + } + } else { + return { + 'status': false, + 'data': [], + 'msg': res.data['message'], + }; + } + } } diff --git a/lib/http/html.dart b/lib/http/html.dart index 4a922e8f..41570d0a 100644 --- a/lib/http/html.dart +++ b/lib/http/html.dart @@ -9,37 +9,57 @@ class HtmlHttp { "https://www.bilibili.com/opus/$id", extra: {'ua': 'pc'}, ); - Document rootTree = parse(response.data); - Element body = rootTree.body!; - Element appDom = body.querySelector('#app')!; - Element authorHeader = appDom.querySelector('.fixed-author-header')!; - // 头像 - String avatar = authorHeader.querySelector('img')!.attributes['src']!; - avatar = 'https:${avatar.split('@')[0]}'; - String uname = - authorHeader.querySelector('.fixed-author-header__author__name')!.text; - // 动态详情 - Element opusDetail = appDom.querySelector('.opus-detail')!; - // 发布时间 - String updateTime = - opusDetail.querySelector('.opus-module-author__pub__text')!.text; - // - String opusContent = - opusDetail.querySelector('.opus-module-content')!.innerHtml; - String commentId = opusDetail - .querySelector('.bili-comment-container')! - .className - .split(' ')[1] - .split('-')[2]; - // List imgList = opusDetail.querySelectorAll('bili-album__preview__picture__img'); - return { - 'status': true, - 'avatar': avatar, - 'uname': uname, - 'updateTime': updateTime, - 'content': opusContent, - 'commentId': int.parse(commentId) - }; + + if (response.data.contains('Redirecting to')) { + RegExp regex = RegExp(r'//([\w\.]+)/(\w+)/(\w+)'); + Match match = regex.firstMatch(response.data)!; + String matchedString = match.group(0)!; + response = await Request().get( + 'https:$matchedString' + '/', + extra: {'ua': 'pc'}, + ); + } + try { + Document rootTree = parse(response.data); + // log(response.data.body.toString()); + Element body = rootTree.body!; + Element appDom = body.querySelector('#app')!; + Element authorHeader = appDom.querySelector('.fixed-author-header')!; + // 头像 + String avatar = authorHeader.querySelector('img')!.attributes['src']!; + avatar = 'https:${avatar.split('@')[0]}'; + String uname = authorHeader + .querySelector('.fixed-author-header__author__name')! + .text; + + // 动态详情 + Element opusDetail = appDom.querySelector('.opus-detail')!; + // 发布时间 + String updateTime = + opusDetail.querySelector('.opus-module-author__pub__text')!.text; + // + String opusContent = + opusDetail.querySelector('.opus-module-content')!.innerHtml; + String test = opusDetail + .querySelector('.horizontal-scroll-album__pic__img')! + .innerHtml; + String commentId = opusDetail + .querySelector('.bili-comment-container')! + .className + .split(' ')[1] + .split('-')[2]; + // List imgList = opusDetail.querySelectorAll('bili-album__preview__picture__img'); + return { + 'status': true, + 'avatar': avatar, + 'uname': uname, + 'updateTime': updateTime, + 'content': test + opusContent, + 'commentId': int.parse(commentId) + }; + } catch (err) { + print('err: $err'); + } } // read diff --git a/lib/pages/html/view.dart b/lib/pages/html/view.dart index d5e4556d..64fabff8 100644 --- a/lib/pages/html/view.dart +++ b/lib/pages/html/view.dart @@ -139,7 +139,7 @@ class _HtmlRenderPageState extends State IconButton( onPressed: () { Get.toNamed('/webview', parameters: { - 'url': 'https:$url', + 'url': url.startsWith('http') ? url : 'https:$url', 'type': 'url', 'pageTitle': title, });