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.
Files changed (166) hide show
  1. package/.env.example +165 -0
  2. package/LICENSE +21 -0
  3. package/README-sc.md +642 -0
  4. package/README.md +642 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +637 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/config/ConfigService.d.ts +26 -0
  10. package/dist/config/ConfigService.d.ts.map +1 -0
  11. package/dist/config/ConfigService.js +145 -0
  12. package/dist/config/ConfigService.js.map +1 -0
  13. package/dist/config/constants.d.ts +140 -0
  14. package/dist/config/constants.d.ts.map +1 -0
  15. package/dist/config/constants.js +93 -0
  16. package/dist/config/constants.js.map +1 -0
  17. package/dist/core/diagnostics.d.ts +43 -0
  18. package/dist/core/diagnostics.d.ts.map +1 -0
  19. package/dist/core/diagnostics.js +544 -0
  20. package/dist/core/diagnostics.js.map +1 -0
  21. package/dist/core/handleToolCall.d.ts +8 -0
  22. package/dist/core/handleToolCall.d.ts.map +1 -0
  23. package/dist/core/handleToolCall.js +440 -0
  24. package/dist/core/handleToolCall.js.map +1 -0
  25. package/dist/core/schemas.d.ts +454 -0
  26. package/dist/core/schemas.d.ts.map +1 -0
  27. package/dist/core/schemas.js +322 -0
  28. package/dist/core/schemas.js.map +1 -0
  29. package/dist/core/searchers.d.ts +45 -0
  30. package/dist/core/searchers.d.ts.map +1 -0
  31. package/dist/core/searchers.js +73 -0
  32. package/dist/core/searchers.js.map +1 -0
  33. package/dist/core/tools.d.ts +7 -0
  34. package/dist/core/tools.d.ts.map +1 -0
  35. package/dist/core/tools.js +640 -0
  36. package/dist/core/tools.js.map +1 -0
  37. package/dist/models/Paper.d.ts +64 -0
  38. package/dist/models/Paper.d.ts.map +1 -0
  39. package/dist/models/Paper.js +70 -0
  40. package/dist/models/Paper.js.map +1 -0
  41. package/dist/platforms/ArxivSearcher.d.ts +64 -0
  42. package/dist/platforms/ArxivSearcher.d.ts.map +1 -0
  43. package/dist/platforms/ArxivSearcher.js +531 -0
  44. package/dist/platforms/ArxivSearcher.js.map +1 -0
  45. package/dist/platforms/BioRxivSearcher.d.ts +47 -0
  46. package/dist/platforms/BioRxivSearcher.d.ts.map +1 -0
  47. package/dist/platforms/BioRxivSearcher.js +196 -0
  48. package/dist/platforms/BioRxivSearcher.js.map +1 -0
  49. package/dist/platforms/CORESearcher.d.ts +16 -0
  50. package/dist/platforms/CORESearcher.d.ts.map +1 -0
  51. package/dist/platforms/CORESearcher.js +148 -0
  52. package/dist/platforms/CORESearcher.js.map +1 -0
  53. package/dist/platforms/CrossrefSearcher.d.ts +34 -0
  54. package/dist/platforms/CrossrefSearcher.d.ts.map +1 -0
  55. package/dist/platforms/CrossrefSearcher.js +339 -0
  56. package/dist/platforms/CrossrefSearcher.js.map +1 -0
  57. package/dist/platforms/EuropePMCSearcher.d.ts +20 -0
  58. package/dist/platforms/EuropePMCSearcher.d.ts.map +1 -0
  59. package/dist/platforms/EuropePMCSearcher.js +173 -0
  60. package/dist/platforms/EuropePMCSearcher.js.map +1 -0
  61. package/dist/platforms/GoogleScholarSearcher.d.ts +77 -0
  62. package/dist/platforms/GoogleScholarSearcher.d.ts.map +1 -0
  63. package/dist/platforms/GoogleScholarSearcher.js +262 -0
  64. package/dist/platforms/GoogleScholarSearcher.js.map +1 -0
  65. package/dist/platforms/IACRSearcher.d.ts +51 -0
  66. package/dist/platforms/IACRSearcher.d.ts.map +1 -0
  67. package/dist/platforms/IACRSearcher.js +339 -0
  68. package/dist/platforms/IACRSearcher.js.map +1 -0
  69. package/dist/platforms/OpenAIRESearcher.d.ts +22 -0
  70. package/dist/platforms/OpenAIRESearcher.d.ts.map +1 -0
  71. package/dist/platforms/OpenAIRESearcher.js +223 -0
  72. package/dist/platforms/OpenAIRESearcher.js.map +1 -0
  73. package/dist/platforms/OpenAlexSearcher.d.ts +14 -0
  74. package/dist/platforms/OpenAlexSearcher.d.ts.map +1 -0
  75. package/dist/platforms/OpenAlexSearcher.js +114 -0
  76. package/dist/platforms/OpenAlexSearcher.js.map +1 -0
  77. package/dist/platforms/PMCSearcher.d.ts +20 -0
  78. package/dist/platforms/PMCSearcher.d.ts.map +1 -0
  79. package/dist/platforms/PMCSearcher.js +177 -0
  80. package/dist/platforms/PMCSearcher.js.map +1 -0
  81. package/dist/platforms/PaperSource.d.ts +143 -0
  82. package/dist/platforms/PaperSource.d.ts.map +1 -0
  83. package/dist/platforms/PaperSource.js +125 -0
  84. package/dist/platforms/PaperSource.js.map +1 -0
  85. package/dist/platforms/PubMedSearcher.d.ts +104 -0
  86. package/dist/platforms/PubMedSearcher.d.ts.map +1 -0
  87. package/dist/platforms/PubMedSearcher.js +422 -0
  88. package/dist/platforms/PubMedSearcher.js.map +1 -0
  89. package/dist/platforms/SciHubSearcher.d.ts +66 -0
  90. package/dist/platforms/SciHubSearcher.d.ts.map +1 -0
  91. package/dist/platforms/SciHubSearcher.js +398 -0
  92. package/dist/platforms/SciHubSearcher.js.map +1 -0
  93. package/dist/platforms/ScienceDirectSearcher.d.ts +42 -0
  94. package/dist/platforms/ScienceDirectSearcher.d.ts.map +1 -0
  95. package/dist/platforms/ScienceDirectSearcher.js +326 -0
  96. package/dist/platforms/ScienceDirectSearcher.js.map +1 -0
  97. package/dist/platforms/ScopusSearcher.d.ts +43 -0
  98. package/dist/platforms/ScopusSearcher.d.ts.map +1 -0
  99. package/dist/platforms/ScopusSearcher.js +364 -0
  100. package/dist/platforms/ScopusSearcher.js.map +1 -0
  101. package/dist/platforms/SemanticScholarSearcher.d.ts +96 -0
  102. package/dist/platforms/SemanticScholarSearcher.d.ts.map +1 -0
  103. package/dist/platforms/SemanticScholarSearcher.js +419 -0
  104. package/dist/platforms/SemanticScholarSearcher.js.map +1 -0
  105. package/dist/platforms/SpringerSearcher.d.ts +54 -0
  106. package/dist/platforms/SpringerSearcher.d.ts.map +1 -0
  107. package/dist/platforms/SpringerSearcher.js +407 -0
  108. package/dist/platforms/SpringerSearcher.js.map +1 -0
  109. package/dist/platforms/UnpaywallSearcher.d.ts +18 -0
  110. package/dist/platforms/UnpaywallSearcher.d.ts.map +1 -0
  111. package/dist/platforms/UnpaywallSearcher.js +115 -0
  112. package/dist/platforms/UnpaywallSearcher.js.map +1 -0
  113. package/dist/platforms/WebOfScienceSearcher.d.ts +111 -0
  114. package/dist/platforms/WebOfScienceSearcher.d.ts.map +1 -0
  115. package/dist/platforms/WebOfScienceSearcher.js +500 -0
  116. package/dist/platforms/WebOfScienceSearcher.js.map +1 -0
  117. package/dist/platforms/WileySearcher.d.ts +44 -0
  118. package/dist/platforms/WileySearcher.d.ts.map +1 -0
  119. package/dist/platforms/WileySearcher.js +148 -0
  120. package/dist/platforms/WileySearcher.js.map +1 -0
  121. package/dist/services/CitationService.d.ts +66 -0
  122. package/dist/services/CitationService.d.ts.map +1 -0
  123. package/dist/services/CitationService.js +237 -0
  124. package/dist/services/CitationService.js.map +1 -0
  125. package/dist/services/MultiSourceSearchService.d.ts +19 -0
  126. package/dist/services/MultiSourceSearchService.d.ts.map +1 -0
  127. package/dist/services/MultiSourceSearchService.js +96 -0
  128. package/dist/services/MultiSourceSearchService.js.map +1 -0
  129. package/dist/services/OpenAccessFallbackService.d.ts +20 -0
  130. package/dist/services/OpenAccessFallbackService.d.ts.map +1 -0
  131. package/dist/services/OpenAccessFallbackService.js +124 -0
  132. package/dist/services/OpenAccessFallbackService.js.map +1 -0
  133. package/dist/utils/ErrorHandler.d.ts +99 -0
  134. package/dist/utils/ErrorHandler.d.ts.map +1 -0
  135. package/dist/utils/ErrorHandler.js +266 -0
  136. package/dist/utils/ErrorHandler.js.map +1 -0
  137. package/dist/utils/Logger.d.ts +6 -0
  138. package/dist/utils/Logger.d.ts.map +1 -0
  139. package/dist/utils/Logger.js +26 -0
  140. package/dist/utils/Logger.js.map +1 -0
  141. package/dist/utils/PDFExtractor.d.ts +34 -0
  142. package/dist/utils/PDFExtractor.d.ts.map +1 -0
  143. package/dist/utils/PDFExtractor.js +130 -0
  144. package/dist/utils/PDFExtractor.js.map +1 -0
  145. package/dist/utils/PdfDownload.d.ts +7 -0
  146. package/dist/utils/PdfDownload.d.ts.map +1 -0
  147. package/dist/utils/PdfDownload.js +52 -0
  148. package/dist/utils/PdfDownload.js.map +1 -0
  149. package/dist/utils/QuotaManager.d.ts +32 -0
  150. package/dist/utils/QuotaManager.d.ts.map +1 -0
  151. package/dist/utils/QuotaManager.js +95 -0
  152. package/dist/utils/QuotaManager.js.map +1 -0
  153. package/dist/utils/RateLimiter.d.ts +50 -0
  154. package/dist/utils/RateLimiter.d.ts.map +1 -0
  155. package/dist/utils/RateLimiter.js +121 -0
  156. package/dist/utils/RateLimiter.js.map +1 -0
  157. package/dist/utils/RequestCache.d.ts +26 -0
  158. package/dist/utils/RequestCache.d.ts.map +1 -0
  159. package/dist/utils/RequestCache.js +66 -0
  160. package/dist/utils/RequestCache.js.map +1 -0
  161. package/dist/utils/SecurityUtils.d.ts +80 -0
  162. package/dist/utils/SecurityUtils.d.ts.map +1 -0
  163. package/dist/utils/SecurityUtils.js +357 -0
  164. package/dist/utils/SecurityUtils.js.map +1 -0
  165. package/package.json +111 -0
  166. package/skills/paper-search/SKILL.md +192 -0
