wechat_msg_crawler/wechat_cli/commands/history.py

88 lines
3.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""get-chat-history 命令"""
import click
from ..core.contacts import get_contact_names
from ..core.messages import (
MSG_TYPE_FILTERS,
MSG_TYPE_NAMES,
collect_chat_history,
parse_time_range,
resolve_chat_context,
validate_pagination,
)
from ..output.formatter import output
@click.command("history")
@click.argument("chat_name")
@click.option("--limit", default=50, help="返回的消息数量")
@click.option("--offset", default=0, help="分页偏移量")
@click.option("--start-time", default="", help="起始时间 YYYY-MM-DD [HH:MM[:SS]]")
@click.option("--end-time", default="", help="结束时间 YYYY-MM-DD [HH:MM[:SS]]")
@click.option("--format", "fmt", default="json", type=click.Choice(["json", "text"]), help="输出格式")
@click.option("--type", "msg_type", default=None, type=click.Choice(MSG_TYPE_NAMES), help="消息类型过滤")
@click.option("--media", is_flag=True, help="解析媒体文件路径(图片/文件/视频/语音)")
@click.pass_context
def history(ctx, chat_name, limit, offset, start_time, end_time, fmt, msg_type, media):
"""获取指定聊天的消息记录
\b
示例:
wechat-cli history "张三" # 最近 50 条消息
wechat-cli history "张三" --limit 100 --offset 50 # 分页查询
wechat-cli history "AI交流群" --start-time "2026-04-01" --end-time "2026-04-02"
wechat-cli history "张三" --format text # 纯文本输出
"""
app = ctx.obj
try:
validate_pagination(limit, offset, limit_max=None)
start_ts, end_ts = parse_time_range(start_time, end_time)
except ValueError as e:
click.echo(f"错误: {e}", err=True)
ctx.exit(2)
chat_ctx = resolve_chat_context(chat_name, app.msg_db_keys, app.cache, app.decrypted_dir)
if not chat_ctx:
click.echo(f"找不到聊天对象: {chat_name}", err=True)
ctx.exit(1)
if not chat_ctx['db_path']:
click.echo(f"找不到 {chat_ctx['display_name']} 的消息记录", err=True)
ctx.exit(1)
names = get_contact_names(app.cache, app.decrypted_dir)
type_filter = MSG_TYPE_FILTERS[msg_type] if msg_type else None
lines, failures = collect_chat_history(
chat_ctx, names, app.display_name_fn,
start_ts=start_ts, end_ts=end_ts, limit=limit, offset=offset,
msg_type_filter=type_filter, resolve_media=media, db_dir=app.db_dir,
)
if fmt == 'json':
output({
'chat': chat_ctx['display_name'],
'username': chat_ctx['username'],
'is_group': chat_ctx['is_group'],
'count': len(lines),
'offset': offset,
'limit': limit,
'start_time': start_time or None,
'end_time': end_time or None,
'type': msg_type or None,
'messages': lines,
'failures': failures if failures else None,
}, 'json')
else:
header = f"{chat_ctx['display_name']} 的消息记录(返回 {len(lines)}offset={offset}, limit={limit}"
if chat_ctx['is_group']:
header += " [群聊]"
if start_time or end_time:
header += f"\n时间范围: {start_time or '最早'} ~ {end_time or '最新'}"
if failures:
header += "\n查询失败: " + "".join(failures)
if lines:
output(header + ":\n\n" + "\n".join(lines), 'text')
else:
output(f"{chat_ctx['display_name']} 无消息记录", 'text')