From 1d74714e6e87af40682155180db936793456e6c1 Mon Sep 17 00:00:00 2001 From: wanxp <977741432@qq.com> Date: Thu, 16 May 2024 01:51:29 +0800 Subject: [PATCH] fix fetch data error --- manifest.json | 2 +- package.json | 2 +- .../data/handler/DoubanAbstractLoadHandler.ts | 8 ++ .../AllFirstPageSearchResultPageParser.ts | 8 ++ src/org/wanxp/net/NetFileHandler.ts | 13 +++ src/org/wanxp/utils/HttpUtil.ts | 9 ++ src/org/wanxp/utils/StringUtil.ts | 8 ++ .../wanxp/utils/desktop/DesktopHttpUtil.ts | 107 ++++++++++-------- versions.json | 3 +- 9 files changed, 110 insertions(+), 50 deletions(-) diff --git a/manifest.json b/manifest.json index 5474814..3d2d650 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-douban-plugin", "name": "Douban", - "version": "2.0.3", + "version": "2.0.4", "minAppVersion": "0.12.0", "description": "This is a plugin that can import movies/books/musics/notes/games info data from Douban for Obsidian .", "author": "Wanxp", diff --git a/package.json b/package.json index 3733c58..18d0061 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-douban-plugin", - "version": "2.0.3", + "version": "2.0.4", "description": "This is a plugin for Obsidian (https://obsidian.md) that can import data from Douban (https://www.douban.com/).", "main": "main.js", "scripts": { diff --git a/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts index 3ae2961..209fd2f 100644 --- a/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts @@ -34,6 +34,7 @@ import {VariableUtil} from "../../../utils/VariableUtil"; import {DataField} from "../../../utils/model/DataField"; import NumberUtil from "../../../utils/NumberUtil"; import {DoubanHttpUtil} from "../../../utils/DoubanHttpUtil"; +import {logger} from "bs-logger"; export default abstract class DoubanAbstractLoadHandler implements DoubanSubjectLoadHandler { @@ -533,6 +534,13 @@ export default abstract class DoubanAbstractLoadHandler private async handleImage(image: string, folder: string, filename: string, context: HandleContext, showError: boolean, headers?: any) { if (context.settings.pictureBedFlag) { + //临时限定只支持PicGo + const checked = await context.netFileHandler.downloadDBUploadPicGoByClipboardBefore(context); + if (!checked) { + //TODO 国际化 + log.notice('未检测到PicGo软件, 请检查是否已开启PicGo的Server服务或者检查插件中配置地址是否正确,现使用默认的下载到本地的方式'); + return await context.netFileHandler.downloadDBFile(image, folder, filename, context, false, headers); + } return await context.netFileHandler.downloadDBUploadPicGoByClipboard(image, filename, context, showError, headers); }else { return await context.netFileHandler.downloadDBFile(image, folder, filename, context, false, headers); diff --git a/src/org/wanxp/douban/data/search/parser/AllFirstPageSearchResultPageParser.ts b/src/org/wanxp/douban/data/search/parser/AllFirstPageSearchResultPageParser.ts index 2b6545a..a925f74 100644 --- a/src/org/wanxp/douban/data/search/parser/AllFirstPageSearchResultPageParser.ts +++ b/src/org/wanxp/douban/data/search/parser/AllFirstPageSearchResultPageParser.ts @@ -2,12 +2,20 @@ import {SupportType} from "../../../../constant/Constsant"; import {SearchResultPageParserInterface} from "./SearchResultPageParserInterface"; import {SearchPage} from "../../model/SearchPage"; import SearchParserHandlerV2 from "../SearchParserV2"; +import StringUtil from "../../../../utils/StringUtil"; +import {log} from "../../../../utils/Logutil"; export class AllFirstPageSearchResultPageParser implements SearchResultPageParserInterface { support(type:SupportType, pageNum:number):boolean { return pageNum == 1 && type == SupportType.ALL; } parse(source:string, type:SupportType, pageNum:number, pageSize:number):SearchPage { + if (!source || StringUtil.notJsonString(source)) { + //TODO 国际化 + log.notice("Obsidian-Douban:查询结果为空,无匹配结果,请尝试登录获取获取更多数据(已登录则忽略)"); + return SearchPage.empty(type); + } + const {subjects} = JSON.parse(source); if (!subjects) { return SearchPage.empty(type); diff --git a/src/org/wanxp/net/NetFileHandler.ts b/src/org/wanxp/net/NetFileHandler.ts index 37960ca..1e508e6 100644 --- a/src/org/wanxp/net/NetFileHandler.ts +++ b/src/org/wanxp/net/NetFileHandler.ts @@ -83,6 +83,19 @@ export default class NetFileHandler { const data = response.textJson as ResultI; return data; } + + async downloadDBUploadPicGoByClipboardBefore(context: HandleContext) { + //临时限定只支持PicGo + try { + const response = await HttpUtil.httpRequest( + HttpUtil.replaceUrlPath(context.settings.pictureBedSetting.url, 'heartbeat'), {}, context.plugin.settingsManager, {method: "post"}); + const data = response.textJson as ResultI; + return data? data.success: false; + }catch (e) { + return false; + } + + } } diff --git a/src/org/wanxp/utils/HttpUtil.ts b/src/org/wanxp/utils/HttpUtil.ts index d07526a..2e2564b 100644 --- a/src/org/wanxp/utils/HttpUtil.ts +++ b/src/org/wanxp/utils/HttpUtil.ts @@ -77,6 +77,15 @@ export default class HttpUtil { throw new Error('Invalid URL'); } + public static replaceUrlPath(url: string, newPath: string): string { + const regex = /^(https?:\/\/[^\/]+)(:\d+)?(\/.*)$/; + const matches = url.match(regex); + if (matches && matches.length === 4) { + return matches[1] + (matches[2] || '') + newPath; + } + return url; + } + /** * 提取url * @param str diff --git a/src/org/wanxp/utils/StringUtil.ts b/src/org/wanxp/utils/StringUtil.ts index e9230bc..7171866 100644 --- a/src/org/wanxp/utils/StringUtil.ts +++ b/src/org/wanxp/utils/StringUtil.ts @@ -109,6 +109,14 @@ export default class StringUtil { } + public static notJsonString(str: string) { + try { + JSON.parse(str); + return false; + } catch (error) { + return true; + } + } } export const EscapeMap:Map< { [Symbol.replace](string: string, replaceValue: string): string; }, string> = new Map([ diff --git a/src/org/wanxp/utils/desktop/DesktopHttpUtil.ts b/src/org/wanxp/utils/desktop/DesktopHttpUtil.ts index fb7b607..e863fb2 100644 --- a/src/org/wanxp/utils/desktop/DesktopHttpUtil.ts +++ b/src/org/wanxp/utils/desktop/DesktopHttpUtil.ts @@ -5,8 +5,8 @@ import DoubanHumanCheckModel from "../../douban/component/DoubanHumanCheckModel" import HttpUtil from "../HttpUtil"; import {HttpResponse} from "../model/HttpResponse"; -var https:any = null; -var http:any = null; +var https: any = null; +var http: any = null; export default class DesktopHttpUtil { @@ -29,7 +29,7 @@ export default class DesktopHttpUtil { }) } - private static httpRequest(url: string, options: any, times:number, resolve:any, rejects:any, settingsManager?: SettingsManager) { + private static httpRequest(url: string, options: any, times: number, resolve: any, rejects: any, settingsManager?: SettingsManager) { settingsManager.debug(`Obsidian-Douban:从网络获取json开始:\nurl:${url}\nheaders:${JSON.stringify(options)}`); var method = options.method; @@ -48,56 +48,69 @@ export default class DesktopHttpUtil { 'Content-Type': 'application/json' } }; + let req = null; + try { - const req = DesktopHttpUtil.getHttpClient(url).request(optionsInner, function (response: any) { - let chunks: any = [], - size = 0; - if (settingsManager) { - settingsManager.debug(`Obsidian-Douban:从网络获取JSON完成${times}:url:\n${url}`); - settingsManager.debug(`Obsidian-Douban:从网络获取JSON完成${times}:header:\n${JSON.stringify(response.headers)}`); - settingsManager.debug(`Obsidian-Douban:从网络获取JSON完成${times}:body:\n${response.text}`); - } + req = DesktopHttpUtil.getHttpClient(url).request(optionsInner, function (response: any) { + let chunks: any = [], + size = 0; + if (settingsManager) { + settingsManager.debug(`Obsidian-Douban:从网络获取JSON完成${times}:url:\n${url}`); + settingsManager.debug(`Obsidian-Douban:从网络获取JSON完成${times}:header:\n${JSON.stringify(response.headers)}`); + settingsManager.debug(`Obsidian-Douban:从网络获取JSON完成${times}:body:\n${response.text}`); + } - response.on("data", function (chunk: any) { - chunks.push(chunk) - size += chunk.length - }) + response.on("data", function (chunk: any) { + chunks.push(chunk) + size += chunk.length + }) - response.on("end", function () { - const data = Buffer.concat(chunks, size) - const html = data.toString() - resolve(new HttpResponse(response.statusCode, response.headers, html)) - }) - }); - const body = options.body; - if (body) { - req.write(body); - }else { - req.write(''); + response.on("end", function () { + const data = Buffer.concat(chunks, size) + const html = data.toString() + resolve(new HttpResponse(response.statusCode, response.headers, html)) + }) + }); + } catch (e) { + rejects(e); } - req.end(); - }else { - this.getHttpClient(url).get(url, { ...options }, function (response:any) { - let chunks: any = [], - size = 0; - if (settingsManager) { - settingsManager.debug(`Obsidian-Douban:从网络获取JSON完成${times}:url:\n${url}`); - settingsManager.debug(`Obsidian-Douban:从网络获取JSON完成${times}:header:\n${JSON.stringify(response.headers)}`); - settingsManager.debug(`Obsidian-Douban:从网络获取JSON完成${times}:body:\n${response.text}`); + if (req) { + const body = options.body; + if (body) { + req.write(body); + } else { + req.write(''); } + req.end(); + } + } else { + try { - response.on("data", function (chunk: any) { - chunks.push(chunk) - size += chunk.length - }) + this.getHttpClient(url).get(url, {...options}, function (response: any) { + let chunks: any = [], + size = 0; + if (settingsManager) { + settingsManager.debug(`Obsidian-Douban:从网络获取JSON完成${times}:url:\n${url}`); + settingsManager.debug(`Obsidian-Douban:从网络获取JSON完成${times}:header:\n${JSON.stringify(response.headers)}`); + settingsManager.debug(`Obsidian-Douban:从网络获取JSON完成${times}:body:\n${response.text}`); + } - response.on("end", function () { - const data = Buffer.concat(chunks, size) - const html = data.toString() - resolve(new HttpResponse(response.statusCode, response.headers, html)) - }) - }); + response.on("data", function (chunk: any) { + chunks.push(chunk) + size += chunk.length + }) + + response.on("end", function () { + const data = Buffer.concat(chunks, size) + const html = data.toString() + resolve(new HttpResponse(response.statusCode, response.headers, html)) + }) + }); + } catch (e) { + rejects(e); + } } + } private static getHttpClient(url?: string) { @@ -106,7 +119,7 @@ export default class DesktopHttpUtil { https = require("follow-redirects").https; } return https; - }else { + } else { if (!http) { http = require("follow-redirects").http; } @@ -131,7 +144,7 @@ export default class DesktopHttpUtil { }) } - private static httpRequestGetBufferInner(url: string, options: any, times:number, resolve:any, rejects:any, settingsManager?: SettingsManager) { + private static httpRequestGetBufferInner(url: string, options: any, times: number, resolve: any, rejects: any, settingsManager?: SettingsManager) { if (settingsManager) { settingsManager.debug(`Obsidian-Douban:从网络获取文件开始:\n${url}\nheaders:${JSON.stringify(options)}`); diff --git a/versions.json b/versions.json index 9a5b569..2ecd29c 100644 --- a/versions.json +++ b/versions.json @@ -48,6 +48,7 @@ "2.0.0": "0.12.0", "2.0.1": "0.12.0", "2.0.2": "0.12.0", - "2.0.3": "0.12.0" + "2.0.3": "0.12.0", + "2.0.4": "0.12.0" }