python-wechat-kf/app/routes/api.py

94 lines
2.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.

from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from pydantic import BaseModel
from app.database import get_db
from app.services.message_service import (
get_conversations,
get_messages,
send_and_save,
save_messages,
WECHAT_ERROR_MAP,
)
from app.services.wechat_client import sync_msg, list_accounts
from app.config import settings
router = APIRouter(prefix="/api")
class SendMsgRequest(BaseModel):
external_userid: str
content: str
open_kfid: str = ""
class SyncRequest(BaseModel):
cursor: str = ""
token: str = ""
limit: int = 100
open_kfid: str = ""
@router.get("/conversations")
async def list_conversations(
open_kfid: str = Query(""),
db: AsyncSession = Depends(get_db),
):
"""获取会话列表"""
conversations = await get_conversations(db, open_kfid)
return {"conversations": conversations}
@router.get("/messages")
async def list_messages(
external_userid: str = Query(...),
open_kfid: str = Query(""),
page: int = Query(1, ge=1),
page_size: int = Query(50, ge=1, le=200),
db: AsyncSession = Depends(get_db),
):
"""获取某客户的消息列表"""
messages = await get_messages(db, external_userid, open_kfid, page, page_size)
return {"messages": messages}
@router.post("/send")
async def send_message(
req: SendMsgRequest,
db: AsyncSession = Depends(get_db),
):
"""发送消息"""
result = await send_and_save(db, req.external_userid, req.content, req.open_kfid)
errcode = result.get("errcode", -1)
return {
**result,
"errmsg_cn": WECHAT_ERROR_MAP.get(errcode, result.get("errmsg", "")),
}
@router.post("/sync")
async def sync_messages(
req: SyncRequest,
db: AsyncSession = Depends(get_db),
):
"""手动拉取消息(轮询模式)"""
kfid = req.open_kfid or settings.open_kfid
result = await sync_msg(kfid, req.cursor, req.token, req.limit)
msg_list = result.get("msg_list", [])
saved = 0
if msg_list:
saved = await save_messages(db, msg_list)
errcode = result.get("errcode", -1)
return {
**result,
"saved": saved,
"total": len(msg_list),
"errmsg_cn": WECHAT_ERROR_MAP.get(errcode, result.get("errmsg", "")),
}
@router.get("/accounts")
async def get_accounts():
"""获取客服账号列表(用于查看正确的 open_kfid"""
result = await list_accounts()
return result