Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 23 additions & 13 deletions wechat_cli/commands/favorites.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,34 +21,39 @@


def _parse_fav_content(content, fav_type):
"""从 XML content 提取摘要信息。"""
"""从 XML content 提取摘要信息和 URL。"""
if not content:
return ''
return '', ''
try:
root = ET.fromstring(content)
except ET.ParseError:
return ''
return '', ''
item = root if root.tag == 'favitem' else root.find('.//favitem')
if item is None:
return ''
return '', ''

if fav_type == 1:
return (item.findtext('desc') or '').strip()
return (item.findtext('desc') or '').strip(), ''
if fav_type == 2:
return '[图片收藏]'
return '[图片收藏]', ''
if fav_type == 5:
title = (item.findtext('.//pagetitle') or '').strip()
desc = (item.findtext('.//pagedesc') or '').strip()
return f"{title} - {desc}" if desc else title
url = (item.findtext('.//source/link')
or item.findtext('.//dataitem/stream_weburl')
or '').strip()
parts = [p for p in [title, desc] if p]
summary = ' - '.join(parts) if parts else '[文章]'
return summary, url
if fav_type == 19:
return (item.findtext('desc') or '').strip()
return (item.findtext('desc') or '').strip(), ''
if fav_type == 20:
nickname = (item.findtext('.//nickname') or '').strip()
desc = (item.findtext('.//desc') or '').strip()
parts = [p for p in [nickname, desc] if p]
return ' '.join(parts) if parts else '[视频号]'
return (' '.join(parts) if parts else '[视频号]'), ''
desc = (item.findtext('desc') or '').strip()
return desc if desc else '[收藏]'
return (desc if desc else '[收藏]'), ''


@click.command("favorites")
Expand Down Expand Up @@ -111,16 +116,19 @@ def favorites(ctx, limit, fav_type, query, fmt):
from_display = names.get(fromusr, fromusr) if fromusr else ''
chat_display = names.get(realchat, realchat) if realchat else ''

summary = _parse_fav_content(content, typ)
summary, url = _parse_fav_content(content, typ)

results.append({
entry = {
'id': local_id,
'type': _FAV_TYPE_MAP.get(typ, f'type={typ}'),
'time': datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M'),
'summary': summary,
'from': from_display,
'source_chat': chat_display,
})
}
if url:
entry['url'] = url
results.append(entry)

if fmt == 'json':
output({
Expand All @@ -134,6 +142,8 @@ def favorites(ctx, limit, fav_type, query, fmt):
lines = []
for r in results:
entry = f"[{r['time']}] [{r['type']}] {r['summary']}"
if r.get('url'):
entry += f"\n 链接: {r['url']}"
if r['from']:
entry += f"\n 来自: {r['from']}"
if r['source_chat']:
Expand Down