weflow-cli 1.8.2 โ 1.10.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/ARCHITECTURE.md +62 -26
- package/CHANGELOG.md +1290 -0
- package/OPERATIONS.md +144 -11
- package/README.en.md +20 -4
- package/README.md +30 -5
- package/bin/weflow-cli-electron.cjs +2 -0
- package/bin/weflow-cli.ts +996 -118
- package/dist/bin/weflow-cli.js +1038 -146
- package/dist/bin/weflow-cli.js.map +1 -1
- package/dist/mcp-server/http.d.ts +14 -0
- package/dist/mcp-server/http.d.ts.map +1 -0
- package/dist/mcp-server/http.js +84 -0
- package/dist/mcp-server/http.js.map +1 -0
- package/dist/mcp-server/httpConfig.d.ts +50 -0
- package/dist/mcp-server/httpConfig.d.ts.map +1 -0
- package/dist/mcp-server/httpConfig.js +104 -0
- package/dist/mcp-server/httpConfig.js.map +1 -0
- package/dist/mcp-server/index.d.ts +13 -1
- package/dist/mcp-server/index.d.ts.map +1 -1
- package/dist/mcp-server/index.js +58 -374
- package/dist/mcp-server/index.js.map +1 -1
- package/dist/src/core/dbPathService.d.ts +12 -0
- package/dist/src/core/dbPathService.d.ts.map +1 -1
- package/dist/src/core/dbPathService.js +20 -3
- package/dist/src/core/dbPathService.js.map +1 -1
- package/dist/src/panel/server.d.ts.map +1 -1
- package/dist/src/panel/server.js +61 -1
- package/dist/src/panel/server.js.map +1 -1
- package/dist/src/services/assistantEval.d.ts +69 -0
- package/dist/src/services/assistantEval.d.ts.map +1 -1
- package/dist/src/services/assistantEval.js +270 -8
- package/dist/src/services/assistantEval.js.map +1 -1
- package/dist/src/services/assistantScenes.d.ts +81 -0
- package/dist/src/services/assistantScenes.d.ts.map +1 -0
- package/dist/src/services/assistantScenes.js +322 -0
- package/dist/src/services/assistantScenes.js.map +1 -0
- package/dist/src/services/assistantService.d.ts +33 -4
- package/dist/src/services/assistantService.d.ts.map +1 -1
- package/dist/src/services/assistantService.js +102 -6
- package/dist/src/services/assistantService.js.map +1 -1
- package/dist/src/services/assistantSkills.d.ts +94 -0
- package/dist/src/services/assistantSkills.d.ts.map +1 -0
- package/dist/src/services/assistantSkills.js +330 -0
- package/dist/src/services/assistantSkills.js.map +1 -0
- package/dist/src/services/assistantTools.d.ts +34 -1
- package/dist/src/services/assistantTools.d.ts.map +1 -1
- package/dist/src/services/assistantTools.js +931 -88
- package/dist/src/services/assistantTools.js.map +1 -1
- package/dist/src/services/assistantTrace.d.ts +4 -0
- package/dist/src/services/assistantTrace.d.ts.map +1 -1
- package/dist/src/services/assistantTrace.js +9 -0
- package/dist/src/services/assistantTrace.js.map +1 -1
- package/dist/src/services/configService.d.ts +9 -0
- package/dist/src/services/configService.d.ts.map +1 -1
- package/dist/src/services/configService.js +5 -2
- package/dist/src/services/configService.js.map +1 -1
- package/dist/src/services/messageQuery.d.ts +18 -0
- package/dist/src/services/messageQuery.d.ts.map +1 -1
- package/dist/src/services/messageQuery.js +29 -0
- package/dist/src/services/messageQuery.js.map +1 -1
- package/dist/src/services/outboundSend.d.ts +53 -0
- package/dist/src/services/outboundSend.d.ts.map +1 -0
- package/dist/src/services/outboundSend.js +90 -0
- package/dist/src/services/outboundSend.js.map +1 -0
- package/dist/src/services/pythonBridge.d.ts.map +1 -1
- package/dist/src/services/pythonBridge.js +1 -0
- package/dist/src/services/pythonBridge.js.map +1 -1
- package/dist/src/services/wechatClient.d.ts +125 -0
- package/dist/src/services/wechatClient.d.ts.map +1 -0
- package/dist/src/services/wechatClient.js +344 -0
- package/dist/src/services/wechatClient.js.map +1 -0
- package/dist/src/services/wechatMedia.d.ts +44 -0
- package/dist/src/services/wechatMedia.d.ts.map +1 -0
- package/dist/src/services/wechatMedia.js +155 -0
- package/dist/src/services/wechatMedia.js.map +1 -0
- package/dist/src/services/wechatMessageService.d.ts +11 -0
- package/dist/src/services/wechatMessageService.d.ts.map +1 -1
- package/dist/src/services/wechatMessageService.js +55 -11
- package/dist/src/services/wechatMessageService.js.map +1 -1
- package/dist/src/types.d.ts +4 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/python.js +2 -2
- package/dist/src/utils/python.js.map +1 -1
- package/docs/BRANCHES.md +37 -0
- package/docs/CONTACT_DB_SCHEMA.md +1085 -0
- package/docs/DECISIONS.md +1624 -0
- package/docs/EXTENDING.md +98 -10
- package/docs/FUNCTIONAL-IMPROVEMENT-SPEC.md +6 -0
- package/docs/HEALTH-CHECK.md +12 -7
- package/docs/JEV/345/272/224/347/224/250/346/226/275/345/267/245/346/226/207/346/241/243.md +2 -2
- package/docs/MCP.md +58 -4
- package/docs/PROJECT_STATE.md +180 -11
- package/docs/RELEASING.md +115 -1
- package/docs/images/weflow-architecture-gpt-image-2.png +0 -0
- package/logo.png +0 -0
- package/mcp-server/http.ts +108 -0
- package/mcp-server/httpConfig.ts +126 -0
- package/mcp-server/index.ts +359 -681
- package/package.json +5 -3
- package/resources/js/graph3d/NOTICE.txt +35 -0
- package/resources/js/graph3d/d3-binarytree.min.js +2 -0
- package/resources/js/graph3d/d3-dispatch.min.js +2 -0
- package/resources/js/graph3d/d3-force-3d.min.js +2 -0
- package/resources/js/graph3d/d3-octree.min.js +2 -0
- package/resources/js/graph3d/d3-quadtree.min.js +2 -0
- package/resources/js/graph3d/d3-timer.min.js +2 -0
- package/resources/js/graph3d/layout.mjs +63 -0
- package/resources/js/graph3d/three.min.js +6 -0
- package/resources/js/graph3d/viewer2d.js +448 -0
- package/resources/panel/ball-position.cjs +48 -2
- package/resources/panel/index.html +18 -4
- package/resources/panel/main.cjs +137 -5
- package/resources/panel/mascot-base.png +0 -0
- package/resources/panel/mascot-blink-1.png +0 -0
- package/resources/panel/mascot-blink-2.png +0 -0
- package/resources/panel/mascot-iris.png +0 -0
- package/resources/panel/mascot-lift-down-1.png +0 -0
- package/resources/panel/mascot-lift-down-2.png +0 -0
- package/resources/panel/mascot-lift-down-3.png +0 -0
- package/resources/panel/mascot-lift-down-4.png +0 -0
- package/resources/panel/mascot-lift-down-5.png +0 -0
- package/resources/panel/mascot-lift-down-6.png +0 -0
- package/resources/panel/mascot-lift-up-1.png +0 -0
- package/resources/panel/mascot-lift-up-2.png +0 -0
- package/resources/panel/mascot-lift-up-3.png +0 -0
- package/resources/panel/mascot-lift-up-4.png +0 -0
- package/resources/panel/mascot-lift-up-5.png +0 -0
- package/resources/panel/mascot-lift-up-6.png +0 -0
- package/resources/panel/mascot-peek.png +0 -0
- package/resources/panel/mascot-tickle-1.png +0 -0
- package/resources/panel/mascot-tickle-2.png +0 -0
- package/resources/panel/mascot-tickle-3.png +0 -0
- package/resources/panel/mascot-tickle-4.png +0 -0
- package/resources/panel/panel.css +205 -59
- package/resources/panel/preload.cjs +26 -0
- package/resources/panel/renderer.js +646 -17
- package/scripts/_utils.py +1203 -931
- package/scripts/backfill_articles.py +202 -21
- package/scripts/biz_daily.py +26 -34
- package/scripts/bonds.py +331 -0
- package/scripts/chat_notes.py +561 -470
- package/scripts/chat_stats.py +8 -7
- package/scripts/check_readme_commands.py +426 -0
- package/scripts/compile_wiki.py +187 -59
- package/scripts/contact_schema.py +339 -0
- package/scripts/data/wechat_emoji.json +225 -0
- package/scripts/export_chat_html.py +3 -1
- package/scripts/fav_notes.py +4 -1
- package/scripts/graph_2d.py +151 -0
- package/scripts/graph_3d.py +646 -0
- package/scripts/health_check.py +163 -26
- package/scripts/mcp_bridge.py +6 -7
- package/scripts/nt_decrypt.py +3 -3
- package/scripts/panel_frames.py +683 -0
- package/scripts/pipeline.py +21 -10
- package/scripts/quality_eval.py +5 -0
- package/scripts/rag_chat.py +33 -16
- package/scripts/reply_debt.py +26 -6
- package/scripts/semantic_search.py +130 -22
- package/scripts/vault_rag.py +42 -16
- package/scripts/vault_search.py +44 -8
- package/scripts/wechat_emoticon.py +6 -0
- package/scripts/wechat_voice.py +9 -0
- package/scripts/wiki_lint.py +124 -24
- package/src/core/dbPathService.ts +22 -4
- package/src/panel/server.ts +58 -1
- package/src/services/assistantEval.ts +323 -12
- package/src/services/assistantScenes.ts +342 -0
- package/src/services/assistantService.ts +107 -6
- package/src/services/assistantSkills.ts +364 -0
- package/src/services/assistantTools.ts +2452 -1640
- package/src/services/assistantTrace.ts +9 -0
- package/src/services/configService.ts +415 -403
- package/src/services/messageQuery.ts +29 -0
- package/src/services/outboundSend.ts +126 -0
- package/src/services/pythonBridge.ts +1 -0
- package/src/services/wechatClient.ts +380 -0
- package/src/services/wechatMedia.ts +166 -0
- package/src/services/wechatMessageService.ts +62 -11
- package/src/types.ts +4 -0
- package/src/utils/python.ts +2 -2
- package/dist/src/utils/wechatEmoji.d.ts +0 -5
- package/dist/src/utils/wechatEmoji.d.ts.map +0 -1
- package/dist/src/utils/wechatEmoji.js +0 -35
- package/dist/src/utils/wechatEmoji.js.map +0 -1
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""่งฃ `contact.db` / `chat_room.ext_buffer` ้**ๅทฒ็ป้ช่ฏ่ฟ**็้ฃๅ ไธชๅญๆฎต๏ผๅช่ฏป๏ผใ
|
|
3
|
+
|
|
4
|
+
ไธบไปไนๅช่งฃ"้ช่ฏ่ฟ็"๏ผ้กถๅฑ `#3`/`#4` ็่ฏญไนๅจๆฌๆบๅฎๆต้่ขซไธๆฌก่ฏไผชโโไธๆฏ
|
|
5
|
+
`chatroom_member.member_id` ็ๆๅคง/ๆๅฐๅผใไธๆฏ `chat_room.id`ใไนไธๅจๆถๆฏๅบ
|
|
6
|
+
`message_*.db` ็ไปปไฝ id ๅ้ใ่ฏญไนๆฒกๅฎๅฐฑไธ็ปๅฎ็ผๅๅญ๏ผๆฌ่ๆฌๆๅฎไปฌๅๆ ทๆพ่ฟ
|
|
7
|
+
`unrecognized`๏ผ่ฐไนๅซ็
ง็ไธไธช็ๅบๆฅ็ๅๅญๅ้ป่พใ็ปๆ็ฌ่ฎฐ่ง
|
|
8
|
+
`docs/CONTACT_DB_SCHEMA.md`๏ผๅ่่ง D-067 / D-068ใ
|
|
9
|
+
|
|
10
|
+
ๅทฒ้ช่ฏใๅ ่่พๅบ็ๅญๆฎต๏ผ
|
|
11
|
+
|
|
12
|
+
RoomData
|
|
13
|
+
#1 (้ๅค) ๆๅ โโ ๆฏไธชๆๅ๏ผ1=userName 2=displayName 3=status 4=inviter
|
|
14
|
+
#5 (้ๅค) = ๆๅ้ **status ไฝ 11 ็ฝฎไฝ**็้ฃๆน id๏ผๆฌๆบ 77/77 ไธ่ฏฅ้ๅๅฎๅ
จ็ธ็ญ๏ผ
|
|
15
|
+
ๅฎ**ไธๆฏ**"้ขๅค็ๅไธ่
"โโๆฉๅ้ฃไนๅซๆฏ้็๏ผ่ง DECISIONS D-070๏ผ
|
|
16
|
+
|
|
17
|
+
่็ณปไบบๆจกๅผ๏ผ`--contacts`๏ผ๏ผ่ฏป `contact.extra_buffer` โโ ๅๆ ทๅช่พๅบ**ๅทฒ้ช่ฏ**็ๅญๆฎต๏ผ
|
|
18
|
+
|
|
19
|
+
#5 (ld) ๅฝๅฎถ/ๅฐๅบไปฃ็ ๏ผISO 3166-1 alpha-2๏ผโโ ๆฌๆบ 25/25 ่ฝๅจ็ ่กจใไผๆฐ CN ๅ 94%
|
|
20
|
+
#13 (varint) = ่ฏฅ่ก `biz_info.type`๏ผ่ดฆๅทๆๅก็ฑปๅ๏ผโโ ๆฌๆบ 687/687 ้่ก็ธ็ญ
|
|
21
|
+
#41 (varint) = ่ฏฅ่ก่ตๆ็"ๆ่ฟๆดๆฐๆถ้ด"๏ผepoch ็ง๏ผ0 ่กจ็คบๆพๅผๆช่ฎพ็ฝฎ๏ผๆ็ผบ็ๅค็๏ผ
|
|
22
|
+
|
|
23
|
+
**ๆ
ๆไธ่พๅบ** `#4`/`#9`๏ผๅฎไปฌๅทฒๅฎๆงไธบ"่ฏฅ่ดฆๅท่ช่บซ่ตๆๆๆฌ็ๆฑ้"๏ผๅซไธปไฝๅ/่ๅๆ้ฎๅ๏ผ๏ผ
|
|
24
|
+
ๆฏ**ๅ
ๅฎนไธๆฏๅญๆฎตๅ**๏ผๆ่ฟ CLI ่พๅบ็ญไบๆ่ดฆๅท่ตๆๆผๅบๅป โโ ๅฎไปฌๅชไปฅ้ฟๅบฆๅบ็ฐๅจ `unrecognized` ้ใ
|
|
25
|
+
ๅ
ถไฝๅญๆฎตๆชๅฎๅ๏ผไธๅพๅๆ ท่ฟ `unrecognized`๏ผ้ฎๅฐฑๆฏๅญๆฎตๅท๏ผใๅ่่ง D-068 / D-082 / D-084 / D-088ใ
|
|
26
|
+
|
|
27
|
+
็จๆณ๏ผ
|
|
28
|
+
python scripts/contact_schema.py --json
|
|
29
|
+
python scripts/contact_schema.py --limit 5 # ๅช็ๅ 5 ไธช็พค
|
|
30
|
+
python scripts/contact_schema.py --room <็พค username ๆ id>
|
|
31
|
+
python scripts/contact_schema.py --contacts --limit 5 # ๆน็่็ณปไบบ๏ผ#5 ๅฐๅบ็ / #13 ๆๅก็ฑปๅ / #41 ๆดๆฐๆถ้ด๏ผ
|
|
32
|
+
"""
|
|
33
|
+
import argparse
|
|
34
|
+
import json
|
|
35
|
+
import os
|
|
36
|
+
import re
|
|
37
|
+
import sys
|
|
38
|
+
import time
|
|
39
|
+
|
|
40
|
+
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
41
|
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
42
|
+
|
|
43
|
+
# ๆ่ทๆถ stdout ๆฏๆฌๆบ็ผ็ ๏ผWindows ๆฏ GBK๏ผ๏ผไธญๆไผไนฑ็ ใ้ GBK ๅญ็ฌฆ็ดๆฅๅดฉๆๆดๆฌก่พๅบ
|
|
44
|
+
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def varint(buf, i):
|
|
48
|
+
val = 0
|
|
49
|
+
shift = 0
|
|
50
|
+
while True:
|
|
51
|
+
if i >= len(buf):
|
|
52
|
+
raise ValueError('varint ่ถ็')
|
|
53
|
+
b = buf[i]
|
|
54
|
+
i += 1
|
|
55
|
+
val |= (b & 0x7F) << shift
|
|
56
|
+
if not (b & 0x80):
|
|
57
|
+
return val, i
|
|
58
|
+
shift += 7
|
|
59
|
+
if shift > 63:
|
|
60
|
+
raise ValueError('varint ่ฟ้ฟ')
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def walk(buf):
|
|
64
|
+
"""่ตฐไธ้ wire format๏ผ่ฟๅ [(ๅญๆฎตๅท, wire type, ๅผ)]ใ
|
|
65
|
+
|
|
66
|
+
**ไธ่ฎค่ฏ็ wire type ไธๅพๆ้**๏ผๅฎๅฏๆดๆกๆฅ"่งฃไธๅจ"๏ผไนไธๆ้ไฝ็ๅญ่ๅฝๆๅญๆฎตๅผ
|
|
67
|
+
โโ้ฃๆญฃๆฏ"็็ๅ"็ๆฅๆบใ
|
|
68
|
+
"""
|
|
69
|
+
i = 0
|
|
70
|
+
out = []
|
|
71
|
+
while i < len(buf):
|
|
72
|
+
tag, i = varint(buf, i)
|
|
73
|
+
fno, wt = tag >> 3, tag & 7
|
|
74
|
+
if fno == 0 or wt in (3, 4):
|
|
75
|
+
raise ValueError('ๅญๆฎตๅท/wire type ๅผๅธธ๏ผfno=%d wt=%d๏ผ' % (fno, wt))
|
|
76
|
+
if wt == 0:
|
|
77
|
+
v, i = varint(buf, i)
|
|
78
|
+
out.append((fno, wt, v))
|
|
79
|
+
elif wt == 2:
|
|
80
|
+
ln, i = varint(buf, i)
|
|
81
|
+
if i + ln > len(buf):
|
|
82
|
+
raise ValueError('้ฟๅบฆ่ถ็')
|
|
83
|
+
out.append((fno, wt, buf[i:i + ln]))
|
|
84
|
+
i += ln
|
|
85
|
+
elif wt == 5:
|
|
86
|
+
if i + 4 > len(buf):
|
|
87
|
+
raise ValueError('fixed32 ่ถ็')
|
|
88
|
+
out.append((fno, wt, buf[i:i + 4]))
|
|
89
|
+
i += 4
|
|
90
|
+
elif wt == 1:
|
|
91
|
+
if i + 8 > len(buf):
|
|
92
|
+
raise ValueError('fixed64 ่ถ็')
|
|
93
|
+
out.append((fno, wt, buf[i:i + 8]))
|
|
94
|
+
i += 8
|
|
95
|
+
else:
|
|
96
|
+
raise ValueError('ๆช็ฅ wire type %d' % wt)
|
|
97
|
+
return out
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _text(raw):
|
|
101
|
+
if raw is None:
|
|
102
|
+
return None
|
|
103
|
+
try:
|
|
104
|
+
return raw.decode('utf-8')
|
|
105
|
+
except UnicodeDecodeError:
|
|
106
|
+
return None # ไธๆฏ UTF-8 ๅฐฑๅซ็กฌๅฝๅญ็ฌฆไธฒ็จ๏ผ่ฟๅ None๏ผ่ฐ็จๆนๆๆช็ฅๅค็๏ผ
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def decode_room(blob):
|
|
110
|
+
"""ๆไธไธช ext_buffer ่งฃๆ {members, statusBit11Ids, unrecognized}๏ผ่งฃไธๅจๅฐฑๆ้ใ"""
|
|
111
|
+
members = []
|
|
112
|
+
extra_ids = []
|
|
113
|
+
unrecognized = {}
|
|
114
|
+
for fno, wt, value in walk(blob):
|
|
115
|
+
if fno == 1 and wt == 2:
|
|
116
|
+
inner = walk(value)
|
|
117
|
+
# **้ฎๅบๅฎ**๏ผ็ผบ #2 ็ๆๅไน่ฆๆ displayName ่ฟไธช้ฎ๏ผๅผไธบ None๏ผ๏ผ
|
|
118
|
+
# ๅฆๅ JSON ้ๆถๆๆถๆ ๏ผไธๆธธๆฏๆฌก้ฝๅพๅ
้ฎ"้ฎๅจไธๅจ"โโ้ฃ็งๅฝข็ถ่ฟๆฉ่ขซๆผๅคๆ"ๆฒกๅๅญ"ใ
|
|
119
|
+
member = {'userName': None, 'displayName': None, 'status': None, 'inviter': None}
|
|
120
|
+
for m_fno, m_wt, m_val in inner:
|
|
121
|
+
if m_fno in (1, 2, 4) and m_wt == 2:
|
|
122
|
+
key = {1: 'userName', 2: 'displayName', 4: 'inviter'}[m_fno]
|
|
123
|
+
member[key] = _text(m_val)
|
|
124
|
+
elif m_fno == 3 and m_wt == 0:
|
|
125
|
+
member['status'] = m_val
|
|
126
|
+
else:
|
|
127
|
+
member.setdefault('unrecognized', {})['%d' % m_fno] = (
|
|
128
|
+
len(m_val) if m_wt == 2 else m_val)
|
|
129
|
+
members.append(member)
|
|
130
|
+
elif fno == 5 and wt == 2:
|
|
131
|
+
extra_ids.append(_text(value))
|
|
132
|
+
else:
|
|
133
|
+
# ไธ็๏ผๅๆ ทๆพ่ฟๆฅ๏ผ้ฎๅฐฑๆฏๅญๆฎตๅท
|
|
134
|
+
unrecognized['%d' % fno] = (len(value) if wt == 2 else value)
|
|
135
|
+
return {'members': members, 'statusBit11Ids': extra_ids, 'unrecognized': unrecognized}
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
# `contact.extra_buffer` ็ `#5` ๅชๅจๅฎๆฏ"ๆฐๅฅฝไธคไธชๅคงๅ ASCII ๅญๆฏ"ๆถๆๅฝๅฐๅบ็ ่พๅบใ
|
|
139
|
+
REGION_RE = re.compile(r'^[A-Z]{2}$')
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def decode_contact(blob):
|
|
143
|
+
"""่งฃ `contact.extra_buffer` ้**ๅทฒ็ป้ช่ฏ่ฟ**็้ฃๅ ไธชๅญๆฎต๏ผ่งฃไธๅจๅฐฑๆ้ใ
|
|
144
|
+
|
|
145
|
+
ๅช่งฃ"้ช่ฏ่ฟ็"๏ผD-068 / D-082 / D-084๏ผ๏ผไธไธช๏ผ
|
|
146
|
+
|
|
147
|
+
#5 (ld) ๅฝๅฎถ/ๅฐๅบไปฃ็ ๏ผISO 3166-1 alpha-2๏ผโโ ๆฌๆบ 25/25 ่ฝๅจ็ ่กจใไผๆฐ CN ๅ 94%
|
|
148
|
+
#13 (varint) = ่ฏฅ่ก `biz_info.type`๏ผ่ดฆๅทๆๅก็ฑปๅ๏ผโโ ๆฌๆบ 687/687 ้่ก็ธ็ญ
|
|
149
|
+
#41 (varint) epoch ็ง = ่ฏฅ่ก่ตๆ็"ๆ่ฟๆดๆฐๆถ้ด"โโ 0 ่กจ็คบๆพๅผๆช่ฎพ็ฝฎ๏ผๆ็ผบ็ๅค็
|
|
150
|
+
|
|
151
|
+
**ๆ
ๆไธ่พๅบ็**๏ผ่ฏดๆธ
ๆฅ๏ผๅ
ๅพๅไบบไปฅไธบๆฏๆผไบ๏ผ๏ผ
|
|
152
|
+
|
|
153
|
+
- `#4` / `#9`๏ผๅทฒๅฎๆงไธบ"่ฏฅ่ดฆๅท่ช่บซ่ตๆๆๆฌ็ๆฑ้"๏ผๅซไธปไฝๅ/่ๅๆ้ฎๅ๏ผ๏ผๅฎๆฏ**ๅ
ๅฎนไธๆฏๅญๆฎตๅ** โโ
|
|
154
|
+
ๅก่ฟ CLI ่พๅบ็ญไบๆ่ดฆๅท่ตๆๆผๅบๅปใๅฎไปฌๅจ `unrecognized` ้**ๅช็้ฟๅบฆ**ใ
|
|
155
|
+
- ้กถๅฑ `#1`/`#2` ้ฃไธๆ๏ผ`contact.extra_buffer` ้ 44 ่ก็ OpenIM ๅฐๅฝข็ถ๏ผ๏ผๅชๆฅ `kind='openim'`๏ผ
|
|
156
|
+
ๅ
ถไฝๆ้ฎๅๆ ทๆพ่ฟ `unrecognized`ใ้ฃไธค้ฎๅจๆๆกฃ้ๆฏ openim ๅบ็ๅค้ฎ๏ผๅฏน"่ฏป่็ณปไบบ"ๆฒก็จใ
|
|
157
|
+
- ๅ
ถไฝ 30 ๆฅไธชๅญๆฎต๏ผ**่ฏญไนๆชๅฎ๏ผไธๅพๅๆ ท่ฟ `unrecognized`**๏ผ้ฎๅฐฑๆฏๅญๆฎตๅท๏ผๅ `decode_room`๏ผใ
|
|
158
|
+
"""
|
|
159
|
+
fields = {}
|
|
160
|
+
for fno, wt, value in walk(blob):
|
|
161
|
+
fields.setdefault(fno, (wt, value))
|
|
162
|
+
if not fields:
|
|
163
|
+
return {'kind': None, 'region': None, 'bizType': None, 'updatedAt': None,
|
|
164
|
+
'unrecognized': {}}
|
|
165
|
+
raw = {'%d' % fno: (len(v) if wt == 2 else v) for fno, (wt, v) in fields.items()}
|
|
166
|
+
# ๅฐๅฝข็ถ = **ๅญๆฎตๅทๅ
จ <= 9**๏ผๅคง proto ไธๅฎๆ #2..#38๏ผไธๅฏ่ฝๅ
จ <= 9๏ผใ
|
|
167
|
+
# โ ๏ธ ๅซๅ่ฆๆฑ"ๅฟ
้กปๆ #1"๏ผ้ฃๆ้ๆไธ่กๆฒกๆ #1๏ผๅ ไธ่ฟไธชๆกไปถไผๆๅฎ้ๅคๆ่็ณปไบบ
|
|
168
|
+
# ๏ผๅ
จ้ๆ ธๅฏนๆถๆๅฐ๏ผkind ๅๅธๅๆ 944/43๏ผๆๆกฃๆฏ 940/44 + 2 ไธชๆฎ่ก๏ผใ
|
|
169
|
+
if max(fields) <= 9:
|
|
170
|
+
return {'kind': 'openim', 'region': None, 'bizType': None, 'updatedAt': None,
|
|
171
|
+
'unrecognized': raw}
|
|
172
|
+
|
|
173
|
+
out = {'kind': 'contact', 'region': None, 'bizType': None, 'updatedAt': None,
|
|
174
|
+
'unrecognized': raw}
|
|
175
|
+
wt5, v5 = fields.get(5, (None, None))
|
|
176
|
+
if wt5 == 2 and isinstance(v5, bytes):
|
|
177
|
+
text = _text(v5)
|
|
178
|
+
if text and REGION_RE.match(text):
|
|
179
|
+
out['region'] = text
|
|
180
|
+
wt13, v13 = fields.get(13, (None, None))
|
|
181
|
+
if wt13 == 0:
|
|
182
|
+
out['bizType'] = v13
|
|
183
|
+
wt41, v41 = fields.get(41, (None, None))
|
|
184
|
+
if wt41 == 0 and v41: # 0 = ๆพๅผ"ๆช่ฎพ็ฝฎ"๏ผไธๆฏ 1970 ๅนด
|
|
185
|
+
out['updatedAt'] = v41
|
|
186
|
+
return out
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def load_rows(args):
|
|
190
|
+
from _utils import get_db_config # noqa: E402
|
|
191
|
+
from nt_decrypt import require_sqlcipher # noqa: E402
|
|
192
|
+
|
|
193
|
+
cfg = get_db_config()
|
|
194
|
+
db = args.db or cfg['contact_db']
|
|
195
|
+
key = args.key or cfg['contact_key']
|
|
196
|
+
salt = args.salt or cfg['contact_salt']
|
|
197
|
+
if not db or not os.path.isfile(db):
|
|
198
|
+
raise SystemExit('ๆพไธๅฐ contact ๅบ๏ผ%s' % (db or '(ๆช้
็ฝฎ)'))
|
|
199
|
+
if not key or not salt:
|
|
200
|
+
raise SystemExit('็ผบๅฐๅบๅฏ้ฅ๏ผๅ
่ท weflow-cli init๏ผๆๆพๅผ็ป --key/--salt๏ผ')
|
|
201
|
+
conn = require_sqlcipher().connect(db)
|
|
202
|
+
cur = conn.cursor()
|
|
203
|
+
cur.execute('PRAGMA key = "x\'%s%s\'";' % (key, salt))
|
|
204
|
+
sql = ('SELECT id, username, owner, ext_buffer FROM chat_room '
|
|
205
|
+
'WHERE ext_buffer IS NOT NULL AND length(ext_buffer) > 0')
|
|
206
|
+
params = []
|
|
207
|
+
if args.room:
|
|
208
|
+
sql += ' AND (username = ? OR id = ?)'
|
|
209
|
+
params = [args.room, args.room]
|
|
210
|
+
sql += ' ORDER BY id LIMIT ?'
|
|
211
|
+
params.append(args.limit)
|
|
212
|
+
rows = cur.execute(sql, params).fetchall()
|
|
213
|
+
conn.close()
|
|
214
|
+
return rows
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def load_contacts(args):
|
|
218
|
+
from _utils import get_db_config # noqa: E402
|
|
219
|
+
from nt_decrypt import require_sqlcipher # noqa: E402
|
|
220
|
+
|
|
221
|
+
cfg = get_db_config()
|
|
222
|
+
db = args.db or cfg['contact_db']
|
|
223
|
+
key = args.key or cfg['contact_key']
|
|
224
|
+
salt = args.salt or cfg['contact_salt']
|
|
225
|
+
if not db or not os.path.isfile(db):
|
|
226
|
+
raise SystemExit('ๆพไธๅฐ contact ๅบ๏ผ%s' % (db or '(ๆช้
็ฝฎ)'))
|
|
227
|
+
if not key or not salt:
|
|
228
|
+
raise SystemExit('็ผบๅฐๅบๅฏ้ฅ๏ผๅ
่ท weflow-cli init๏ผๆๆพๅผ็ป --key/--salt๏ผ')
|
|
229
|
+
conn = require_sqlcipher().connect(db)
|
|
230
|
+
cur = conn.cursor()
|
|
231
|
+
cur.execute('PRAGMA key = "x\'%s%s\'";' % (key, salt))
|
|
232
|
+
sql = ('SELECT id, username, local_type, extra_buffer FROM contact '
|
|
233
|
+
'WHERE extra_buffer IS NOT NULL AND length(extra_buffer) > 0')
|
|
234
|
+
params = []
|
|
235
|
+
if args.room:
|
|
236
|
+
sql += ' AND (username = ? OR id = ?)'
|
|
237
|
+
params = [args.room, args.room]
|
|
238
|
+
sql += ' ORDER BY id LIMIT ?'
|
|
239
|
+
params.append(args.limit)
|
|
240
|
+
rows = cur.execute(sql, params).fetchall()
|
|
241
|
+
conn.close()
|
|
242
|
+
return rows
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def main(argv=None):
|
|
246
|
+
ap = argparse.ArgumentParser(
|
|
247
|
+
description='่ฏป contact.db ็ ext_buffer๏ผๅช่ฏป๏ผไธ่็ฝใไธ่ฐๆจกๅ๏ผ๏ผ้ป่ฎค่ฏป**็พค**๏ผ--contacts ๆน่ฏป**่็ณปไบบ**')
|
|
248
|
+
ap.add_argument('--limit', type=int, default=20, help='ๆๅค็ๅ ไธช๏ผ็พค / ่็ณปไบบ๏ผ้ป่ฎค 20๏ผ')
|
|
249
|
+
ap.add_argument('--room', help='ๅช็ๆไธช๏ผ็พค / ่็ณปไบบ ็ username ๆ id๏ผ')
|
|
250
|
+
ap.add_argument('--contacts', action='store_true',
|
|
251
|
+
help='ๆน่ฏป่็ณปไบบ็ extra_buffer๏ผ#5 ๅฐๅบ็ / #13 ๆๅก็ฑปๅ / #41 ่ตๆๆดๆฐๆถ้ด๏ผ๏ผ่ไธๆฏ็พค')
|
|
252
|
+
ap.add_argument('--db', help='contact.db ่ทฏๅพ๏ผ้ป่ฎคๅ้
็ฝฎ๏ผ')
|
|
253
|
+
ap.add_argument('--key', help='ๅบๅฏ้ฅ๏ผ้ป่ฎคๅ้
็ฝฎ๏ผ')
|
|
254
|
+
ap.add_argument('--salt', help='ๅบ็๏ผ้ป่ฎคๅ้
็ฝฎ๏ผ')
|
|
255
|
+
ap.add_argument('--json', action='store_true', help='่พๅบๆบๅจๅฏ่ฏป็ปๆ')
|
|
256
|
+
args = ap.parse_args(argv)
|
|
257
|
+
|
|
258
|
+
try:
|
|
259
|
+
rows = load_contacts(args) if args.contacts else load_rows(args)
|
|
260
|
+
except SystemExit:
|
|
261
|
+
raise
|
|
262
|
+
except Exception as exc:
|
|
263
|
+
if args.json:
|
|
264
|
+
print(json.dumps({'success': False, 'error': str(exc)[:200]}, ensure_ascii=False))
|
|
265
|
+
else:
|
|
266
|
+
print('่ฏปๅบๅคฑ่ดฅ๏ผ%s' % str(exc)[:200], file=sys.stderr)
|
|
267
|
+
return 1
|
|
268
|
+
|
|
269
|
+
if args.contacts:
|
|
270
|
+
contacts = []
|
|
271
|
+
failures = []
|
|
272
|
+
for rid, username, local_type, blob in rows:
|
|
273
|
+
try:
|
|
274
|
+
decoded = decode_contact(bytes(blob))
|
|
275
|
+
except Exception as exc:
|
|
276
|
+
# ๅ็พค้ฃๆก๏ผ่งฃไธๅจๅฐฑ่ฏด่งฃไธๅจ๏ผไธ่ฟๅไธๆก"ไปไน้ฝๆฒกๆ"็่็ณปไบบ
|
|
277
|
+
failures.append({'id': rid, 'username': username, 'error': str(exc)[:80]})
|
|
278
|
+
continue
|
|
279
|
+
contacts.append({'id': rid, 'username': username, 'localType': local_type,
|
|
280
|
+
'kind': decoded['kind'], 'region': decoded['region'],
|
|
281
|
+
'bizType': decoded['bizType'], 'updatedAt': decoded['updatedAt'],
|
|
282
|
+
'unrecognized': decoded['unrecognized']})
|
|
283
|
+
if args.json:
|
|
284
|
+
print(json.dumps({'success': True, 'action': 'contact-schema',
|
|
285
|
+
'contacts': contacts, 'failures': failures,
|
|
286
|
+
'readsLocalData': True, 'invokesAI': False,
|
|
287
|
+
'sendsNothing': True}, ensure_ascii=False))
|
|
288
|
+
else:
|
|
289
|
+
print('็ไบ %d ไธช่็ณปไบบ๏ผ่งฃไธๅจ %d ไธช' % (len(contacts), len(failures)))
|
|
290
|
+
print('๏ผๅช่พๅบๅทฒ้ช่ฏๅญๆฎต๏ผ#5 ๅฐๅบ็ / #13 ๆๅก็ฑปๅ / #41 ่ตๆๆดๆฐๆถ้ด๏ผ'
|
|
291
|
+
'#4/#9 ๆฏ่ดฆๅท่ตๆๆๆฌ๏ผๅฑๅ
ๅฎน๏ผไธๆๅฐ๏ผๅชๅจ"ๆช่ฏๅซ"้็้ฟๅบฆ๏ผ')
|
|
292
|
+
for c in contacts:
|
|
293
|
+
when = time.strftime('%Y-%m-%d', time.gmtime(c['updatedAt'])) if c['updatedAt'] else '-'
|
|
294
|
+
print(' %-28s local_type=%-3s kind=%-8s ๅฐๅบ=%-3s ๆๅก็ฑปๅ=%-4s ๆดๆฐ=%-11s ๆช่ฏๅซ %d ไธช'
|
|
295
|
+
% (c['username'], c['localType'], c['kind'], c['region'] or '-',
|
|
296
|
+
c['bizType'] if c['bizType'] is not None else '-', when,
|
|
297
|
+
len(c['unrecognized'])))
|
|
298
|
+
for f in failures:
|
|
299
|
+
print('่งฃไธๅจ: id=%s %s' % (f['id'], f['error']), file=sys.stderr)
|
|
300
|
+
return 0
|
|
301
|
+
|
|
302
|
+
rooms = []
|
|
303
|
+
failures = []
|
|
304
|
+
for rid, username, owner, blob in rows:
|
|
305
|
+
try:
|
|
306
|
+
decoded = decode_room(bytes(blob))
|
|
307
|
+
except Exception as exc:
|
|
308
|
+
# **่งฃไธๅจๅฐฑ่ฏด่งฃไธๅจ**๏ผไธ่ฟๅ็ฉบๆๅ่กจๅๅ
"่ฟไธช็พคๆฒกไบบ"
|
|
309
|
+
failures.append({'id': rid, 'username': username, 'error': str(exc)[:80]})
|
|
310
|
+
continue
|
|
311
|
+
rooms.append({'id': rid, 'username': username, 'owner': owner,
|
|
312
|
+
'memberCount': len(decoded['members']),
|
|
313
|
+
'members': decoded['members'],
|
|
314
|
+
'statusBit11Ids': decoded['statusBit11Ids'],
|
|
315
|
+
'unrecognized': decoded['unrecognized']})
|
|
316
|
+
|
|
317
|
+
if args.json:
|
|
318
|
+
print(json.dumps({'success': True, 'action': 'contact-schema', 'rooms': rooms,
|
|
319
|
+
'failures': failures, 'readsLocalData': True,
|
|
320
|
+
'invokesAI': False, 'sendsNothing': True}, ensure_ascii=False))
|
|
321
|
+
else:
|
|
322
|
+
print('็ไบ %d ไธช็พค๏ผ่งฃไธๅจ %d ไธช' % (len(rooms), len(failures)))
|
|
323
|
+
for room in rooms:
|
|
324
|
+
print('\n็พค %s๏ผid=%s๏ผๆๅ %d ไธช๏ผๆช่ฏๅซๅญๆฎต %s' % (
|
|
325
|
+
room['username'], room['id'], room['memberCount'],
|
|
326
|
+
','.join(sorted(room['unrecognized'])) or 'ๆ '))
|
|
327
|
+
for m in room['members'][:5]:
|
|
328
|
+
print(' %-28s %-12s status=%-8s inviter=%s' % (
|
|
329
|
+
m.get('userName'), m.get('displayName'), m.get('status'), m.get('inviter')))
|
|
330
|
+
if room['statusBit11Ids']:
|
|
331
|
+
print(' #5๏ผstatus ไฝ 11 ็ๆๅ๏ผ: %s'
|
|
332
|
+
% ', '.join(x or '?' for x in room['statusBit11Ids'][:5]))
|
|
333
|
+
for f in failures:
|
|
334
|
+
print('่งฃไธๅจ: id=%s %s' % (f['id'], f['error']), file=sys.stderr)
|
|
335
|
+
return 0
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
if __name__ == '__main__':
|
|
339
|
+
sys.exit(main())
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "WeChat face codes -> Unicode emoji. WeChat ships its own artwork (private-use code points such as U+E414 plus smileys/*.png), so several entries here are the closest standard equivalent rather than an exact match. Unknown codes are left untouched by the converters.",
|
|
3
|
+
"_aliases_note": "Chinese face names as they appear in WeChat message text, e.g. [ๅฎณ็พ].",
|
|
4
|
+
|
|
5
|
+
"ๅพฎ็ฌ": "๐",
|
|
6
|
+
"ๆๅด": "๐",
|
|
7
|
+
"่ฒ": "๐",
|
|
8
|
+
"ๅๅ": "๐ณ",
|
|
9
|
+
"ๅพๆ": "๐",
|
|
10
|
+
"ๆตๆณช": "๐ญ",
|
|
11
|
+
"ๅฎณ็พ": "๐ณ",
|
|
12
|
+
"้ญๅด": "๐ค",
|
|
13
|
+
"็ก": "๐ด",
|
|
14
|
+
"ๅคงๅญ": "๐ญ",
|
|
15
|
+
"ๅฐดๅฐฌ": "๐
",
|
|
16
|
+
"ๅๆ": "๐ก",
|
|
17
|
+
"่ฐ็ฎ": "๐",
|
|
18
|
+
"ๅฒ็": "๐",
|
|
19
|
+
"ๆ่ฎถ": "๐ฒ",
|
|
20
|
+
"้พ่ฟ": "๐",
|
|
21
|
+
"้
ท": "๐",
|
|
22
|
+
"ๅทๆฑ": "๐ฐ",
|
|
23
|
+
"ๆ็": "๐ซ",
|
|
24
|
+
"ๅ": "๐คฎ",
|
|
25
|
+
"ๅท็ฌ": "๐คญ",
|
|
26
|
+
"ๅฏ็ฑ": "๐",
|
|
27
|
+
"็ฝ็ผ": "๐",
|
|
28
|
+
"ๅฒๆ
ข": "๐ค",
|
|
29
|
+
"้ฅฅ้ฅฟ": "๐คค",
|
|
30
|
+
"ๅฐ": "๐ช",
|
|
31
|
+
"ๆๆ": "๐ฑ",
|
|
32
|
+
"ๆตๆฑ": "๐",
|
|
33
|
+
"ๆจ็ฌ": "๐",
|
|
34
|
+
"ๅคงๅ
ต": "๐",
|
|
35
|
+
"ๅฅๆ": "๐ค",
|
|
36
|
+
"ๅ้ช": "๐คฌ",
|
|
37
|
+
"็้ฎ": "โ",
|
|
38
|
+
"ๅ": "๐คซ",
|
|
39
|
+
"ๆ": "๐ต",
|
|
40
|
+
"ๆ็ฃจ": "๐ฉ",
|
|
41
|
+
"่กฐ": "๐",
|
|
42
|
+
"้ชท้ซ
": "๐",
|
|
43
|
+
"ๆฒๆ": "๐จ",
|
|
44
|
+
"ๅ่ง": "๐",
|
|
45
|
+
"ๆฆๆฑ": "๐
",
|
|
46
|
+
"ๆ ้ผป": "๐คง",
|
|
47
|
+
"้ผๆ": "๐",
|
|
48
|
+
"็ณๅคงไบ": "๐ณ",
|
|
49
|
+
"ๅ็ฌ": "๐",
|
|
50
|
+
"ๅทฆๅผๅผ": "๐ค",
|
|
51
|
+
"ๅณๅผๅผ": "๐ค",
|
|
52
|
+
"ๅๆฌ ": "๐ฅฑ",
|
|
53
|
+
"้่ง": "๐",
|
|
54
|
+
"ๅงๅฑ": "๐ฅบ",
|
|
55
|
+
"ๅฟซๅญไบ": "๐ข",
|
|
56
|
+
"้ด้ฉ": "๐",
|
|
57
|
+
"ไบฒไบฒ": "๐",
|
|
58
|
+
"ๅ": "๐ฑ",
|
|
59
|
+
"ๅฏๆ": "๐ฅบ",
|
|
60
|
+
"่ๅ": "๐ช",
|
|
61
|
+
"่ฅฟ็": "๐",
|
|
62
|
+
"ๅค้
": "๐บ",
|
|
63
|
+
"็ฏฎ็": "๐",
|
|
64
|
+
"ไนไน": "๐",
|
|
65
|
+
"ๅๅก": "โ",
|
|
66
|
+
"้ฅญ": "๐",
|
|
67
|
+
"็ชๅคด": "๐ท",
|
|
68
|
+
"็ซ็ฐ": "๐น",
|
|
69
|
+
"ๅ่ฐข": "๐ฅ",
|
|
70
|
+
"็คบ็ฑ": "โค๏ธ",
|
|
71
|
+
"็ฑๅฟ": "โค๏ธ",
|
|
72
|
+
"ๅฟ็ข": "๐",
|
|
73
|
+
"่็ณ": "๐",
|
|
74
|
+
"้ช็ต": "โก",
|
|
75
|
+
"็ธๅผน": "๐ฃ",
|
|
76
|
+
"ๅ": "๐ช",
|
|
77
|
+
"่ถณ็": "โฝ",
|
|
78
|
+
"็ข่ซ": "๐",
|
|
79
|
+
"ไพฟไพฟ": "๐ฉ",
|
|
80
|
+
"ๆไบฎ": "๐",
|
|
81
|
+
"ๅคช้ณ": "โ๏ธ",
|
|
82
|
+
"็คผ็ฉ": "๐",
|
|
83
|
+
"ๆฅๆฑ": "๐ค",
|
|
84
|
+
"ๅผบ": "๐",
|
|
85
|
+
"ๅผฑ": "๐",
|
|
86
|
+
"ๆกๆ": "๐ค",
|
|
87
|
+
"่ๅฉ": "โ๏ธ",
|
|
88
|
+
"ๆฑๆณ": "๐",
|
|
89
|
+
"ๅพๅผ": "๐
",
|
|
90
|
+
"ๆณๅคด": "๐",
|
|
91
|
+
"ๅทฎๅฒ": "๐",
|
|
92
|
+
"็ฑไฝ ": "๐ค",
|
|
93
|
+
"NO": "๐
",
|
|
94
|
+
"OK": "๐",
|
|
95
|
+
"็ฑๆ
": "๐",
|
|
96
|
+
"้ฃๅป": "๐",
|
|
97
|
+
"่ทณ่ทณ": "๐บ",
|
|
98
|
+
"ๅๆ": "๐จ",
|
|
99
|
+
"ๆ็ซ": "๐ ",
|
|
100
|
+
"่ฝฌๅ": "๐",
|
|
101
|
+
"็ฃๅคด": "๐",
|
|
102
|
+
"ๅๅคด": "๐",
|
|
103
|
+
"่ทณ็ปณ": "๐",
|
|
104
|
+
"ๆฅๆ": "๐",
|
|
105
|
+
"ๆฟๅจ": "๐",
|
|
106
|
+
"่ก่": "๐บ",
|
|
107
|
+
"็ฎๅป": "๐",
|
|
108
|
+
"ๅทฆๅคชๆ": "โฏ๏ธ",
|
|
109
|
+
"ๅณๅคชๆ": "โฏ๏ธ",
|
|
110
|
+
|
|
111
|
+
"ๆ่ธ": "๐คฆ",
|
|
112
|
+
"ๅฅธ็ฌ": "๐",
|
|
113
|
+
"ๆบๆบ": "๐ค",
|
|
114
|
+
"็ฑ็": "๐",
|
|
115
|
+
"่ถ": "โ๏ธ",
|
|
116
|
+
"ๅ็": "๐",
|
|
117
|
+
"ๅ ๆฒน": "๐ช",
|
|
118
|
+
"ๆฑ": "๐
",
|
|
119
|
+
"ๅคฉๅ": "๐ฑ",
|
|
120
|
+
"็คพไผ็คพไผ": "๐ค",
|
|
121
|
+
"ๅ": "๐ฒ",
|
|
122
|
+
"666": "๐",
|
|
123
|
+
"่ฎฉๆ็็": "๐",
|
|
124
|
+
"ๅนๆฐ": "๐ฎโ๐จ",
|
|
125
|
+
"่ฆๆถฉ": "๐",
|
|
126
|
+
"่ฃๅผ": "๐คฏ",
|
|
127
|
+
"็ฟป็ฝ็ผ": "๐",
|
|
128
|
+
"็ ดๆถไธบ็ฌ": "๐",
|
|
129
|
+
"ๆ ่ฏญ": "๐",
|
|
130
|
+
"ๅคฑๆ": "๐",
|
|
131
|
+
"ๆๆง": "๐ฑ",
|
|
132
|
+
"ๅบ็ฅ": "๐",
|
|
133
|
+
"็บขๅ
": "๐งง",
|
|
134
|
+
"็ฆ": "๐งง",
|
|
135
|
+
"็ผ": "๐",
|
|
136
|
+
"็่ฑ": "๐",
|
|
137
|
+
"็็ซน": "๐งจ",
|
|
138
|
+
"ๅๅ": "๐",
|
|
139
|
+
|
|
140
|
+
"ๆบๆด": "๐ถ",
|
|
141
|
+
"ๅง": "๐
",
|
|
142
|
+
"ๅดๅ": "๐",
|
|
143
|
+
"ๅฅฝ็": "๐",
|
|
144
|
+
"ๅฟๅ": "๐",
|
|
145
|
+
"ๆ่ธ": "๐คฆ",
|
|
146
|
+
"ๆๅฟซ": "๐",
|
|
147
|
+
"็ฌ่ธ": "๐",
|
|
148
|
+
"็็
": "๐ค",
|
|
149
|
+
"่ธ็บข": "๐",
|
|
150
|
+
"ๆ ้ฒ": "๐",
|
|
151
|
+
"Emm": "๐ค",
|
|
152
|
+
"้็บขๅ
": "๐งง",
|
|
153
|
+
"ๅผ็บขๅ
": "๐งง",
|
|
154
|
+
"Salute": "๐ซก",
|
|
155
|
+
|
|
156
|
+
"Smile": "๐",
|
|
157
|
+
"Grimace": "๐",
|
|
158
|
+
"Drool": "๐",
|
|
159
|
+
"Scowl": "๐ณ",
|
|
160
|
+
"CoolGuy": "๐",
|
|
161
|
+
"Sob": "๐ญ",
|
|
162
|
+
"Shy": "๐ณ",
|
|
163
|
+
"Silent": "๐ค",
|
|
164
|
+
"Sleep": "๐ด",
|
|
165
|
+
"Cry": "๐ญ",
|
|
166
|
+
"Awkward": "๐
",
|
|
167
|
+
"Angry": "๐ก",
|
|
168
|
+
"Tongue": "๐",
|
|
169
|
+
"Grin": "๐",
|
|
170
|
+
"Surprise": "๐ฒ",
|
|
171
|
+
"Frown": "๐",
|
|
172
|
+
"Ruthless": "๐",
|
|
173
|
+
"Blush": "๐",
|
|
174
|
+
"Scream": "๐ซ",
|
|
175
|
+
"Puke": "๐คฎ",
|
|
176
|
+
"Chuckle": "๐คญ",
|
|
177
|
+
"Joyful": "๐",
|
|
178
|
+
"Slight": "๐",
|
|
179
|
+
"Smug": "๐ค",
|
|
180
|
+
"Hungry": "๐คค",
|
|
181
|
+
"Drowsy": "๐ช",
|
|
182
|
+
"Panic": "๐ฑ",
|
|
183
|
+
"Sweat": "๐",
|
|
184
|
+
"Laugh": "๐",
|
|
185
|
+
"Commando": "๐",
|
|
186
|
+
"Determined": "๐ค",
|
|
187
|
+
"Scold": "๐คฌ",
|
|
188
|
+
"Shocked": "โ",
|
|
189
|
+
"Shhh": "๐คซ",
|
|
190
|
+
"Dizzy": "๐ต",
|
|
191
|
+
"Tormented": "๐ฉ",
|
|
192
|
+
"Toasted": "๐",
|
|
193
|
+
"Skull": "๐",
|
|
194
|
+
"Hammer": "๐จ",
|
|
195
|
+
"Wave": "๐",
|
|
196
|
+
"Speechless": "๐
",
|
|
197
|
+
"NosePick": "๐คง",
|
|
198
|
+
"Clap": "๐",
|
|
199
|
+
"Shame": "๐ณ",
|
|
200
|
+
"Trick": "๐",
|
|
201
|
+
"Yawn": "๐ฅฑ",
|
|
202
|
+
"Pooh-pooh": "๐",
|
|
203
|
+
"Shrunken": "๐ฅบ",
|
|
204
|
+
"TearingUp": "๐ข",
|
|
205
|
+
"Sly": "๐",
|
|
206
|
+
"Kiss": "๐",
|
|
207
|
+
"Wrath": "๐ ",
|
|
208
|
+
"Whimper": "๐ฅบ",
|
|
209
|
+
"Cleaver": "๐ช",
|
|
210
|
+
"Watermelon": "๐",
|
|
211
|
+
"Beer": "๐บ",
|
|
212
|
+
"Basketball": "๐",
|
|
213
|
+
"PingPong": "๐",
|
|
214
|
+
"Coffee": "โ",
|
|
215
|
+
"Rice": "๐",
|
|
216
|
+
"Pig": "๐ท",
|
|
217
|
+
"Rose": "๐น",
|
|
218
|
+
"Wilt": "๐ฅ",
|
|
219
|
+
"Lips": "โค๏ธ",
|
|
220
|
+
"Heart": "โค๏ธ",
|
|
221
|
+
"BrokenHeart": "๐",
|
|
222
|
+
"Cake": "๐",
|
|
223
|
+
"Lightning": "โก",
|
|
224
|
+
"ThumbsUp": "๐"
|
|
225
|
+
}
|
|
@@ -2379,7 +2379,9 @@ def main():
|
|
|
2379
2379
|
# Voice: load the payloads so a cached transcript can be shown. Anything
|
|
2380
2380
|
# not yet transcribed simply renders as `[่ฏญ้ณ Nโณ]`.
|
|
2381
2381
|
if _WECHAT_VOICE:
|
|
2382
|
-
|
|
2382
|
+
# ็ผๅญ็ๅฎถ็ฑ `wechat_voice` ๅฎไน๏ผไปฅๅ่ฟ้ๆ `--out` ๆผ๏ผไบๆฏๅไธๆฎต้ณ้ขๅจไธๅ
|
|
2383
|
+
# ่พๅบ็ฎๅฝไธไผ่ขซๅ่ฝฌๅไธ้๏ผ่ๅก็้ฃๆก็บฟ่ฏป็ๅๆฏๅฆไธๅค๏ผ2026-10-01๏ผใ
|
|
2384
|
+
VOICE_STATE['cache'] = wechat_voice.TranscriptCache(wechat_voice.DEFAULT_CACHE_DIR)
|
|
2383
2385
|
try:
|
|
2384
2386
|
VOICE_STATE['map'] = wechat_voice.load_voice_map(
|
|
2385
2387
|
args.db, args.key, args.salt, args.passphrase, args.talker)
|
package/scripts/fav_notes.py
CHANGED
|
@@ -99,7 +99,10 @@ def classify_source(item: dict) -> str:
|
|
|
99
99
|
def favorite_text(item: dict, fetch=None):
|
|
100
100
|
"""ไธๆกๆถ่็ๆญฃๆ๏ผๆฌๅฐๆๆฌไผๅ
๏ผๆฒกๆ๏ผๆๅคช็ญ๏ผๅฐฑๆ้พๆฅใ่ฟๅ (ๆญฃๆ, ๆฅๆบ่ฏดๆ)ใ
|
|
101
101
|
|
|
102
|
-
ๆถ่ๅไธค็ง๏ผ็ฌ่ฎฐ/ๆๆฌ็ฑป**่ชๅธฆๅ
ๅฎน**๏ผ`desc`/`content
|
|
102
|
+
ๆถ่ๅไธค็ง๏ผ็ฌ่ฎฐ/ๆๆฌ็ฑป**่ชๅธฆๅ
ๅฎน**๏ผ`desc`/`content`๏ผ๏ผๆ็ซ ็ฑป**ๅบๆฌ**ๅชๆ `link`โโ
|
|
103
|
+
"ๅบๆฌ"ๆฏ้ๅบๆฅ็๏ผๆฌๆบ 1,234 ็ฏๆ็ซ ้ๆ **7 ๆก**็็ฝ้กตๆ่ฟฐ๏ผ`weburlitem/pagedesc`๏ผ่ถ
่ฟ
|
|
104
|
+
`MIN_ARTICLE_CHARS`๏ผไผ่ขซๅฝๆ"่ชๅธฆๆญฃๆ"๏ผ้ฃๆฏ**ๆ่ฆไธๆฏๆญฃๆ**๏ผใ้จๆง 200 ๅญๆกไฝไบ็ญๅชๅฃฐ
|
|
105
|
+
๏ผไพๅฆๆฌๆบ 20 ๆก `type=1` ็ `desc` ๅชๆ 49 ๅญใไธๆฏ่ทฏๅพๅผๅญ็ฌฆไธฒ โ ๅ
จ้จ่ฝ none๏ผใ
|
|
103
106
|
ๆๅๅค็จๆฅๆฅ้ฃๆก็บฟ็ `fetch_article_cached`โโไธ้ๅ็ฌฌไบไปฝ๏ผ้ฃๅฅๅพฎไฟก UA ็ป WAFใ
|
|
104
107
|
gzipใ้่ฏๆฏ่ธฉๅบๆฅ็๏ผ๏ผ่ไธ**ๅธฆ็ผๅญ**๏ผๆฅๆฅๆ่ฟ็ๆ็ซ ่ฟ้้ถ็ฝ็ปใ
|
|
105
108
|
|