@chainlesschain/personal-data-hub 0.4.18 → 0.4.24
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/__tests__/adapters/bank-family.test.js +125 -0
- package/__tests__/adapters/biz-tianyancha.test.js +159 -0
- package/__tests__/adapters/car-mercedesme.test.js +74 -0
- package/__tests__/adapters/doc-camscanner.test.js +147 -0
- package/__tests__/adapters/finance-dcep.test.js +74 -0
- package/__tests__/adapters/fitness-joyrun.test.js +82 -0
- package/__tests__/adapters/gov-12123.test.js +103 -0
- package/__tests__/adapters/gov-ixiamen.test.js +150 -0
- package/__tests__/adapters/gov-tax.test.js +135 -0
- package/__tests__/adapters/health-meiyou.test.js +125 -0
- package/__tests__/adapters/music-qq.test.js +112 -0
- package/__tests__/adapters/reading-family.test.js +108 -0
- package/__tests__/adapters/social-dongchedi.test.js +165 -0
- package/__tests__/adapters/travel-didi-consumer.test.js +66 -0
- package/__tests__/adapters/video-xigua.test.js +106 -0
- package/__tests__/adapters/wework-pc.test.js +124 -0
- package/__tests__/audio-ximalaya-snapshot.test.js +279 -0
- package/__tests__/fitness-keep-snapshot.test.js +224 -0
- package/__tests__/shopping-eleme-snapshot.test.js +454 -0
- package/__tests__/shopping-vipshop-snapshot.test.js +425 -0
- package/__tests__/shopping-xianyu-snapshot.test.js +451 -0
- package/__tests__/social-douban-snapshot.test.js +351 -0
- package/lib/adapter-guide.js +31 -3
- package/lib/adapters/_bank-base.js +405 -0
- package/lib/adapters/_reading-base.js +315 -0
- package/lib/adapters/audio-ximalaya/index.js +414 -0
- package/lib/adapters/bank-bankcomm/index.js +27 -0
- package/lib/adapters/bank-boc/index.js +26 -0
- package/lib/adapters/bank-cmbc/index.js +26 -0
- package/lib/adapters/bank-icbc/index.js +27 -0
- package/lib/adapters/biz-tianyancha/index.js +348 -0
- package/lib/adapters/car-mercedesme/index.js +225 -0
- package/lib/adapters/doc-camscanner/index.js +102 -0
- package/lib/adapters/finance-dcep/index.js +302 -0
- package/lib/adapters/fitness-joyrun/index.js +295 -0
- package/lib/adapters/fitness-keep/index.js +343 -0
- package/lib/adapters/gov-12123/index.js +391 -0
- package/lib/adapters/gov-ixiamen/index.js +380 -0
- package/lib/adapters/gov-tax/index.js +451 -0
- package/lib/adapters/health-meiyou/index.js +393 -0
- package/lib/adapters/music-qq/index.js +372 -0
- package/lib/adapters/reading-fanqie/index.js +61 -0
- package/lib/adapters/reading-qimao/index.js +61 -0
- package/lib/adapters/shopping-eleme/index.js +441 -0
- package/lib/adapters/shopping-vipshop/index.js +429 -0
- package/lib/adapters/shopping-xianyu/index.js +454 -0
- package/lib/adapters/social-dongchedi/index.js +360 -0
- package/lib/adapters/social-douban/index.js +564 -0
- package/lib/adapters/travel-didi-consumer/index.js +148 -0
- package/lib/adapters/video-xigua/index.js +68 -0
- package/lib/adapters/wework-pc/index.js +31 -0
- package/lib/index.js +52 -0
- package/package.json +1 -1
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* §12.1 Phase 13+ — 滴滴出行 consumer app (com.sdu.didi.psnger) ride adapter.
|
|
3
|
+
* Device-discovered gap (2026-06-15): distinct from travel-didi (滴滴企业版,
|
|
4
|
+
* com.didi.es.psngr). Same ride→car TravelRecord shape, so it REUSES
|
|
5
|
+
* travel-didi's order mapping helpers; only NAME + the consumer order-centre
|
|
6
|
+
* endpoint differ.
|
|
7
|
+
*
|
|
8
|
+
* BEST-EFFORT: api.udache.com / common.diditaxi.com.cn endpoints are FABRICATED
|
|
9
|
+
* placeholders (overridable via opts.ordersUrl, NOT field-verified — FAMILY-23
|
|
10
|
+
* playbook); snapshot/file-import is the reliable path; cookie path surfaces
|
|
11
|
+
* auth.unverified=true. sensitivity:"medium" (ride start/end addresses).
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
"use strict";
|
|
15
|
+
|
|
16
|
+
const fs = require("node:fs");
|
|
17
|
+
const { normalizeTravelRecord } = require("../travel-base");
|
|
18
|
+
const { CookieAuth } = require("../shopping-base");
|
|
19
|
+
const { orderToRecord, extractOrders, parseRecords } = require("../travel-didi");
|
|
20
|
+
|
|
21
|
+
const NAME = "travel-didi-consumer";
|
|
22
|
+
const VERSION = "0.1.0";
|
|
23
|
+
|
|
24
|
+
// Best-effort 滴滴出行 (consumer) order-list endpoint. Overridable via opts.ordersUrl.
|
|
25
|
+
const DIDI_CONSUMER_ORDERS_URL = "https://api.udache.com/gulfstream/api/v1/order/list";
|
|
26
|
+
const DEFAULT_PAGE_SIZE = 20;
|
|
27
|
+
const DEFAULT_MAX_PAGES = 10;
|
|
28
|
+
|
|
29
|
+
class DidiConsumerAdapter {
|
|
30
|
+
constructor(opts = {}) {
|
|
31
|
+
this.account = opts.account || null;
|
|
32
|
+
this._dataPath = opts.dataPath || null;
|
|
33
|
+
this._cookieAuth =
|
|
34
|
+
opts.account && opts.account.cookies ? new CookieAuth({ platform: "didi", cookies: opts.account.cookies }) : null;
|
|
35
|
+
this._fetchFn = typeof opts.fetchFn === "function" ? opts.fetchFn : defaultFetch;
|
|
36
|
+
this._signProvider = typeof opts.signProvider === "function" ? opts.signProvider : null;
|
|
37
|
+
this._ordersUrl =
|
|
38
|
+
typeof opts.ordersUrl === "string" && opts.ordersUrl.length > 0 ? opts.ordersUrl : DIDI_CONSUMER_ORDERS_URL;
|
|
39
|
+
|
|
40
|
+
this.name = NAME;
|
|
41
|
+
this.version = VERSION;
|
|
42
|
+
this.capabilities = ["import:json", "sync:snapshot", "sync:cookie-api", "parse:didi-rides"];
|
|
43
|
+
this.extractMode = "file-import";
|
|
44
|
+
this.rateLimits = {};
|
|
45
|
+
this.dataDisclosure = {
|
|
46
|
+
fields: ["didi:orderId / fromAddress / toAddress / departTime / arriveTime / fare / carType"],
|
|
47
|
+
sensitivity: "medium",
|
|
48
|
+
legalGate: false,
|
|
49
|
+
};
|
|
50
|
+
this._deps = { fs };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async authenticate(ctx = {}) {
|
|
54
|
+
const filePath = (ctx && ctx.inputPath) || ctx.dataPath || this._dataPath;
|
|
55
|
+
if (filePath) {
|
|
56
|
+
try {
|
|
57
|
+
this._deps.fs.accessSync(filePath, this._deps.fs.constants.R_OK);
|
|
58
|
+
} catch (err) {
|
|
59
|
+
return { ok: false, reason: "INPUT_PATH_UNREADABLE", message: `not readable at ${filePath}: ${err.message}` };
|
|
60
|
+
}
|
|
61
|
+
return { ok: true, mode: "snapshot-file" };
|
|
62
|
+
}
|
|
63
|
+
if (this._cookieAuth) {
|
|
64
|
+
const ok = await this._cookieAuth.validate();
|
|
65
|
+
if (!ok) return { ok: false, reason: "INVALID_COOKIE", error: "cookies missing" };
|
|
66
|
+
return { ok: true, account: (this.account && this.account.phone) || null, mode: "cookie", unverified: true };
|
|
67
|
+
}
|
|
68
|
+
return { ok: true, account: null, mode: "ready" };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async healthCheck() {
|
|
72
|
+
if (this._cookieAuth) {
|
|
73
|
+
const r = await this.authenticate();
|
|
74
|
+
return r.ok ? { ok: true, lastChecked: Date.now(), unverified: true } : { ok: false, reason: r.reason, error: r.error };
|
|
75
|
+
}
|
|
76
|
+
return { ok: true, lastChecked: Date.now() };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async *sync(opts = {}) {
|
|
80
|
+
const dataPath = opts.inputPath || opts.dataPath || this._dataPath;
|
|
81
|
+
if (dataPath) {
|
|
82
|
+
if (!this._deps.fs.existsSync(dataPath)) return;
|
|
83
|
+
const text = this._deps.fs.readFileSync(dataPath, "utf-8");
|
|
84
|
+
let records;
|
|
85
|
+
try {
|
|
86
|
+
records = parseRecords(text);
|
|
87
|
+
} catch (err) {
|
|
88
|
+
throw new Error(`DidiConsumerAdapter: parse failed: ${err.message}`);
|
|
89
|
+
}
|
|
90
|
+
for (const r of records) {
|
|
91
|
+
// re-stamp vendor so dedup IDs don't collide with the enterprise adapter
|
|
92
|
+
yield { adapter: NAME, originalId: r.recordId, capturedAt: r.bookedAt || r.departureMs || Date.now(), payload: { record: r } };
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (this._cookieAuth) yield* this._syncViaCookie(opts);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async *_syncViaCookie(opts = {}) {
|
|
100
|
+
if (!(await this._cookieAuth.validate())) return;
|
|
101
|
+
const cookies = this._cookieAuth.toHeader();
|
|
102
|
+
const sinceMs = opts.sinceWatermark != null ? parseInt(String(opts.sinceWatermark), 10) || 0 : Date.now() - 365 * 24 * 3600_000;
|
|
103
|
+
const pageSize = Number.isFinite(opts.pageSize) ? opts.pageSize : DEFAULT_PAGE_SIZE;
|
|
104
|
+
const maxPages = Number.isInteger(opts.maxPages) && opts.maxPages > 0 ? opts.maxPages : DEFAULT_MAX_PAGES;
|
|
105
|
+
const limit = Number.isInteger(opts.limit) && opts.limit > 0 ? opts.limit : Infinity;
|
|
106
|
+
|
|
107
|
+
let emitted = 0;
|
|
108
|
+
let pageIndex = 1;
|
|
109
|
+
while (pageIndex <= maxPages) {
|
|
110
|
+
const query = { pageIndex, pageSize, ts: Date.now() };
|
|
111
|
+
let sign = null;
|
|
112
|
+
if (this._signProvider) sign = await this._signProvider({ url: this._ordersUrl, query, cookies });
|
|
113
|
+
const resp = await this._fetchFn({ url: this._ordersUrl, cookies, query, sign });
|
|
114
|
+
const rides = extractOrders(resp);
|
|
115
|
+
if (!rides.length) break;
|
|
116
|
+
let pageHasNew = false;
|
|
117
|
+
let reachedWatermark = false;
|
|
118
|
+
for (const raw of rides) {
|
|
119
|
+
const rec = orderToRecord(raw, { capturedVia: "cookie-api" });
|
|
120
|
+
if (!rec) continue;
|
|
121
|
+
const ts = rec.departureMs || rec.bookedAt || null;
|
|
122
|
+
if (ts && ts < sinceMs) {
|
|
123
|
+
reachedWatermark = true;
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
pageHasNew = true;
|
|
127
|
+
if (emitted >= limit) return;
|
|
128
|
+
yield { adapter: NAME, originalId: rec.recordId, capturedAt: ts || Date.now(), payload: { record: rec } };
|
|
129
|
+
emitted += 1;
|
|
130
|
+
}
|
|
131
|
+
if (reachedWatermark || !pageHasNew || rides.length < pageSize) break;
|
|
132
|
+
pageIndex += 1;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
normalize(raw) {
|
|
137
|
+
if (!raw || !raw.payload || !raw.payload.record) {
|
|
138
|
+
throw new Error("DidiConsumerAdapter.normalize: raw.payload.record missing");
|
|
139
|
+
}
|
|
140
|
+
return normalizeTravelRecord(raw.payload.record, { adapterName: NAME, adapterVersion: VERSION });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async function defaultFetch(_opts) {
|
|
145
|
+
throw new Error("travel-didi-consumer: no fetchFn configured for cookie-api mode");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
module.exports = { DidiConsumerAdapter, NAME, VERSION };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* §13+ — 西瓜视频 (Xigua / Ixigua, com.ss.android.article.video) adapter.
|
|
3
|
+
* §12.1 Phase 13+ ROI ⭐⭐ "观看历史". Thin wrapper over _video-base.
|
|
4
|
+
*
|
|
5
|
+
* 西瓜视频 (ByteDance) exposes the user's watch history + favourites via
|
|
6
|
+
* ixigua.com APIs; this adapter supplies the endpoints + field mapping, the base
|
|
7
|
+
* handles snapshot + cookie-api orchestration + normalize (MEDIA / LIKE event +
|
|
8
|
+
* MEDIA item). Endpoints best-effort + overridable (some need a ByteDance signed
|
|
9
|
+
* token via opts.signProvider — not field-verified, FAMILY-23 playbook).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
"use strict";
|
|
13
|
+
|
|
14
|
+
const { createVideoAdapter, parseTime, SNAPSHOT_SCHEMA_VERSION } = require("../_video-base");
|
|
15
|
+
|
|
16
|
+
const NAME = "video-xigua";
|
|
17
|
+
const VERSION = "0.1.0";
|
|
18
|
+
|
|
19
|
+
const WATCH_URL = "https://api.ixigua.com/api/history/list";
|
|
20
|
+
const FAVOURITE_URL = "https://api.ixigua.com/api/favorite/list";
|
|
21
|
+
|
|
22
|
+
function extractItems(resp) {
|
|
23
|
+
if (!resp || typeof resp !== "object") return [];
|
|
24
|
+
if (Array.isArray(resp.data)) return resp.data;
|
|
25
|
+
if (Array.isArray(resp.list)) return resp.list;
|
|
26
|
+
const d = resp.data;
|
|
27
|
+
if (d && typeof d === "object") {
|
|
28
|
+
if (Array.isArray(d.list)) return d.list;
|
|
29
|
+
if (Array.isArray(d.records)) return d.records;
|
|
30
|
+
if (Array.isArray(d.history)) return d.history;
|
|
31
|
+
if (Array.isArray(d.favorites)) return d.favorites;
|
|
32
|
+
}
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function mapItem(it) {
|
|
37
|
+
if (!it || typeof it !== "object") return null;
|
|
38
|
+
// ByteDance items nest the video under article/item_info on some endpoints.
|
|
39
|
+
const v = it.article || it.item_info || it.video || it;
|
|
40
|
+
const videoId = v.group_id || v.groupId || v.item_id || v.gid || v.vid || v.id || it.group_id || it.id;
|
|
41
|
+
if (!videoId) return null;
|
|
42
|
+
return {
|
|
43
|
+
videoId: String(videoId),
|
|
44
|
+
title: v.title || v.video_title || v.name || it.title || "(未知视频)",
|
|
45
|
+
category: v.category || v.category_name || v.channel || null,
|
|
46
|
+
episode: null,
|
|
47
|
+
channel: v.user_name || v.author_name || v.source || null,
|
|
48
|
+
durationSec: Number.isFinite(v.video_duration)
|
|
49
|
+
? v.video_duration
|
|
50
|
+
: Number.isFinite(v.duration)
|
|
51
|
+
? v.duration
|
|
52
|
+
: null,
|
|
53
|
+
url: v.share_url || v.url || (videoId ? `https://www.ixigua.com/${videoId}` : null),
|
|
54
|
+
occurredAt: parseTime(it.behot_time || it.action_time || it.create_time || v.behot_time || v.publish_time),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const XiguaVideoAdapter = createVideoAdapter({
|
|
59
|
+
NAME,
|
|
60
|
+
VERSION,
|
|
61
|
+
platform: "xigua",
|
|
62
|
+
watchUrl: WATCH_URL,
|
|
63
|
+
favouriteUrl: FAVOURITE_URL,
|
|
64
|
+
extractItems,
|
|
65
|
+
mapItem,
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
module.exports = { XiguaVideoAdapter, extractItems, mapItem, NAME, VERSION, SNAPSHOT_SCHEMA_VERSION };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 企业微信 (WeChat Work / WeCom) 电脑版 — honest best-effort local IM DB reader
|
|
5
|
+
* (qq-pc / dingtalk-pc / feishu-pc 模式).
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ v0.1: 企业微信桌面本地库(C:\\Users\\<user>\\Documents\\WXWork\\...)为私有
|
|
8
|
+
* 结构、通常加密(同微信 SQLCipher 系)、随版本变化。本 adapter 做到可靠开库 +
|
|
9
|
+
* 发现消息表 + 防御探测列 + 保留原始行 + 响亮诊断;文本解析尽力而为,真机上按需
|
|
10
|
+
* 扩展 colCandidates。建议先把库解密为明文(或采集时附带 --key)再指向它。
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const { createLocalImPcAdapter } = require("../_local-im-pc-adapter");
|
|
14
|
+
|
|
15
|
+
const WeWorkPcAdapter = createLocalImPcAdapter({
|
|
16
|
+
name: "wework-pc",
|
|
17
|
+
platform: "wework",
|
|
18
|
+
version: "0.1.0",
|
|
19
|
+
tablePattern: /msg|message|chat|conversation|im_|session/i,
|
|
20
|
+
colCandidates: {
|
|
21
|
+
// 企业微信常见列猜测(真机微调)
|
|
22
|
+
time: ["createTime", "create_time", "msgCreateTime", "sendTime", "send_time", "timestamp"],
|
|
23
|
+
sender: ["sender", "senderId", "fromUser", "from", "talker", "vid"],
|
|
24
|
+
peer: ["conversationId", "roomId", "chatId", "talker", "toUser", "conversation"],
|
|
25
|
+
content: ["content", "text", "msgContent", "message", "digest", "summary"],
|
|
26
|
+
},
|
|
27
|
+
needHint:
|
|
28
|
+
"wework-pc: 需提供企业微信桌面本地库路径(WXWork 目录下,私有/通常加密,建议先解密为明文或提供 key)",
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
module.exports = { WeWorkPcAdapter, NAME: "wework-pc", VERSION: "0.1.0" };
|
package/lib/index.js
CHANGED
|
@@ -48,13 +48,19 @@ const shoppingBase = require("./adapters/shopping-base");
|
|
|
48
48
|
const { TaobaoAdapter } = require("./adapters/shopping-taobao");
|
|
49
49
|
const { JdAdapter } = require("./adapters/shopping-jd");
|
|
50
50
|
const { MeituanAdapter } = require("./adapters/shopping-meituan");
|
|
51
|
+
const { ElemeAdapter } = require("./adapters/shopping-eleme");
|
|
51
52
|
const { PinduoduoAdapter } = require("./adapters/shopping-pinduoduo");
|
|
52
53
|
const { DianpingAdapter } = require("./adapters/shopping-dianping");
|
|
54
|
+
const { XianyuAdapter } = require("./adapters/shopping-xianyu");
|
|
55
|
+
const { VipshopAdapter } = require("./adapters/shopping-vipshop");
|
|
53
56
|
const { BilibiliAdapter } = require("./adapters/social-bilibili");
|
|
54
57
|
const { WeiboAdapter } = require("./adapters/social-weibo");
|
|
55
58
|
const { ZhihuAdapter } = require("./adapters/social-zhihu");
|
|
59
|
+
const { DoubanAdapter } = require("./adapters/social-douban");
|
|
56
60
|
const { BossZhipinAdapter } = require("./adapters/recruit-boss");
|
|
57
61
|
const { CsdnAdapter } = require("./adapters/social-csdn");
|
|
62
|
+
const { DongchediAdapter } = require("./adapters/social-dongchedi");
|
|
63
|
+
const { TianyanchaAdapter } = require("./adapters/biz-tianyancha");
|
|
58
64
|
const { DouyinAdapter } = require("./adapters/social-douyin");
|
|
59
65
|
const { XiaohongshuAdapter } = require("./adapters/social-xiaohongshu");
|
|
60
66
|
const { ToutiaoAdapter } = require("./adapters/social-toutiao");
|
|
@@ -71,14 +77,34 @@ const { QQPcAdapter } = require("./adapters/qq-pc");
|
|
|
71
77
|
const { AppleHealthAdapter } = require("./adapters/apple-health");
|
|
72
78
|
const { NeteaseMusicAdapter } = require("./adapters/netease-music");
|
|
73
79
|
const { KugouMusicAdapter } = require("./adapters/music-kugou");
|
|
80
|
+
const { QQMusicAdapter } = require("./adapters/music-qq");
|
|
81
|
+
const { XimalayaAdapter } = require("./adapters/audio-ximalaya");
|
|
82
|
+
const { FanqieReadingAdapter } = require("./adapters/reading-fanqie");
|
|
83
|
+
const { QimaoReadingAdapter } = require("./adapters/reading-qimao");
|
|
84
|
+
const { JoyrunAdapter } = require("./adapters/fitness-joyrun");
|
|
85
|
+
const { KeepAdapter } = require("./adapters/fitness-keep");
|
|
86
|
+
const { DidiConsumerAdapter } = require("./adapters/travel-didi-consumer");
|
|
87
|
+
const { MercedesMeAdapter } = require("./adapters/car-mercedesme");
|
|
74
88
|
const { IqiyiVideoAdapter } = require("./adapters/video-iqiyi");
|
|
75
89
|
const { TencentVideoAdapter } = require("./adapters/video-tencent");
|
|
90
|
+
const { XiguaVideoAdapter } = require("./adapters/video-xigua");
|
|
76
91
|
const { WeReadAdapter } = require("./adapters/weread");
|
|
77
92
|
const { WpsDocAdapter } = require("./adapters/doc-wps");
|
|
78
93
|
const { TencentDocsAdapter } = require("./adapters/doc-tencent-docs");
|
|
79
94
|
const { BaiduNetdiskAdapter } = require("./adapters/doc-baidu-netdisk");
|
|
95
|
+
const { CamScannerDocAdapter } = require("./adapters/doc-camscanner");
|
|
96
|
+
const { IXiamenAdapter } = require("./adapters/gov-ixiamen");
|
|
97
|
+
const { MeiyouAdapter } = require("./adapters/health-meiyou");
|
|
98
|
+
const { TaxAdapter } = require("./adapters/gov-tax");
|
|
99
|
+
const { CmbcBankAdapter } = require("./adapters/bank-cmbc");
|
|
100
|
+
const { BocBankAdapter } = require("./adapters/bank-boc");
|
|
101
|
+
const { BankcommBankAdapter } = require("./adapters/bank-bankcomm");
|
|
102
|
+
const { IcbcBankAdapter } = require("./adapters/bank-icbc");
|
|
103
|
+
const { DcepAdapter } = require("./adapters/finance-dcep");
|
|
104
|
+
const { Tmri12123Adapter } = require("./adapters/gov-12123");
|
|
80
105
|
const { DingTalkPcAdapter } = require("./adapters/dingtalk-pc");
|
|
81
106
|
const { FeishuPcAdapter } = require("./adapters/feishu-pc");
|
|
107
|
+
const { WeWorkPcAdapter } = require("./adapters/wework-pc");
|
|
82
108
|
const { TelegramAdapter } = require("./adapters/messaging-telegram");
|
|
83
109
|
const { WhatsAppAdapter } = require("./adapters/messaging-whatsapp");
|
|
84
110
|
const entityResolver = require("./entity-resolver");
|
|
@@ -288,15 +314,21 @@ module.exports = {
|
|
|
288
314
|
TaobaoAdapter,
|
|
289
315
|
JdAdapter,
|
|
290
316
|
MeituanAdapter,
|
|
317
|
+
ElemeAdapter,
|
|
291
318
|
PinduoduoAdapter,
|
|
292
319
|
DianpingAdapter,
|
|
320
|
+
XianyuAdapter,
|
|
321
|
+
VipshopAdapter,
|
|
293
322
|
|
|
294
323
|
// Phase 13+ — long-tail social + messaging (借 sjqz parsers)
|
|
295
324
|
BilibiliAdapter,
|
|
296
325
|
WeiboAdapter,
|
|
297
326
|
ZhihuAdapter,
|
|
327
|
+
DoubanAdapter,
|
|
298
328
|
BossZhipinAdapter,
|
|
299
329
|
CsdnAdapter,
|
|
330
|
+
DongchediAdapter,
|
|
331
|
+
TianyanchaAdapter,
|
|
300
332
|
DouyinAdapter,
|
|
301
333
|
XiaohongshuAdapter,
|
|
302
334
|
ToutiaoAdapter,
|
|
@@ -312,14 +344,34 @@ module.exports = {
|
|
|
312
344
|
AppleHealthAdapter,
|
|
313
345
|
NeteaseMusicAdapter,
|
|
314
346
|
KugouMusicAdapter,
|
|
347
|
+
QQMusicAdapter,
|
|
348
|
+
XimalayaAdapter,
|
|
349
|
+
FanqieReadingAdapter,
|
|
350
|
+
QimaoReadingAdapter,
|
|
351
|
+
JoyrunAdapter,
|
|
352
|
+
KeepAdapter,
|
|
353
|
+
DidiConsumerAdapter,
|
|
354
|
+
MercedesMeAdapter,
|
|
315
355
|
IqiyiVideoAdapter,
|
|
316
356
|
TencentVideoAdapter,
|
|
357
|
+
XiguaVideoAdapter,
|
|
317
358
|
WeReadAdapter,
|
|
318
359
|
WpsDocAdapter,
|
|
319
360
|
TencentDocsAdapter,
|
|
320
361
|
BaiduNetdiskAdapter,
|
|
362
|
+
CamScannerDocAdapter,
|
|
363
|
+
IXiamenAdapter,
|
|
364
|
+
MeiyouAdapter,
|
|
365
|
+
TaxAdapter,
|
|
366
|
+
CmbcBankAdapter,
|
|
367
|
+
BocBankAdapter,
|
|
368
|
+
BankcommBankAdapter,
|
|
369
|
+
IcbcBankAdapter,
|
|
370
|
+
DcepAdapter,
|
|
371
|
+
Tmri12123Adapter,
|
|
321
372
|
DingTalkPcAdapter,
|
|
322
373
|
FeishuPcAdapter,
|
|
374
|
+
WeWorkPcAdapter,
|
|
323
375
|
TelegramAdapter,
|
|
324
376
|
WhatsAppAdapter,
|
|
325
377
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chainlesschain/personal-data-hub",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.24",
|
|
4
4
|
"description": "Personal Data Hub — UnifiedSchema + validators + KG ingest helpers for the data-back-to-the-individual middleware",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "lib/index.js",
|