@skrillex1224/chrome-article-publish-extension 1.0.3 → 1.0.5
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/dist/adapters/index.d.ts +4 -11
- package/dist/adapters/index.js +1 -1
- package/dist/{chunk-CBRXLVZK.js → chunk-DTCVBBPG.js} +32 -1
- package/dist/chunk-DTCVBBPG.js.map +1 -0
- package/dist/{chunk-TKRBESSS.js → chunk-HHDGQYVN.js} +174 -270
- package/dist/chunk-HHDGQYVN.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/{interface-DHk2PdyN.d.ts → interface-CLQqUboy.d.ts} +23 -1
- package/dist/runtime/index.d.ts +4 -3
- package/dist/runtime/index.js +1 -1
- package/dist/{types-GigbrW8J.d.ts → types-CTtvGuEx.d.ts} +1 -1
- package/package.json +5 -4
- package/dist/chunk-CBRXLVZK.js.map +0 -1
- package/dist/chunk-TKRBESSS.js.map +0 -1
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { P as PlatformAdapter, a as PublishOptions, A as AdapterRegistryEntry, b as PreprocessConfig } from '../types-
|
|
2
|
-
export { C as Category, D as DEFAULT_PREPROCESS_CONFIG, c as Draft, I as ImageProgressCallback, O as OutputFormat } from '../types-
|
|
3
|
-
import { P as PlatformMeta, R as RuntimeInterface, A as AuthResult, a as Article, S as SyncResult, c as PublishStatusRef, d as PublishStatusResult, H as HeaderRule } from '../interface-
|
|
1
|
+
import { P as PlatformAdapter, a as PublishOptions, A as AdapterRegistryEntry, b as PreprocessConfig } from '../types-CTtvGuEx.js';
|
|
2
|
+
export { C as Category, D as DEFAULT_PREPROCESS_CONFIG, c as Draft, I as ImageProgressCallback, O as OutputFormat } from '../types-CTtvGuEx.js';
|
|
3
|
+
import { P as PlatformMeta, R as RuntimeInterface, A as AuthResult, a as Article, S as SyncResult, c as PublishStatusRef, d as PublishStatusResult, H as HeaderRule } from '../interface-CLQqUboy.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* 适配器基类
|
|
@@ -461,7 +461,6 @@ declare class CSDNAdapter extends CodeAdapter {
|
|
|
461
461
|
private preserveTaskListMarkers;
|
|
462
462
|
private postSaveArticle;
|
|
463
463
|
private postSaveArticleFromPage;
|
|
464
|
-
private getCsdnTab;
|
|
465
464
|
publish(article: Article, options?: PublishOptions): Promise<SyncResult>;
|
|
466
465
|
getStatus(statusRef: PublishStatusRef): Promise<PublishStatusResult>;
|
|
467
466
|
private findManagedArticle;
|
|
@@ -614,14 +613,12 @@ declare class DouyinAdapter extends CodeAdapter {
|
|
|
614
613
|
private getCreatorJsonFromPage;
|
|
615
614
|
private postCreatorForm;
|
|
616
615
|
private postCreatorFormFromPage;
|
|
617
|
-
private
|
|
618
|
-
private closeCreatorTab;
|
|
616
|
+
private withCreatorTab;
|
|
619
617
|
private extractUserData;
|
|
620
618
|
private isSuccessResponse;
|
|
621
619
|
private buildTextPayload;
|
|
622
620
|
private extractBodyText;
|
|
623
621
|
private normalizeText;
|
|
624
|
-
private limitText;
|
|
625
622
|
private buildPublishItem;
|
|
626
623
|
private uploadDouyinVideo;
|
|
627
624
|
private waitForVideoTransend;
|
|
@@ -667,7 +664,6 @@ declare class BaijiahaoAdapter extends CodeAdapter {
|
|
|
667
664
|
private mapArticleStatus;
|
|
668
665
|
private isPublishedItem;
|
|
669
666
|
private resolvePublishedPublicUrl;
|
|
670
|
-
private getPublishedPageTab;
|
|
671
667
|
private readPublishedPageSnapshot;
|
|
672
668
|
private urlMatchesArticleId;
|
|
673
669
|
private sleep;
|
|
@@ -805,13 +801,11 @@ declare class ToutiaoAdapter extends CodeAdapter {
|
|
|
805
801
|
protected uploadImageByUrl(src: string): Promise<ImageUploadResult>;
|
|
806
802
|
private getCsrfToken;
|
|
807
803
|
private publishInPage;
|
|
808
|
-
private ensureToutiaoTab;
|
|
809
804
|
private findManagedArticle;
|
|
810
805
|
private extractList;
|
|
811
806
|
private parseManagedRow;
|
|
812
807
|
private itemMatches;
|
|
813
808
|
private mapManagedStatus;
|
|
814
|
-
private ensureToutiaoManageTab;
|
|
815
809
|
private getVisitedUserId;
|
|
816
810
|
private buildManagedListUrl;
|
|
817
811
|
private resolvePostUrl;
|
|
@@ -846,7 +840,6 @@ declare class TencentAdapter extends CodeAdapter {
|
|
|
846
840
|
private uploadImageFileByUrl;
|
|
847
841
|
private prepareArticleContent;
|
|
848
842
|
private callPublishService;
|
|
849
|
-
private ensureTencentTab;
|
|
850
843
|
private buildArticleListUrl;
|
|
851
844
|
private hasListData;
|
|
852
845
|
private extractUserInfo;
|
package/dist/adapters/index.js
CHANGED
|
@@ -208,6 +208,37 @@ var ExtensionRuntime = class {
|
|
|
208
208
|
chrome.tabs.onUpdated.addListener(listener);
|
|
209
209
|
});
|
|
210
210
|
},
|
|
211
|
+
withManagedTab: async (options, callback) => {
|
|
212
|
+
const patterns = Array.isArray(options.urlPattern) ? options.urlPattern : [options.urlPattern];
|
|
213
|
+
for (const pattern of patterns) {
|
|
214
|
+
const tabs = await this.tabs.query(pattern);
|
|
215
|
+
const existing = tabs.find(
|
|
216
|
+
(tab2) => typeof tab2.id === "number" && (!options.match || options.match(tab2))
|
|
217
|
+
);
|
|
218
|
+
if (existing) {
|
|
219
|
+
return callback({
|
|
220
|
+
id: existing.id,
|
|
221
|
+
url: existing.url,
|
|
222
|
+
owned: false
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const tab = await this.tabs.create(options.createUrl, options.active ?? false);
|
|
227
|
+
const ownedTab = {
|
|
228
|
+
id: tab.id,
|
|
229
|
+
owned: true
|
|
230
|
+
};
|
|
231
|
+
if (options.waitForLoad !== false) {
|
|
232
|
+
await this.tabs.waitForLoad(tab.id, options.loadTimeout ?? 3e4);
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
return await callback(ownedTab);
|
|
236
|
+
} finally {
|
|
237
|
+
if (options.closeWhenDone !== false) {
|
|
238
|
+
await this.tabs.close(tab.id);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
},
|
|
211
242
|
async executeScript(tabId, func, args) {
|
|
212
243
|
const results = await chrome.scripting.executeScript({
|
|
213
244
|
target: { tabId },
|
|
@@ -268,4 +299,4 @@ export {
|
|
|
268
299
|
ExtensionRuntime,
|
|
269
300
|
createExtensionRuntime
|
|
270
301
|
};
|
|
271
|
-
//# sourceMappingURL=chunk-
|
|
302
|
+
//# sourceMappingURL=chunk-DTCVBBPG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/chrome-extension.ts"],"sourcesContent":["import type { ManagedTabHandle, ManagedTabOptions, RuntimeInterface, RuntimeConfig } from './interface'\nimport type { Cookie, HeaderRule } from '../types'\n\n/**\n * Chrome 扩展运行时实现\n */\n// 默认请求超时:30 秒\nconst DEFAULT_FETCH_TIMEOUT = 30 * 1000\nconst RUNTIME_TAB_GROUP_TITLE = 'Article Publish Runtime'\n\nexport class ExtensionRuntime implements RuntimeInterface {\n readonly type = 'extension' as const\n // 使用时间戳+随机数避免规则 ID 冲突(扩展重载或并发场景)\n private ruleIdBase = Date.now() % 100000\n private ruleIdCounter = 0\n private runtimeTabGroupId: number | null = null\n\n constructor(private config?: RuntimeConfig) {}\n\n /**\n * HTTP 请求 - 自动携带 cookies,带超时保护\n */\n async fetch(url: string, options?: RequestInit): Promise<Response> {\n const timeout = this.config?.timeout ?? DEFAULT_FETCH_TIMEOUT\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n ...options,\n credentials: 'include',\n signal: controller.signal,\n })\n return response\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n throw new Error(`请求超时(${timeout / 1000}秒): ${url}`)\n }\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`${message}: ${url}`)\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Cookie 管理\n */\n cookies = {\n async get(domain: string): Promise<Cookie[]> {\n const cookies = await chrome.cookies.getAll({ domain })\n return cookies.map(c => ({\n name: c.name,\n value: c.value,\n domain: c.domain,\n path: c.path,\n secure: c.secure,\n httpOnly: c.httpOnly,\n expirationDate: c.expirationDate,\n }))\n },\n\n async set(cookie: Cookie): Promise<void> {\n await chrome.cookies.set({\n url: `https://${cookie.domain}${cookie.path || '/'}`,\n name: cookie.name,\n value: cookie.value,\n domain: cookie.domain,\n path: cookie.path,\n secure: cookie.secure,\n httpOnly: cookie.httpOnly,\n expirationDate: cookie.expirationDate,\n })\n },\n\n async remove(name: string, domain: string): Promise<void> {\n await chrome.cookies.remove({\n url: `https://${domain}`,\n name,\n })\n },\n }\n\n /**\n * 获取单个 Cookie 值(便捷方法)\n */\n async getCookie(domain: string, name: string): Promise<string | null> {\n const cookies = await chrome.cookies.getAll({ domain, name })\n return cookies.length > 0 ? cookies[0].value : null\n }\n\n /**\n * 持久化存储\n */\n storage = {\n async get<T>(key: string): Promise<T | null> {\n const result = await chrome.storage.local.get(key)\n return (result[key] as T) ?? null\n },\n\n async set<T>(key: string, value: T): Promise<void> {\n await chrome.storage.local.set({ [key]: value })\n },\n\n async remove(key: string): Promise<void> {\n await chrome.storage.local.remove(key)\n },\n }\n\n /**\n * 会话存储\n */\n session = {\n async get<T>(key: string): Promise<T | null> {\n const result = await chrome.storage.session.get(key)\n return (result[key] as T) ?? null\n },\n\n async set<T>(key: string, value: T): Promise<void> {\n await chrome.storage.session.set({ [key]: value })\n },\n }\n\n /**\n * Header 规则管理 (declarativeNetRequest)\n * 规则只对扩展自身发起的请求生效,不影响其他网页\n */\n headerRules = {\n add: async (rule: HeaderRule): Promise<string> => {\n // 组合 base + counter 生成唯一 ID,避免冲突\n const ruleId = this.ruleIdBase + this.ruleIdCounter++\n const id = `rule_${ruleId}`\n\n await chrome.declarativeNetRequest.updateDynamicRules({\n removeRuleIds: [ruleId],\n })\n\n await chrome.declarativeNetRequest.updateDynamicRules({\n addRules: [\n {\n id: ruleId,\n priority: 1,\n action: {\n type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS,\n requestHeaders: Object.entries(rule.headers).map(\n ([header, value]) => ({\n header,\n operation: chrome.declarativeNetRequest.HeaderOperation.SET,\n value,\n })\n ),\n },\n condition: {\n urlFilter: rule.urlFilter,\n // 只对扩展自身发起的请求生效,不影响其他网页\n initiatorDomains: [chrome.runtime.id],\n resourceTypes: (rule.resourceTypes || [\n 'xmlhttprequest',\n ]) as chrome.declarativeNetRequest.ResourceType[],\n },\n },\n ],\n })\n\n return id\n },\n\n remove: async (ruleId: string): Promise<void> => {\n const id = parseInt(ruleId.replace('rule_', ''), 10)\n await chrome.declarativeNetRequest.updateDynamicRules({\n removeRuleIds: [id],\n })\n },\n\n clear: async (): Promise<void> => {\n const rules = await chrome.declarativeNetRequest.getDynamicRules()\n await chrome.declarativeNetRequest.updateDynamicRules({\n removeRuleIds: rules.map(r => r.id),\n })\n },\n }\n\n /**\n * 文件下载\n * Service Worker 中不支持 URL.createObjectURL,使用 data URL 替代\n */\n downloads = {\n async download(blob: Blob, filename: string, saveAs = true): Promise<number> {\n // 将 Blob 转换为 data URL\n const buffer = await blob.arrayBuffer()\n const base64 = btoa(\n new Uint8Array(buffer).reduce((data, byte) => data + String.fromCharCode(byte), '')\n )\n const mimeType = blob.type || 'application/octet-stream'\n const dataUrl = `data:${mimeType};base64,${base64}`\n\n const downloadId = await chrome.downloads.download({\n url: dataUrl,\n filename,\n saveAs,\n })\n return downloadId\n },\n }\n\n /**\n * Tab 管理\n */\n tabs = {\n async query(urlPattern: string): Promise<Array<{ id: number; url?: string }>> {\n const tabs = await chrome.tabs.query({ url: urlPattern })\n return tabs.filter(t => t.id !== undefined).map(t => ({ id: t.id!, url: t.url }))\n },\n\n create: async (url: string, active = false): Promise<{ id: number }> => {\n const tab = await chrome.tabs.create({ url, active })\n await this.addToRuntimeTabGroup(tab.id!)\n return { id: tab.id! }\n },\n\n close: async (tabId: number): Promise<void> => {\n await chrome.tabs.remove(tabId)\n },\n\n async waitForLoad(tabId: number, timeout = 30000): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n chrome.tabs.onUpdated.removeListener(listener)\n reject(new Error('Tab load timeout'))\n }, timeout)\n\n const listener = (updatedTabId: number, info: chrome.tabs.TabChangeInfo) => {\n if (updatedTabId === tabId && info.status === 'complete') {\n clearTimeout(timeoutId)\n chrome.tabs.onUpdated.removeListener(listener)\n // 额外等待让页面 JS 初始化\n setTimeout(resolve, 1000)\n }\n }\n chrome.tabs.onUpdated.addListener(listener)\n })\n },\n\n withManagedTab: async <T>(\n options: ManagedTabOptions,\n callback: (tab: ManagedTabHandle) => Promise<T> | T\n ): Promise<T> => {\n const patterns = Array.isArray(options.urlPattern)\n ? options.urlPattern\n : [options.urlPattern]\n\n for (const pattern of patterns) {\n const tabs = await this.tabs.query(pattern)\n const existing = tabs.find(tab =>\n typeof tab.id === 'number'\n && (!options.match || options.match(tab))\n )\n if (existing) {\n return callback({\n id: existing.id,\n url: existing.url,\n owned: false,\n })\n }\n }\n\n const tab = await this.tabs.create(options.createUrl, options.active ?? false)\n const ownedTab: ManagedTabHandle = {\n id: tab.id,\n owned: true,\n }\n\n if (options.waitForLoad !== false) {\n await this.tabs.waitForLoad(tab.id, options.loadTimeout ?? 30000)\n }\n\n try {\n return await callback(ownedTab)\n } finally {\n if (options.closeWhenDone !== false) {\n await this.tabs.close(tab.id)\n }\n }\n },\n\n async executeScript<T, A extends unknown[]>(\n tabId: number,\n func: (...args: A) => T | Promise<T>,\n args: A\n ): Promise<T> {\n const results = await chrome.scripting.executeScript({\n target: { tabId },\n world: 'MAIN',\n func: func as (...args: unknown[]) => unknown,\n args: args as unknown[],\n })\n\n const result = results[0]?.result as T\n return result\n },\n }\n\n private async addToRuntimeTabGroup(tabId: number): Promise<void> {\n if (!chrome.tabs.group || !chrome.tabGroups?.update) return\n\n try {\n const groupId = await chrome.tabs.group({\n tabIds: [tabId],\n ...(this.runtimeTabGroupId === null ? {} : { groupId: this.runtimeTabGroupId }),\n })\n if (this.runtimeTabGroupId === null) {\n this.runtimeTabGroupId = groupId\n await chrome.tabGroups.update(groupId, {\n title: RUNTIME_TAB_GROUP_TITLE,\n color: 'grey',\n collapsed: true,\n })\n }\n } catch (error) {\n console.warn('Failed to group Article Publish runtime tab:', error)\n }\n }\n\n /**\n * DOM 操作 - 通过 Offscreen Document 实现\n */\n dom = {\n parseHTML: async (html: string): Promise<Document> => {\n const parser = new DOMParser()\n return parser.parseFromString(html, 'text/html')\n },\n\n querySelector: (doc: Document, selector: string): Element | null => {\n return doc.querySelector(selector)\n },\n\n querySelectorAll: (doc: Document, selector: string): Element[] => {\n return Array.from(doc.querySelectorAll(selector))\n },\n\n getTextContent: (element: Element): string => {\n return element.textContent || ''\n },\n\n getInnerHTML: (element: Element): string => {\n return element.innerHTML\n },\n }\n}\n\n/**\n * 创建扩展运行时实例\n */\nexport function createExtensionRuntime(config?: RuntimeConfig): ExtensionRuntime {\n return new ExtensionRuntime(config)\n}\n"],"mappings":"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","names":["tab"]}
|