@@ -0,0 +1,422 @@
1
+ /**
2
+ * PubMed E-utilities API集成模块
3
+ * 支持无API密钥的免费使用(3 req/s)和有API密钥的增强使用(10 req/s)
4
+ */
5
+ import axios from 'axios';
6
+ import * as xml2js from 'xml2js';
7
+ import { PaperFactory } from '../models/Paper.js';
8
+ import { PaperSource } from './PaperSource.js';
9
+ import { RateLimiter } from '../utils/RateLimiter.js';
10
+ import { ErrorHandler } from '../utils/ErrorHandler.js';
11
+ import { TIMEOUTS, USER_AGENT } from '../config/constants.js';
12
+ import { logDebug } from '../utils/Logger.js';
13
+ export class PubMedSearcher extends PaperSource {
14
+ baseApiUrl;
15
+ rateLimiter;
16
+ retMax = 20; // 每次批量获取的最大数量
17
+ constructor(apiKey) {
18
+ super('pubmed', 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils', apiKey);
19
+ this.baseApiUrl = this.baseUrl;
20
+ // 根据是否有API密钥设置不同的速率限制
21
+ const requestsPerSecond = apiKey ? 10 : 3;
22
+ this.rateLimiter = new RateLimiter({
23
+ requestsPerSecond,
24
+ burstCapacity: requestsPerSecond,
25
+ debug: process.env.NODE_ENV === 'development'
26
+ });
27
+ }
28
+ getCapabilities() {
29
+ return {
30
+ search: true,
31
+ download: false, // PubMed不提供直接PDF下载
32
+ fullText: false, // 只有摘要,不是全文
33
+ citations: false, // 基础版本不提供被引统计
34
+ requiresApiKey: false, // 无API密钥也可以使用,但有限制
35
+ supportedOptions: ['maxResults', 'year', 'author', 'journal', 'sortBy']
36
+ };
37
+ }
38
+ /**
39
+ * 搜索PubMed文献
40
+ */
41
+ async search(query, options = {}) {
42
+ try {
43
+ logDebug(`PubMed Search Starting: query="${query}"`, options);
44
+ // 第一步:使用ESearch获取PMID列表
45
+ const pmids = await this.searchPMIDs(query, options);
46
+ if (pmids.length === 0) {
47
+ return [];
48
+ }
49
+ // 第二步:批量获取详细信息
50
+ const papers = [];
51
+ for (let i = 0; i < pmids.length; i += this.retMax) {
52
+ const batch = pmids.slice(i, i + this.retMax);
53
+ const batchPapers = await this.fetchPaperDetails(batch);
54
+ papers.push(...batchPapers);
55
+ }
56
+ return papers;
57
+ }
58
+ catch (error) {
59
+ logDebug('PubMed Search Error:', error.message);
60
+ this.handleHttpError(error, 'search');
61
+ }
62
+ }
63
+ /**
64
+ * 搜索获取PMID列表
65
+ */
66
+ async searchPMIDs(query, options) {
67
+ await this.rateLimiter.waitForPermission();
68
+ const searchQuery = this.buildSearchQuery(query, options);
69
+ const params = {
70
+ db: 'pubmed',
71
+ term: searchQuery,
72
+ retmax: (options.maxResults || 10).toString(),
73
+ retmode: 'xml',
74
+ sort: this.mapSortField(options.sortBy || 'relevance')
75
+ };
76
+ // 添加API密钥(如果有)
77
+ if (this.apiKey) {
78
+ params.api_key = this.apiKey;
79
+ }
80
+ const url = `${this.baseApiUrl}/esearch.fcgi`;
81
+ logDebug(`PubMed ESearch Request: GET ${url}`);
82
+ logDebug('PubMed ESearch params:', params);
83
+ const response = await ErrorHandler.retryWithBackoff(() => axios.get(url, {
84
+ params,
85
+ timeout: TIMEOUTS.DEFAULT,
86
+ headers: { 'User-Agent': USER_AGENT }
87
+ }), { context: 'PubMed ESearch' });
88
+ logDebug(`PubMed ESearch Response: ${response.status} ${response.statusText}`);
89
+ logDebug('PubMed ESearch Response data:', response.data.substring(0, 500));
90
+ const result = await this.parseXmlResponse(response.data);
91
+ let pmids = result.eSearchResult.IdList?.Id || [];
92
+ // 处理单个ID vs ID数组
93
+ if (typeof pmids === 'string') {
94
+ pmids = [pmids];
95
+ }
96
+ logDebug(`PubMed Found ${pmids.length} PMIDs:`, pmids.slice(0, 5));
97
+ return pmids;
98
+ }
99
+ /**
100
+ * 获取论文详细信息
101
+ */
102
+ async fetchPaperDetails(pmids) {
103
+ await this.rateLimiter.waitForPermission();
104
+ const params = {
105
+ db: 'pubmed',
106
+ id: pmids.join(','),
107
+ retmode: 'xml'
108
+ };
109
+ // 添加API密钥(如果有)
110
+ if (this.apiKey) {
111
+ params.api_key = this.apiKey;
112
+ }
113
+ const url = `${this.baseApiUrl}/efetch.fcgi`;
114
+ const response = await ErrorHandler.retryWithBackoff(() => axios.get(url, {
115
+ params,
116
+ timeout: TIMEOUTS.DEFAULT,
117
+ headers: { 'User-Agent': USER_AGENT }
118
+ }), { context: 'PubMed EFetch' });
119
+ const result = await this.parseXmlResponse(response.data);
120
+ // 处理xml2js的单个元素vs数组问题
121
+ let articles = result.PubmedArticleSet?.PubmedArticle || [];
122
+ if (!Array.isArray(articles)) {
123
+ articles = [articles]; // 将单个对象转换为数组
124
+ }
125
+ return this.parsePubMedArticles(articles);
126
+ }
127
+ /**
128
+ * 构建搜索查询
129
+ */
130
+ buildSearchQuery(query, options) {
131
+ let searchQuery = query;
132
+ // 添加作者过滤
133
+ if (options.author) {
134
+ searchQuery += ` AND ${options.author}[Author]`;
135
+ }
136
+ // 添加期刊过滤
137
+ if (options.journal) {
138
+ searchQuery += ` AND "${options.journal}"[Journal]`;
139
+ }
140
+ // 添加年份过滤
141
+ if (options.year) {
142
+ if (options.year.includes('-')) {
143
+ const [startYear, endYear] = options.year.split('-');
144
+ if (startYear && endYear) {
145
+ searchQuery += ` AND ${startYear}:${endYear}[Publication Date]`;
146
+ }
147
+ else if (startYear) {
148
+ searchQuery += ` AND ${startYear}:3000[Publication Date]`;
149
+ }
150
+ else if (endYear) {
151
+ searchQuery += ` AND 1900:${endYear}[Publication Date]`;
152
+ }
153
+ }
154
+ else {
155
+ searchQuery += ` AND ${options.year}[Publication Date]`;
156
+ }
157
+ }
158
+ // 添加文献类型过滤
159
+ if (options.publicationType && options.publicationType.length > 0) {
160
+ const typeQuery = options.publicationType
161
+ .map(type => `"${type}"[Publication Type]`)
162
+ .join(' OR ');
163
+ searchQuery += ` AND (${typeQuery})`;
164
+ }
165
+ return searchQuery;
166
+ }
167
+ /**
168
+ * 映射排序字段
169
+ */
170
+ mapSortField(sortBy) {
171
+ const fieldMap = {
172
+ 'relevance': 'relevance',
173
+ 'date': 'pub+date',
174
+ 'citations': 'relevance' // PubMed不直接支持按被引排序
175
+ };
176
+ return fieldMap[sortBy] || 'relevance';
177
+ }
178
+ /**
179
+ * 解析XML响应
180
+ */
181
+ async parseXmlResponse(xmlData) {
182
+ const parser = new xml2js.Parser({
183
+ explicitArray: false, // 简化数组处理
184
+ mergeAttrs: false,
185
+ normalize: true,
186
+ normalizeTags: false,
187
+ trim: true
188
+ });
189
+ logDebug('PubMed XML Parsing - Data preview:', xmlData.substring(0, 200));
190
+ const result = await parser.parseStringPromise(xmlData);
191
+ logDebug('PubMed XML Parsed result structure:', JSON.stringify(result, null, 2).substring(0, 1000));
192
+ return result;
193
+ }
194
+ /**
195
+ * 解析PubMed文章列表
196
+ */
197
+ parsePubMedArticles(articles) {
198
+ return articles.map(article => this.parsePubMedArticle(article))
199
+ .filter(paper => paper !== null);
200
+ }
201
+ /**
202
+ * 解析单个PubMed文章
203
+ */
204
+ parsePubMedArticle(article) {
205
+ try {
206
+ const medlineCitation = article.MedlineCitation;
207
+ const articleData = medlineCitation.Article;
208
+ const pubmedData = article.PubmedData;
209
+ // 提取PMID
210
+ const pmid = medlineCitation.PMID._;
211
+ // 提取标题
212
+ const title = articleData.ArticleTitle || 'No title available';
213
+ // 提取作者
214
+ const authors = this.extractAuthors(articleData.AuthorList?.Author || []);
215
+ // 提取摘要
216
+ const abstract = this.extractAbstract(articleData.Abstract);
217
+ // 提取期刊信息
218
+ const journal = articleData.Journal.Title || articleData.Journal.ISOAbbreviation || '';
219
+ // 提取发布日期
220
+ const publishedDate = this.extractPublishedDate(articleData.Journal.JournalIssue.PubDate);
221
+ // 提取DOI和其他ID
222
+ const { doi, pmc } = this.extractArticleIds([
223
+ ...(articleData.ArticleIdList?.ArticleId || []),
224
+ ...(pubmedData.ArticleIdList?.ArticleId || [])
225
+ ]);
226
+ // 提取页码
227
+ const pages = articleData.Pagination?.MedlinePgn || '';
228
+ // 构建URL
229
+ const url = `https://pubmed.ncbi.nlm.nih.gov/${pmid}/`;
230
+ const pdfUrl = pmc ? `https://www.ncbi.nlm.nih.gov/pmc/articles/${pmc}/pdf/` : '';
231
+ return PaperFactory.create({
232
+ paperId: pmid,
233
+ title: this.cleanText(title),
234
+ authors: authors,
235
+ abstract: this.cleanText(abstract),
236
+ doi: doi,
237
+ publishedDate: publishedDate,
238
+ pdfUrl: pdfUrl,
239
+ url: url,
240
+ source: 'pubmed',
241
+ journal: journal,
242
+ volume: articleData.Journal.JournalIssue.Volume || undefined,
243
+ issue: articleData.Journal.JournalIssue.Issue || undefined,
244
+ pages: pages || undefined,
245
+ year: publishedDate?.getFullYear(),
246
+ extra: {
247
+ pmid: pmid,
248
+ pmc: pmc || undefined
249
+ }
250
+ });
251
+ }
252
+ catch (error) {
253
+ logDebug('Error parsing PubMed article:', error);
254
+ return null;
255
+ }
256
+ }
257
+ /**
258
+ * 提取作者信息
259
+ */
260
+ extractAuthors(authorList) {
261
+ if (!Array.isArray(authorList)) {
262
+ return [];
263
+ }
264
+ return authorList.map(author => {
265
+ if (author.CollectiveName) {
266
+ return author.CollectiveName;
267
+ }
268
+ const lastName = author.LastName || '';
269
+ const foreName = author.ForeName || author.Initials || '';
270
+ if (lastName && foreName) {
271
+ return `${lastName}, ${foreName}`;
272
+ }
273
+ else if (lastName) {
274
+ return lastName;
275
+ }
276
+ else if (foreName) {
277
+ return foreName;
278
+ }
279
+ return 'Unknown Author';
280
+ }).filter(name => name && name !== 'Unknown Author');
281
+ }
282
+ /**
283
+ * 提取摘要
284
+ */
285
+ extractAbstract(abstractData) {
286
+ if (!abstractData) {
287
+ return '';
288
+ }
289
+ if (typeof abstractData.AbstractText === 'string') {
290
+ return abstractData.AbstractText;
291
+ }
292
+ if (Array.isArray(abstractData.AbstractText)) {
293
+ return abstractData.AbstractText.join(' ');
294
+ }
295
+ return '';
296
+ }
297
+ /**
298
+ * 提取发布日期
299
+ */
300
+ extractPublishedDate(pubDate) {
301
+ if (!pubDate) {
302
+ return null;
303
+ }
304
+ const year = pubDate.Year;
305
+ const month = pubDate.Month;
306
+ const day = pubDate.Day;
307
+ if (year) {
308
+ const monthNum = month ? this.parseMonth(month) : 1;
309
+ const dayNum = day ? parseInt(day, 10) : 1;
310
+ return new Date(parseInt(year, 10), monthNum - 1, dayNum);
311
+ }
312
+ return null;
313
+ }
314
+ /**
315
+ * 解析月份(支持英文和数字)
316
+ */
317
+ parseMonth(month) {
318
+ const monthMap = {
319
+ 'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
320
+ 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12,
321
+ 'January': 1, 'February': 2, 'March': 3, 'April': 4, 'June': 6,
322
+ 'July': 7, 'August': 8, 'September': 9, 'October': 10, 'November': 11, 'December': 12
323
+ };
324
+ const mapped = monthMap[month];
325
+ if (mapped) {
326
+ return mapped;
327
+ }
328
+ const num = parseInt(month, 10);
329
+ return (num >= 1 && num <= 12) ? num : 1;
330
+ }
331
+ /**
332
+ * 提取文章ID(DOI、PMC等)
333
+ */
334
+ extractArticleIds(articleIds) {
335
+ let doi = '';
336
+ let pmc = '';
337
+ if (Array.isArray(articleIds)) {
338
+ for (const id of articleIds) {
339
+ const idType = id.$?.IdType?.toLowerCase();
340
+ const value = id._;
341
+ if (idType === 'doi' && !doi) {
342
+ doi = value;
343
+ }
344
+ else if (idType === 'pmc' && !pmc) {
345
+ pmc = value;
346
+ }
347
+ }
348
+ }
349
+ return { doi, pmc };
350
+ }
351
+ /**
352
+ * PubMed通常不支持直接PDF下载
353
+ */
354
+ async downloadPdf(paperId, options) {
355
+ // 尝试获取PMC链接
356
+ const paper = await this.getPaperByPmid(paperId);
357
+ if (paper?.extra?.pmc) {
358
+ const pmcUrl = `https://www.ncbi.nlm.nih.gov/pmc/articles/${paper.extra.pmc}/pdf/`;
359
+ throw new Error(`PubMed paper may be available as PDF at PMC: ${pmcUrl}. Direct download not supported through this API.`);
360
+ }
361
+ throw new Error('PubMed does not support direct PDF download. Please access the paper through the publisher or PMC.');
362
+ }
363
+ /**
364
+ * PubMed不提供全文内容
365
+ */
366
+ async readPaper(paperId, options) {
367
+ throw new Error('PubMed does not provide full-text content. Only abstracts and metadata are available.');
368
+ }
369
+ /**
370
+ * 根据PMID获取论文信息
371
+ */
372
+ async getPaperByPmid(pmid) {
373
+ try {
374
+ const papers = await this.fetchPaperDetails([pmid]);
375
+ return papers.length > 0 ? papers[0] : null;
376
+ }
377
+ catch (error) {
378
+ logDebug('Error getting paper by PMID:', error);
379
+ return null;
380
+ }
381
+ }
382
+ /**
383
+ * 根据DOI获取论文信息
384
+ */
385
+ async getPaperByDoi(doi) {
386
+ try {
387
+ const results = await this.search(`"${doi}"[DOI]`, { maxResults: 1 });
388
+ return results.length > 0 ? results[0] : null;
389
+ }
390
+ catch (error) {
391
+ logDebug('Error getting paper by DOI from PubMed:', error);
392
+ return null;
393
+ }
394
+ }
395
+ /**
396
+ * 获取速率限制器状态
397
+ */
398
+ getRateLimiterStatus() {
399
+ return this.rateLimiter.getStatus();
400
+ }
401
+ /**
402
+ * 验证API密钥(如果提供)
403
+ */
404
+ async validateApiKey() {
405
+ if (!this.apiKey) {
406
+ return true; // 无API密钥时总是有效(使用免费限制)
407
+ }
408
+ try {
409
+ await this.search('test', { maxResults: 1 });
410
+ return true;
411
+ }
412
+ catch (error) {
413
+ // API密钥无效通常返回400或403错误
414
+ if (error.response?.status === 400 || error.response?.status === 403) {
415
+ return false;
416
+ }
417
+ // 其他错误可能是网络问题,认为密钥可能有效
418
+ return true;
419
+ }
420
+ }
421
+ }
422
+ //# sourceMappingURL=PubMedSearcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PubMedSearcher.js","sourceRoot":"","sources":["../../src/platforms/PubMedSearcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Sci-Hub 论文搜索和下载器
3
+ * 支持多镜像站点轮询、自动健康检测和故障转移
4
+ */
5
+ import { PaperSource, SearchOptions, DownloadOptions, PlatformCapabilities } from './PaperSource.js';
6
+ import { Paper } from '../models/Paper.js';
7
+ export declare class SciHubSearcher extends PaperSource {
8
+ private mirrorSites;
9
+ private currentMirrorIndex;
10
+ private axiosInstance;
11
+ private readonly maxRetries;
12
+ private readonly mirrorTestTimeout;
13
+ private lastHealthCheck;
14
+ private readonly healthCheckInterval;
15
+ constructor();
16
+ getCapabilities(): PlatformCapabilities;
17
+ /**
18
+ * 检测所有镜像站点的健康状态
19
+ */
20
+ private checkMirrorHealth;
21
+ /**
22
+ * 获取当前可用的镜像站点
23
+ */
24
+ private getCurrentMirror;
25
+ /**
26
+ * 标记镜像站点失败并切换到下一个
27
+ */
28
+ private markMirrorFailed;
29
+ /**
30
+ * 通过 DOI 或 URL 搜索论文
31
+ */
32
+ search(query: string, options?: SearchOptions): Promise<Paper[]>;
33
+ /**
34
+ * 验证输入是否为有效的 DOI 或 URL
35
+ */
36
+ private isValidDOIOrURL;
37
+ /**
38
+ * 从 Sci-Hub 获取论文信息
39
+ */
40
+ private fetchPaperInfo;
41
+ /**
42
+ * 下载 PDF 文件
43
+ */
44
+ downloadPdf(paperId: string, options?: DownloadOptions): Promise<string>;
45
+ /**
46
+ * 读取论文内容(Sci-Hub 不提供文本提取)
47
+ */
48
+ readPaper(paperId: string, options?: DownloadOptions): Promise<string>;
49
+ /**
50
+ * 根据 DOI 获取论文
51
+ */
52
+ getPaperByDoi(doi: string): Promise<Paper | null>;
53
+ /**
54
+ * 获取镜像站点状态
55
+ */
56
+ getMirrorStatus(): {
57
+ url: string;
58
+ status: string;
59
+ responseTime?: number;
60
+ }[];
61
+ /**
62
+ * 手动触发健康检查
63
+ */
64
+ forceHealthCheck(): Promise<void>;
65
+ }
66
+ //# sourceMappingURL=SciHubSearcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SciHubSearcher.d.ts","sourceRoot":"","sources":["../../src/platforms/SciHubSearcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACrG,OAAO,EAAE,KAAK,EAAgB,MAAM,oBAAoB,CAAC;AAYzD,qBAAa,cAAe,SAAQ,WAAW;IAC7C,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiC;IACnE,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAkB;;IAoCtD,eAAe,IAAI,oBAAoB;IAWvC;;OAEG;YACW,iBAAiB;IAkE/B;;OAEG;YACW,gBAAgB;IAsB9B;;OAEG;YACW,gBAAgB;IAwB9B;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAmBtE;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;YACW,cAAc;IA0G5B;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAqE9E;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAM5E;;OAEG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAIvD;;OAEG;IACH,eAAe,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE;IAQ3E;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAGxC"}