This commit is contained in:
2026-02-27 16:03:04 +08:00
commit 5aedf1665d
137 changed files with 17604 additions and 0 deletions

119
archive/view_chats.py Normal file
View File

@@ -0,0 +1,119 @@
"""
聊天记录查看工具
用法:
python view_chats.py # 列出所有客户
python view_chats.py <客户ID> # 查看某客户的全部对话
python view_chats.py <客户ID> --today # 只看今天
python view_chats.py --search <关键词> # 全文搜索
"""
import sys
import argparse
from chat_log_db import get_customers, get_conversation, get_conversation_today, search_messages
# ANSI 颜色
GREEN = "\033[92m"
BLUE = "\033[94m"
YELLOW = "\033[93m"
GRAY = "\033[90m"
RESET = "\033[0m"
BOLD = "\033[1m"
def list_customers():
customers = get_customers(limit=200)
if not customers:
print("暂无聊天记录")
return
print(f"\n{BOLD}{'='*60}{RESET}")
print(f"{BOLD} 客户聊天记录总览 共 {len(customers)} 位客户{RESET}")
print(f"{BOLD}{'='*60}{RESET}")
print(f" {'客户ID':<22} {'昵称':<12} {'平台':<15} {'消息数':>6} {'最后联系'}")
print(f" {'-'*22} {'-'*12} {'-'*15} {'-'*6} {'-'*19}")
for c in customers:
cid = c["customer_id"][:20]
name = (c["customer_name"] or "未知")[:10]
plat = (c["platform"] or "未知")[:13]
total = c["total_msgs"]
last = c["last_time"][:16]
print(f" {YELLOW}{cid:<22}{RESET} {name:<12} {GRAY}{plat:<15}{RESET} {total:>6}{last}")
print(f"\n{GRAY}查看某客户对话python view_chats.py <客户ID>{RESET}\n")
def show_conversation(customer_id: str, today_only: bool = False):
if today_only:
records = get_conversation_today(customer_id)
label = "今日对话"
else:
records = get_conversation(customer_id, limit=300)
label = "全部对话"
if not records:
print(f" {GRAY}暂无记录{RESET}")
return
print(f"\n{BOLD}{'='*60}{RESET}")
print(f"{BOLD} 客户:{customer_id} {label}{len(records)}{RESET}")
print(f"{BOLD}{'='*60}{RESET}\n")
last_date = ""
for r in records:
ts = r["timestamp"]
date = ts[:10]
time = ts[11:16]
msg = r["message"]
direction = r["direction"]
if date != last_date:
print(f" {GRAY}── {date} ──────────────────────────────{RESET}")
last_date = date
if direction == "in":
# 客户消息,左对齐蓝色
print(f" {GRAY}{time}{RESET} {BLUE}【客户】{RESET} {msg}")
else:
# 客服回复,右对齐绿色
print(f" {GRAY}{time}{RESET} {GREEN}【客服】{RESET} {msg}")
print()
def show_search(keyword: str):
results = search_messages(keyword, limit=50)
if not results:
print(f" 未找到包含"{keyword}"的消息")
return
print(f"\n{BOLD}搜索:"{keyword}"{len(results)} 条结果{RESET}\n")
for r in results:
direction = "客户" if r["direction"] == "in" else "客服"
color = BLUE if r["direction"] == "in" else GREEN
print(f" {GRAY}{r['timestamp'][:16]}{RESET} {YELLOW}{r['customer_id'][:20]}{RESET} {color}[{direction}]{RESET} {r['message']}")
print()
def main():
parser = argparse.ArgumentParser(
description="查看按用户分开的聊天记录",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=__doc__,
)
parser.add_argument("customer_id", nargs="?", help="客户ID不填则列出所有客户")
parser.add_argument("--today", action="store_true", help="只显示今天的对话")
parser.add_argument("--search", metavar="关键词", help="全文搜索所有消息")
args = parser.parse_args()
if args.search:
show_search(args.search)
elif args.customer_id:
show_conversation(args.customer_id, today_only=args.today)
else:
list_customers()
if __name__ == "__main__":
main()