paper-search-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +165 -0
- package/LICENSE +21 -0
- package/README-sc.md +642 -0
- package/README.md +642 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +637 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/ConfigService.d.ts +26 -0
- package/dist/config/ConfigService.d.ts.map +1 -0
- package/dist/config/ConfigService.js +145 -0
- package/dist/config/ConfigService.js.map +1 -0
- package/dist/config/constants.d.ts +140 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +93 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/core/diagnostics.d.ts +43 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +544 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/handleToolCall.d.ts +8 -0
- package/dist/core/handleToolCall.d.ts.map +1 -0
- package/dist/core/handleToolCall.js +440 -0
- package/dist/core/handleToolCall.js.map +1 -0
- package/dist/core/schemas.d.ts +454 -0
- package/dist/core/schemas.d.ts.map +1 -0
- package/dist/core/schemas.js +322 -0
- package/dist/core/schemas.js.map +1 -0
- package/dist/core/searchers.d.ts +45 -0
- package/dist/core/searchers.d.ts.map +1 -0
- package/dist/core/searchers.js +73 -0
- package/dist/core/searchers.js.map +1 -0
- package/dist/core/tools.d.ts +7 -0
- package/dist/core/tools.d.ts.map +1 -0
- package/dist/core/tools.js +640 -0
- package/dist/core/tools.js.map +1 -0
- package/dist/models/Paper.d.ts +64 -0
- package/dist/models/Paper.d.ts.map +1 -0
- package/dist/models/Paper.js +70 -0
- package/dist/models/Paper.js.map +1 -0
- package/dist/platforms/ArxivSearcher.d.ts +64 -0
- package/dist/platforms/ArxivSearcher.d.ts.map +1 -0
- package/dist/platforms/ArxivSearcher.js +531 -0
- package/dist/platforms/ArxivSearcher.js.map +1 -0
- package/dist/platforms/BioRxivSearcher.d.ts +47 -0
- package/dist/platforms/BioRxivSearcher.d.ts.map +1 -0
- package/dist/platforms/BioRxivSearcher.js +196 -0
- package/dist/platforms/BioRxivSearcher.js.map +1 -0
- package/dist/platforms/CORESearcher.d.ts +16 -0
- package/dist/platforms/CORESearcher.d.ts.map +1 -0
- package/dist/platforms/CORESearcher.js +148 -0
- package/dist/platforms/CORESearcher.js.map +1 -0
- package/dist/platforms/CrossrefSearcher.d.ts +34 -0
- package/dist/platforms/CrossrefSearcher.d.ts.map +1 -0
- package/dist/platforms/CrossrefSearcher.js +339 -0
- package/dist/platforms/CrossrefSearcher.js.map +1 -0
- package/dist/platforms/EuropePMCSearcher.d.ts +20 -0
- package/dist/platforms/EuropePMCSearcher.d.ts.map +1 -0
- package/dist/platforms/EuropePMCSearcher.js +173 -0
- package/dist/platforms/EuropePMCSearcher.js.map +1 -0
- package/dist/platforms/GoogleScholarSearcher.d.ts +77 -0
- package/dist/platforms/GoogleScholarSearcher.d.ts.map +1 -0
- package/dist/platforms/GoogleScholarSearcher.js +262 -0
- package/dist/platforms/GoogleScholarSearcher.js.map +1 -0
- package/dist/platforms/IACRSearcher.d.ts +51 -0
- package/dist/platforms/IACRSearcher.d.ts.map +1 -0
- package/dist/platforms/IACRSearcher.js +339 -0
- package/dist/platforms/IACRSearcher.js.map +1 -0
- package/dist/platforms/OpenAIRESearcher.d.ts +22 -0
- package/dist/platforms/OpenAIRESearcher.d.ts.map +1 -0
- package/dist/platforms/OpenAIRESearcher.js +223 -0
- package/dist/platforms/OpenAIRESearcher.js.map +1 -0
- package/dist/platforms/OpenAlexSearcher.d.ts +14 -0
- package/dist/platforms/OpenAlexSearcher.d.ts.map +1 -0
- package/dist/platforms/OpenAlexSearcher.js +114 -0
- package/dist/platforms/OpenAlexSearcher.js.map +1 -0
- package/dist/platforms/PMCSearcher.d.ts +20 -0
- package/dist/platforms/PMCSearcher.d.ts.map +1 -0
- package/dist/platforms/PMCSearcher.js +177 -0
- package/dist/platforms/PMCSearcher.js.map +1 -0
- package/dist/platforms/PaperSource.d.ts +143 -0
- package/dist/platforms/PaperSource.d.ts.map +1 -0
- package/dist/platforms/PaperSource.js +125 -0
- package/dist/platforms/PaperSource.js.map +1 -0
- package/dist/platforms/PubMedSearcher.d.ts +104 -0
- package/dist/platforms/PubMedSearcher.d.ts.map +1 -0
- package/dist/platforms/PubMedSearcher.js +422 -0
- package/dist/platforms/PubMedSearcher.js.map +1 -0
- package/dist/platforms/SciHubSearcher.d.ts +66 -0
- package/dist/platforms/SciHubSearcher.d.ts.map +1 -0
- package/dist/platforms/SciHubSearcher.js +398 -0
- package/dist/platforms/SciHubSearcher.js.map +1 -0
- package/dist/platforms/ScienceDirectSearcher.d.ts +42 -0
- package/dist/platforms/ScienceDirectSearcher.d.ts.map +1 -0
- package/dist/platforms/ScienceDirectSearcher.js +326 -0
- package/dist/platforms/ScienceDirectSearcher.js.map +1 -0
- package/dist/platforms/ScopusSearcher.d.ts +43 -0
- package/dist/platforms/ScopusSearcher.d.ts.map +1 -0
- package/dist/platforms/ScopusSearcher.js +364 -0
- package/dist/platforms/ScopusSearcher.js.map +1 -0
- package/dist/platforms/SemanticScholarSearcher.d.ts +96 -0
- package/dist/platforms/SemanticScholarSearcher.d.ts.map +1 -0
- package/dist/platforms/SemanticScholarSearcher.js +419 -0
- package/dist/platforms/SemanticScholarSearcher.js.map +1 -0
- package/dist/platforms/SpringerSearcher.d.ts +54 -0
- package/dist/platforms/SpringerSearcher.d.ts.map +1 -0
- package/dist/platforms/SpringerSearcher.js +407 -0
- package/dist/platforms/SpringerSearcher.js.map +1 -0
- package/dist/platforms/UnpaywallSearcher.d.ts +18 -0
- package/dist/platforms/UnpaywallSearcher.d.ts.map +1 -0
- package/dist/platforms/UnpaywallSearcher.js +115 -0
- package/dist/platforms/UnpaywallSearcher.js.map +1 -0
- package/dist/platforms/WebOfScienceSearcher.d.ts +111 -0
- package/dist/platforms/WebOfScienceSearcher.d.ts.map +1 -0
- package/dist/platforms/WebOfScienceSearcher.js +500 -0
- package/dist/platforms/WebOfScienceSearcher.js.map +1 -0
- package/dist/platforms/WileySearcher.d.ts +44 -0
- package/dist/platforms/WileySearcher.d.ts.map +1 -0
- package/dist/platforms/WileySearcher.js +148 -0
- package/dist/platforms/WileySearcher.js.map +1 -0
- package/dist/services/CitationService.d.ts +66 -0
- package/dist/services/CitationService.d.ts.map +1 -0
- package/dist/services/CitationService.js +237 -0
- package/dist/services/CitationService.js.map +1 -0
- package/dist/services/MultiSourceSearchService.d.ts +19 -0
- package/dist/services/MultiSourceSearchService.d.ts.map +1 -0
- package/dist/services/MultiSourceSearchService.js +96 -0
- package/dist/services/MultiSourceSearchService.js.map +1 -0
- package/dist/services/OpenAccessFallbackService.d.ts +20 -0
- package/dist/services/OpenAccessFallbackService.d.ts.map +1 -0
- package/dist/services/OpenAccessFallbackService.js +124 -0
- package/dist/services/OpenAccessFallbackService.js.map +1 -0
- package/dist/utils/ErrorHandler.d.ts +99 -0
- package/dist/utils/ErrorHandler.d.ts.map +1 -0
- package/dist/utils/ErrorHandler.js +266 -0
- package/dist/utils/ErrorHandler.js.map +1 -0
- package/dist/utils/Logger.d.ts +6 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +26 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/PDFExtractor.d.ts +34 -0
- package/dist/utils/PDFExtractor.d.ts.map +1 -0
- package/dist/utils/PDFExtractor.js +130 -0
- package/dist/utils/PDFExtractor.js.map +1 -0
- package/dist/utils/PdfDownload.d.ts +7 -0
- package/dist/utils/PdfDownload.d.ts.map +1 -0
- package/dist/utils/PdfDownload.js +52 -0
- package/dist/utils/PdfDownload.js.map +1 -0
- package/dist/utils/QuotaManager.d.ts +32 -0
- package/dist/utils/QuotaManager.d.ts.map +1 -0
- package/dist/utils/QuotaManager.js +95 -0
- package/dist/utils/QuotaManager.js.map +1 -0
- package/dist/utils/RateLimiter.d.ts +50 -0
- package/dist/utils/RateLimiter.d.ts.map +1 -0
- package/dist/utils/RateLimiter.js +121 -0
- package/dist/utils/RateLimiter.js.map +1 -0
- package/dist/utils/RequestCache.d.ts +26 -0
- package/dist/utils/RequestCache.d.ts.map +1 -0
- package/dist/utils/RequestCache.js +66 -0
- package/dist/utils/RequestCache.js.map +1 -0
- package/dist/utils/SecurityUtils.d.ts +80 -0
- package/dist/utils/SecurityUtils.d.ts.map +1 -0
- package/dist/utils/SecurityUtils.js +357 -0
- package/dist/utils/SecurityUtils.js.map +1 -0
- package/package.json +111 -0
- package/skills/paper-search/SKILL.md +192 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web of Science API集成模块
|
|
3
|
+
* 支持 Web of Science Starter API 和 Web of Science Researcher API
|
|
4
|
+
*/
|
|
5
|
+
import { Paper } from '../models/Paper.js';
|
|
6
|
+
import { PaperSource, SearchOptions, DownloadOptions, PlatformCapabilities } from './PaperSource.js';
|
|
7
|
+
interface WoSSearchOptions extends SearchOptions {
|
|
8
|
+
/** 数据库选择 */
|
|
9
|
+
databases?: string[];
|
|
10
|
+
/** 文档类型过滤 (Article, Review, etc.) */
|
|
11
|
+
documentTypes?: string[];
|
|
12
|
+
/** 语言过滤 */
|
|
13
|
+
languages?: string[];
|
|
14
|
+
/** ISSN/ISBN过滤 */
|
|
15
|
+
issn?: string;
|
|
16
|
+
/** 卷号过滤 */
|
|
17
|
+
volume?: string;
|
|
18
|
+
/** 页码过滤 */
|
|
19
|
+
page?: string;
|
|
20
|
+
/** 期号过滤 */
|
|
21
|
+
issue?: string;
|
|
22
|
+
/** PubMed ID过滤 */
|
|
23
|
+
pmid?: string;
|
|
24
|
+
/** DOI过滤 */
|
|
25
|
+
doi?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare class WebOfScienceSearcher extends PaperSource {
|
|
28
|
+
private apiUrl;
|
|
29
|
+
private apiVersion;
|
|
30
|
+
private fallbackAttempted;
|
|
31
|
+
private readonly preferredVersion;
|
|
32
|
+
private readonly rateLimiter;
|
|
33
|
+
private readonly quotaManager;
|
|
34
|
+
constructor(apiKey?: string, apiVersion?: string);
|
|
35
|
+
/**
|
|
36
|
+
* Switch to fallback API version (v2 -> v1 or v1 -> v2)
|
|
37
|
+
*/
|
|
38
|
+
private switchToFallbackVersion;
|
|
39
|
+
/**
|
|
40
|
+
* Reset fallback state (call after successful request)
|
|
41
|
+
* This allows the next request to try the preferred version first
|
|
42
|
+
*/
|
|
43
|
+
private resetFallbackState;
|
|
44
|
+
getCapabilities(): PlatformCapabilities;
|
|
45
|
+
/**
|
|
46
|
+
* 获取论文的参考文献ID列表
|
|
47
|
+
*/
|
|
48
|
+
getReferenceIds(uid: string): Promise<string[]>;
|
|
49
|
+
/**
|
|
50
|
+
* 获取引用此论文的文献ID列表
|
|
51
|
+
*/
|
|
52
|
+
getCitationIds(uid: string): Promise<string[]>;
|
|
53
|
+
/**
|
|
54
|
+
* 获取论文详情(包含references和citations ID列表)
|
|
55
|
+
*/
|
|
56
|
+
getPaperWithCitations(uid: string): Promise<Paper | null>;
|
|
57
|
+
/**
|
|
58
|
+
* 搜索Web of Science论文
|
|
59
|
+
*/
|
|
60
|
+
search(query: string, options?: WoSSearchOptions): Promise<Paper[]>;
|
|
61
|
+
/**
|
|
62
|
+
* Web of Science 通常不支持直接PDF下载
|
|
63
|
+
*/
|
|
64
|
+
downloadPdf(paperId: string, options?: DownloadOptions): Promise<string>;
|
|
65
|
+
/**
|
|
66
|
+
* Web of Science 通常不提供全文内容
|
|
67
|
+
*/
|
|
68
|
+
readPaper(paperId: string, options?: DownloadOptions): Promise<string>;
|
|
69
|
+
/**
|
|
70
|
+
* 根据DOI获取论文详细信息
|
|
71
|
+
*/
|
|
72
|
+
getPaperByDoi(doi: string): Promise<Paper | null>;
|
|
73
|
+
/**
|
|
74
|
+
* 获取论文被引统计
|
|
75
|
+
*/
|
|
76
|
+
getCitationCount(paperId: string): Promise<number>;
|
|
77
|
+
/**
|
|
78
|
+
* 构建搜索查询参数
|
|
79
|
+
*/
|
|
80
|
+
private buildSearchQuery;
|
|
81
|
+
/**
|
|
82
|
+
* 构建WOS格式的查询字符串
|
|
83
|
+
*/
|
|
84
|
+
private buildWosQuery;
|
|
85
|
+
/**
|
|
86
|
+
* 转义WOS查询中的特殊字符
|
|
87
|
+
*/
|
|
88
|
+
private escapeWosQuery;
|
|
89
|
+
/**
|
|
90
|
+
* 映射排序字段到WOS API格式
|
|
91
|
+
*/
|
|
92
|
+
private mapSortField;
|
|
93
|
+
/**
|
|
94
|
+
* 解析搜索响应
|
|
95
|
+
*/
|
|
96
|
+
private parseSearchResponse;
|
|
97
|
+
/**
|
|
98
|
+
* 解析单个WoS记录
|
|
99
|
+
*/
|
|
100
|
+
private parseWoSRecord;
|
|
101
|
+
/**
|
|
102
|
+
* 发起API请求 - 支持自动版本降级
|
|
103
|
+
*/
|
|
104
|
+
private makeApiRequest;
|
|
105
|
+
/**
|
|
106
|
+
* 验证API密钥
|
|
107
|
+
*/
|
|
108
|
+
validateApiKey(): Promise<boolean>;
|
|
109
|
+
}
|
|
110
|
+
export {};
|
|
111
|
+
//# sourceMappingURL=WebOfScienceSearcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebOfScienceSearcher.d.ts","sourceRoot":"","sources":["../../src/platforms/WebOfScienceSearcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,EAAgB,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAQrG,UAAU,gBAAiB,SAAQ,aAAa;IAC9C,YAAY;IACZ,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW;IACX,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAoDD,qBAAa,oBAAqB,SAAQ,WAAW;IACnD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;gBAEhC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IA0BhD;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAe/B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAU1B,eAAe,IAAI,oBAAoB;IAWvC;;OAEG;IACG,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBrD;;OAEG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBpD;;OAEG;IACG,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IA8B/D;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAkB7E;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAI9E;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5E;;OAEG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAWvD;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBxD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACH,OAAO,CAAC,aAAa;IA8FrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAUtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;OAEG;IACH,OAAO,CAAC,cAAc;IA0DtB;;OAEG;YACW,cAAc;IAuE5B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAezC"}
|
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web of Science API集成模块
|
|
3
|
+
* 支持 Web of Science Starter API 和 Web of Science Researcher API
|
|
4
|
+
*/
|
|
5
|
+
import axios from 'axios';
|
|
6
|
+
import { PaperFactory } from '../models/Paper.js';
|
|
7
|
+
import { PaperSource } from './PaperSource.js';
|
|
8
|
+
import { escapeQueryValue, validateQueryComplexity } from '../utils/SecurityUtils.js';
|
|
9
|
+
import { RateLimiter } from '../utils/RateLimiter.js';
|
|
10
|
+
import { ErrorHandler } from '../utils/ErrorHandler.js';
|
|
11
|
+
import { QuotaManager } from '../utils/QuotaManager.js';
|
|
12
|
+
import { TIMEOUTS, USER_AGENT } from '../config/constants.js';
|
|
13
|
+
import { logDebug, logWarn } from '../utils/Logger.js';
|
|
14
|
+
export class WebOfScienceSearcher extends PaperSource {
|
|
15
|
+
apiUrl;
|
|
16
|
+
apiVersion;
|
|
17
|
+
fallbackAttempted = false;
|
|
18
|
+
preferredVersion;
|
|
19
|
+
rateLimiter;
|
|
20
|
+
quotaManager;
|
|
21
|
+
constructor(apiKey, apiVersion) {
|
|
22
|
+
super('webofscience', 'https://api.clarivate.com/apis', apiKey);
|
|
23
|
+
// Priority: constructor param > env var > default 'v2'
|
|
24
|
+
this.preferredVersion = apiVersion || process.env.WOS_API_VERSION || 'v2';
|
|
25
|
+
this.apiVersion = this.preferredVersion;
|
|
26
|
+
this.apiUrl = `${this.baseUrl}/wos-starter/${this.apiVersion}`;
|
|
27
|
+
const rpsEnv = Number(process.env.WOS_RPS);
|
|
28
|
+
const requestsPerSecond = Number.isFinite(rpsEnv) && rpsEnv > 0 ? rpsEnv : 5;
|
|
29
|
+
const burstEnv = Number(process.env.WOS_BURST);
|
|
30
|
+
const burstCapacity = Number.isFinite(burstEnv) && burstEnv > 0 ? burstEnv : requestsPerSecond;
|
|
31
|
+
this.rateLimiter = new RateLimiter({
|
|
32
|
+
requestsPerSecond,
|
|
33
|
+
burstCapacity,
|
|
34
|
+
debug: process.env.NODE_ENV === 'development'
|
|
35
|
+
});
|
|
36
|
+
this.quotaManager = QuotaManager.getInstance();
|
|
37
|
+
this.quotaManager.registerPlatform('webofscience', {
|
|
38
|
+
dailyLimit: 5000,
|
|
39
|
+
envPrefix: 'WOS'
|
|
40
|
+
});
|
|
41
|
+
logDebug(`WoS API URL: ${this.apiUrl} (preferred: ${this.preferredVersion})`);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Switch to fallback API version (v2 -> v1 or v1 -> v2)
|
|
45
|
+
*/
|
|
46
|
+
switchToFallbackVersion() {
|
|
47
|
+
if (this.fallbackAttempted) {
|
|
48
|
+
return false; // Already tried fallback
|
|
49
|
+
}
|
|
50
|
+
const fallbackVersion = this.apiVersion === 'v2' ? 'v1' : 'v2';
|
|
51
|
+
logWarn(`WoS API ${this.apiVersion} failed, switching to ${fallbackVersion}`);
|
|
52
|
+
this.apiVersion = fallbackVersion;
|
|
53
|
+
this.apiUrl = `${this.baseUrl}/wos-starter/${this.apiVersion}`;
|
|
54
|
+
this.fallbackAttempted = true;
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Reset fallback state (call after successful request)
|
|
59
|
+
* This allows the next request to try the preferred version first
|
|
60
|
+
*/
|
|
61
|
+
resetFallbackState() {
|
|
62
|
+
// Always reset on success, so next request can try preferred version
|
|
63
|
+
if (this.fallbackAttempted && this.apiVersion !== this.preferredVersion) {
|
|
64
|
+
// We're on fallback version, schedule return to preferred on next request
|
|
65
|
+
this.fallbackAttempted = false;
|
|
66
|
+
this.apiVersion = this.preferredVersion;
|
|
67
|
+
this.apiUrl = `${this.baseUrl}/wos-starter/${this.apiVersion}`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
getCapabilities() {
|
|
71
|
+
return {
|
|
72
|
+
search: true,
|
|
73
|
+
download: false,
|
|
74
|
+
fullText: false,
|
|
75
|
+
citations: true,
|
|
76
|
+
requiresApiKey: true,
|
|
77
|
+
supportedOptions: ['maxResults', 'year', 'author', 'journal', 'sortBy', 'sortOrder']
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 获取论文的参考文献ID列表
|
|
82
|
+
*/
|
|
83
|
+
async getReferenceIds(uid) {
|
|
84
|
+
if (!this.apiKey)
|
|
85
|
+
return [];
|
|
86
|
+
try {
|
|
87
|
+
const response = await this.makeApiRequest(`/documents/${uid}/references`, {
|
|
88
|
+
method: 'GET',
|
|
89
|
+
params: {
|
|
90
|
+
db: 'WOS',
|
|
91
|
+
limit: 50
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
const hits = response.data?.hits || [];
|
|
95
|
+
return hits.map((hit) => hit.uid).filter(Boolean);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
logDebug(`Error getting reference IDs for UT ${uid}:`, error);
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 获取引用此论文的文献ID列表
|
|
104
|
+
*/
|
|
105
|
+
async getCitationIds(uid) {
|
|
106
|
+
if (!this.apiKey)
|
|
107
|
+
return [];
|
|
108
|
+
try {
|
|
109
|
+
const response = await this.makeApiRequest(`/documents/${uid}/citing`, {
|
|
110
|
+
method: 'GET',
|
|
111
|
+
params: {
|
|
112
|
+
db: 'WOS',
|
|
113
|
+
limit: 100
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
const hits = response.data?.hits || [];
|
|
117
|
+
return hits.map((hit) => hit.uid).filter(Boolean);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
logDebug(`Error getting citation IDs for UT ${uid}:`, error);
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 获取论文详情(包含references和citations ID列表)
|
|
126
|
+
*/
|
|
127
|
+
async getPaperWithCitations(uid) {
|
|
128
|
+
try {
|
|
129
|
+
const query = uid.includes('/') ? `DO="${uid}"` : `UT="${uid}"`;
|
|
130
|
+
const results = await this.search(query, { maxResults: 1 });
|
|
131
|
+
if (results.length === 0)
|
|
132
|
+
return null;
|
|
133
|
+
const paper = results[0];
|
|
134
|
+
const paperUid = paper.extra?.uid;
|
|
135
|
+
if (paperUid) {
|
|
136
|
+
const [refIds, citIds] = await Promise.all([
|
|
137
|
+
this.getReferenceIds(paperUid),
|
|
138
|
+
this.getCitationIds(paperUid)
|
|
139
|
+
]);
|
|
140
|
+
paper.references = refIds;
|
|
141
|
+
paper.extra = {
|
|
142
|
+
...paper.extra,
|
|
143
|
+
citationIds: citIds
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return paper;
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
logDebug('Error getting paper with citations:', error);
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 搜索Web of Science论文
|
|
155
|
+
*/
|
|
156
|
+
async search(query, options = {}) {
|
|
157
|
+
if (!this.apiKey) {
|
|
158
|
+
throw new Error('Web of Science API key is required');
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
const searchParams = this.buildSearchQuery(query, options);
|
|
162
|
+
const response = await this.makeApiRequest('/documents', {
|
|
163
|
+
method: 'GET',
|
|
164
|
+
params: searchParams
|
|
165
|
+
});
|
|
166
|
+
return this.parseSearchResponse(response.data);
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
this.handleHttpError(error, 'search');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Web of Science 通常不支持直接PDF下载
|
|
174
|
+
*/
|
|
175
|
+
async downloadPdf(paperId, options) {
|
|
176
|
+
throw new Error('Web of Science does not support direct PDF download. Please use the DOI or URL to access the paper through the publisher.');
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Web of Science 通常不提供全文内容
|
|
180
|
+
*/
|
|
181
|
+
async readPaper(paperId, options) {
|
|
182
|
+
throw new Error('Web of Science does not provide full-text content. Only bibliographic metadata and abstracts are available.');
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 根据DOI获取论文详细信息
|
|
186
|
+
*/
|
|
187
|
+
async getPaperByDoi(doi) {
|
|
188
|
+
try {
|
|
189
|
+
const query = `DO="${doi}"`;
|
|
190
|
+
const results = await this.search(query, { maxResults: 1 });
|
|
191
|
+
return results.length > 0 ? results[0] : null;
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
logDebug('Error getting paper by DOI from Web of Science:', error);
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* 获取论文被引统计
|
|
200
|
+
*/
|
|
201
|
+
async getCitationCount(paperId) {
|
|
202
|
+
if (!this.apiKey) {
|
|
203
|
+
throw new Error('Web of Science API key is required');
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
const response = await this.makeApiRequest(`/documents/${paperId}`, {
|
|
207
|
+
method: 'GET'
|
|
208
|
+
});
|
|
209
|
+
const record = response.data?.Data?.[0];
|
|
210
|
+
const citationData = record?.dynamic_data?.citation_related?.tc_list?.silo_tc;
|
|
211
|
+
return citationData ? parseInt(citationData.local_count, 10) : 0;
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
logDebug('Error getting citation count:', error);
|
|
215
|
+
return 0;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* 构建搜索查询参数
|
|
220
|
+
*/
|
|
221
|
+
buildSearchQuery(query, options) {
|
|
222
|
+
// 构建WOS查询字符串 - 支持多主题和复杂查询
|
|
223
|
+
let formattedQuery = this.buildWosQuery(query, options);
|
|
224
|
+
const params = {
|
|
225
|
+
q: formattedQuery,
|
|
226
|
+
db: options.databases?.join(',') || 'WOS',
|
|
227
|
+
limit: Math.min(options.maxResults || 10, 100), // WOS API限制最大100条
|
|
228
|
+
page: 1
|
|
229
|
+
};
|
|
230
|
+
// 添加排序参数 - 使用正确的API参数名
|
|
231
|
+
if (options.sortBy) {
|
|
232
|
+
const sortField = this.mapSortField(options.sortBy);
|
|
233
|
+
if (sortField) {
|
|
234
|
+
const direction = (options.sortOrder || 'desc').toLowerCase() === 'asc' ? 'ASC' : 'DESC';
|
|
235
|
+
params.sortField = `${sortField} ${direction}`;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return params;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* 构建WOS格式的查询字符串
|
|
242
|
+
*/
|
|
243
|
+
buildWosQuery(query, options) {
|
|
244
|
+
const queryParts = [];
|
|
245
|
+
// Validate query complexity first
|
|
246
|
+
const complexityCheck = validateQueryComplexity(query, {
|
|
247
|
+
maxLength: 1000,
|
|
248
|
+
maxBooleanOperators: 10
|
|
249
|
+
});
|
|
250
|
+
if (!complexityCheck.valid) {
|
|
251
|
+
throw new Error(complexityCheck.error);
|
|
252
|
+
}
|
|
253
|
+
// 处理主题搜索 - 支持多个关键词
|
|
254
|
+
if (query && query.trim()) {
|
|
255
|
+
// 检查是否已经包含WOS字段标签
|
|
256
|
+
// Supported field tags: TI, IS, SO, VL, PG, CS, PY, FPY, DOP, AU, AI, UT, DO, DT, PMID, OG, TS, SUR
|
|
257
|
+
const wosFieldTags = ['TS=', 'TI=', 'AU=', 'SO=', 'PY=', 'DO=', 'IS=', 'VL=', 'PG=', 'CS=',
|
|
258
|
+
'DT=', 'PMID=', 'FPY=', 'DOP=', 'AI=', 'UT=', 'OG=', 'SUR='];
|
|
259
|
+
const hasFieldTag = wosFieldTags.some(tag => query.toUpperCase().includes(tag));
|
|
260
|
+
if (hasFieldTag) {
|
|
261
|
+
// 用户提供了带字段标签的查询,直接使用(不进行转义)
|
|
262
|
+
queryParts.push(query);
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
// 简单查询,使用TS(Topic)字段
|
|
266
|
+
const escapedQuery = escapeQueryValue(query, 'wos');
|
|
267
|
+
queryParts.push(`TS=(${escapedQuery})`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// 添加年份过滤
|
|
271
|
+
if (options.year) {
|
|
272
|
+
if (options.year.includes('-')) {
|
|
273
|
+
// 年份范围 "2020-2023"
|
|
274
|
+
const [startYear, endYear] = options.year.split('-');
|
|
275
|
+
queryParts.push(`PY=(${startYear.trim()}-${endYear.trim()})`);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
// 单个年份
|
|
279
|
+
queryParts.push(`PY=${options.year}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// 添加作者过滤
|
|
283
|
+
if (options.author) {
|
|
284
|
+
const escapedAuthor = escapeQueryValue(options.author, 'wos');
|
|
285
|
+
queryParts.push(`AU=(${escapedAuthor})`);
|
|
286
|
+
}
|
|
287
|
+
// 添加期刊过滤
|
|
288
|
+
if (options.journal) {
|
|
289
|
+
const escapedJournal = escapeQueryValue(options.journal, 'wos');
|
|
290
|
+
queryParts.push(`SO=(${escapedJournal})`);
|
|
291
|
+
}
|
|
292
|
+
// 添加ISSN/ISBN过滤 (IS field tag)
|
|
293
|
+
if (options.issn) {
|
|
294
|
+
queryParts.push(`IS=${options.issn}`);
|
|
295
|
+
}
|
|
296
|
+
// 添加卷号过滤 (VL field tag)
|
|
297
|
+
if (options.volume) {
|
|
298
|
+
queryParts.push(`VL=${options.volume}`);
|
|
299
|
+
}
|
|
300
|
+
// 添加页码过滤 (PG field tag)
|
|
301
|
+
if (options.page) {
|
|
302
|
+
queryParts.push(`PG=${options.page}`);
|
|
303
|
+
}
|
|
304
|
+
// 添加期号过滤 (CS field tag - Issue)
|
|
305
|
+
if (options.issue) {
|
|
306
|
+
queryParts.push(`CS=${options.issue}`);
|
|
307
|
+
}
|
|
308
|
+
// 添加文档类型过滤 (DT field tag)
|
|
309
|
+
if (options.documentTypes && options.documentTypes.length > 0) {
|
|
310
|
+
const dtQuery = options.documentTypes.map(dt => `"${dt}"`).join(' OR ');
|
|
311
|
+
queryParts.push(`DT=(${dtQuery})`);
|
|
312
|
+
}
|
|
313
|
+
// 添加PubMed ID过滤 (PMID field tag)
|
|
314
|
+
if (options.pmid) {
|
|
315
|
+
queryParts.push(`PMID=${options.pmid}`);
|
|
316
|
+
}
|
|
317
|
+
// 添加DOI过滤 (DO field tag)
|
|
318
|
+
if (options.doi) {
|
|
319
|
+
queryParts.push(`DO="${options.doi}"`);
|
|
320
|
+
}
|
|
321
|
+
// 用AND连接所有查询部分
|
|
322
|
+
return queryParts.join(' AND ');
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* 转义WOS查询中的特殊字符
|
|
326
|
+
*/
|
|
327
|
+
escapeWosQuery(query) {
|
|
328
|
+
if (!query)
|
|
329
|
+
return '';
|
|
330
|
+
// 移除多余的引号和转义特殊字符
|
|
331
|
+
return query
|
|
332
|
+
.replace(/"/g, '') // 移除引号
|
|
333
|
+
.replace(/[\(\)]/g, '') // 移除括号(API会自动添加)
|
|
334
|
+
.trim();
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* 映射排序字段到WOS API格式
|
|
338
|
+
*/
|
|
339
|
+
mapSortField(sortBy) {
|
|
340
|
+
const fieldMap = {
|
|
341
|
+
'relevance': 'RS',
|
|
342
|
+
'date': 'PY',
|
|
343
|
+
'citations': 'TC', // Times Cited
|
|
344
|
+
'title': undefined,
|
|
345
|
+
'author': undefined,
|
|
346
|
+
'journal': undefined
|
|
347
|
+
};
|
|
348
|
+
return Object.prototype.hasOwnProperty.call(fieldMap, sortBy.toLowerCase())
|
|
349
|
+
? fieldMap[sortBy.toLowerCase()]
|
|
350
|
+
: 'RS';
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* 解析搜索响应
|
|
354
|
+
*/
|
|
355
|
+
parseSearchResponse(data) {
|
|
356
|
+
if (!data.hits || !Array.isArray(data.hits)) {
|
|
357
|
+
logDebug('WoS: No hits found in response or hits is not an array');
|
|
358
|
+
return [];
|
|
359
|
+
}
|
|
360
|
+
if (process.env.NODE_ENV === 'development') {
|
|
361
|
+
logDebug(`WoS: Found ${data.hits.length} hits out of ${data.metadata?.total || 0} total`);
|
|
362
|
+
}
|
|
363
|
+
return data.hits.map(record => this.parseWoSRecord(record))
|
|
364
|
+
.filter(paper => paper !== null);
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* 解析单个WoS记录
|
|
368
|
+
*/
|
|
369
|
+
parseWoSRecord(record) {
|
|
370
|
+
try {
|
|
371
|
+
// 提取基本信息
|
|
372
|
+
const title = record.title || 'No title available';
|
|
373
|
+
const authors = record.names?.authors?.map(author => author.displayName) || [];
|
|
374
|
+
const abstractText = record.abstract || '';
|
|
375
|
+
// 提取出版信息
|
|
376
|
+
const year = record.source?.publishYear;
|
|
377
|
+
const publishedDate = year ? new Date(year, 0, 1) : null;
|
|
378
|
+
const journal = record.source?.sourceTitle || '';
|
|
379
|
+
// 提取DOI
|
|
380
|
+
const doi = record.identifiers?.doi || '';
|
|
381
|
+
// 提取被引次数
|
|
382
|
+
const citationCount = record.citations?.[0]?.citingArticlesCount ??
|
|
383
|
+
record.citations?.[0]?.count ??
|
|
384
|
+
0;
|
|
385
|
+
// 提取关键词
|
|
386
|
+
const keywords = record.keywords?.authorKeywords || [];
|
|
387
|
+
// 构建URL
|
|
388
|
+
const wosUrl = `https://www.webofscience.com/wos/woscc/full-record/${record.uid}`;
|
|
389
|
+
return PaperFactory.create({
|
|
390
|
+
paperId: record.uid,
|
|
391
|
+
title: this.cleanText(title),
|
|
392
|
+
authors: authors,
|
|
393
|
+
abstract: this.cleanText(abstractText),
|
|
394
|
+
doi: doi,
|
|
395
|
+
publishedDate: publishedDate,
|
|
396
|
+
pdfUrl: '', // WoS通常不提供直接PDF链接
|
|
397
|
+
url: wosUrl,
|
|
398
|
+
source: 'webofscience',
|
|
399
|
+
categories: record.types || [],
|
|
400
|
+
keywords: keywords,
|
|
401
|
+
citationCount: citationCount,
|
|
402
|
+
journal: journal,
|
|
403
|
+
volume: record.source?.volume || undefined,
|
|
404
|
+
issue: record.source?.issue || undefined,
|
|
405
|
+
pages: record.source?.pages || undefined,
|
|
406
|
+
year: year,
|
|
407
|
+
extra: {
|
|
408
|
+
uid: record.uid,
|
|
409
|
+
doctype: record.types?.[0],
|
|
410
|
+
sourceTypes: record.sourceTypes
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
catch (error) {
|
|
415
|
+
logDebug('Error parsing WoS record:', error);
|
|
416
|
+
logDebug('Record data:', record);
|
|
417
|
+
return null;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* 发起API请求 - 支持自动版本降级
|
|
422
|
+
*/
|
|
423
|
+
async makeApiRequest(endpoint, config, isRetry = false) {
|
|
424
|
+
await this.rateLimiter.waitForPermission();
|
|
425
|
+
this.quotaManager.checkQuota('webofscience');
|
|
426
|
+
const url = `${this.apiUrl}${endpoint}`;
|
|
427
|
+
const requestConfig = {
|
|
428
|
+
...config,
|
|
429
|
+
headers: {
|
|
430
|
+
'X-ApiKey': this.apiKey,
|
|
431
|
+
'Content-Type': 'application/json',
|
|
432
|
+
'User-Agent': USER_AGENT,
|
|
433
|
+
...config.headers
|
|
434
|
+
},
|
|
435
|
+
timeout: TIMEOUTS.DEFAULT
|
|
436
|
+
};
|
|
437
|
+
// Debug logs only in development to avoid noisy stderr in CI/production
|
|
438
|
+
if (process.env.NODE_ENV === 'development') {
|
|
439
|
+
logDebug(`WoS API Request: ${config.method} ${url} (version: ${this.apiVersion})`);
|
|
440
|
+
logDebug('WoS Request params:', config.params);
|
|
441
|
+
}
|
|
442
|
+
try {
|
|
443
|
+
const response = await ErrorHandler.retryWithBackoff(() => axios(url, requestConfig), { context: 'Web of Science API' });
|
|
444
|
+
this.quotaManager.incrementUsage('webofscience');
|
|
445
|
+
if (process.env.NODE_ENV === 'development') {
|
|
446
|
+
logDebug(`WoS API Response: ${response.status} ${response.statusText}`);
|
|
447
|
+
logDebug('WoS Response data preview:', JSON.stringify(response.data, null, 2).substring(0, 500));
|
|
448
|
+
}
|
|
449
|
+
// Reset fallback state on success
|
|
450
|
+
this.resetFallbackState();
|
|
451
|
+
return response;
|
|
452
|
+
}
|
|
453
|
+
catch (error) {
|
|
454
|
+
const status = error.response?.status;
|
|
455
|
+
if (process.env.NODE_ENV === 'development') {
|
|
456
|
+
logDebug(`WoS API Error (${this.apiVersion}):`, {
|
|
457
|
+
status,
|
|
458
|
+
statusText: error.response?.statusText,
|
|
459
|
+
data: error.response?.data,
|
|
460
|
+
config: {
|
|
461
|
+
url: error.config?.url,
|
|
462
|
+
method: error.config?.method,
|
|
463
|
+
params: error.config?.params
|
|
464
|
+
}
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
// Try fallback version for connection/server errors (not auth errors)
|
|
468
|
+
// 404, 500, 502, 503, 504, or network errors trigger fallback
|
|
469
|
+
const shouldFallback = !isRetry && (!status || // Network error
|
|
470
|
+
status === 404 || // Not found (version mismatch)
|
|
471
|
+
status >= 500 // Server errors
|
|
472
|
+
);
|
|
473
|
+
if (shouldFallback && this.switchToFallbackVersion()) {
|
|
474
|
+
logDebug(`Retrying with WoS API ${this.apiVersion}...`);
|
|
475
|
+
return this.makeApiRequest(endpoint, config, true);
|
|
476
|
+
}
|
|
477
|
+
throw error;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* 验证API密钥
|
|
482
|
+
*/
|
|
483
|
+
async validateApiKey() {
|
|
484
|
+
if (!this.apiKey)
|
|
485
|
+
return false;
|
|
486
|
+
try {
|
|
487
|
+
await this.search('test', { maxResults: 1 });
|
|
488
|
+
return true;
|
|
489
|
+
}
|
|
490
|
+
catch (error) {
|
|
491
|
+
// API密钥无效通常返回401或403
|
|
492
|
+
if (error.response?.status === 401 || error.response?.status === 403) {
|
|
493
|
+
return false;
|
|
494
|
+
}
|
|
495
|
+
// 其他错误可能是网络问题,认为密钥可能有效
|
|
496
|
+
return true;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
//# sourceMappingURL=WebOfScienceSearcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebOfScienceSearcher.js","sourceRoot":"","sources":["../../src/platforms/WebOfScienceSearcher.ts"],"names":[],"mappings":"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"}
|