[{"data":1,"prerenderedAt":695},["ShallowReactive",2],{"page-\u002Fblog\u002Fxianyu-ai-assistant":3},{"id":4,"title":5,"body":6,"category":678,"date":679,"description":680,"emoji":681,"extension":682,"image":683,"meta":684,"navigation":685,"path":686,"seo":687,"stem":688,"tags":689,"__hash__":694},"content\u002Fblog\u002Fxianyu-ai-assistant.md","咸鱼客服 AI 助手部署实践",{"type":7,"value":8,"toc":644},"minimark",[9,14,33,38,41,57,66,70,75,78,82,85,113,119,122,129,136,158,162,166,169,172,177,201,207,213,217,220,223,252,259,265,282,285,289,293,300,304,307,328,332,335,349,353,360,364,367,376,379,393,396,400,404,411,431,435,438,463,467,471,477,481,487,491,538,541,545,548,554,560,566,572,576,582,598,604,618,622,625,631,637,640],[10,11,13],"h1",{"id":12},"咸鱼客服项目部署全过程总结","🤖 咸鱼客服项目部署全过程总结",[15,16,17,26],"blockquote",{},[18,19,20,21,25],"p",{},"项目目标：部署一个可用的 ",[22,23,24],"strong",{},"咸鱼智能客服系统","，实现买家消息处理与 AI 回复能力。",[18,27,28,29,32],{},"最终结果：原始接口直连方案因平台风控受阻，已成功转为 ",[22,30,31],{},"本地可运行的闲鱼 AI 客服助手方案","。",[34,35,37],"h2",{"id":36},"一项目背景与目标","一、项目背景与目标",[18,39,40],{},"本次项目最初希望基于 GitHub 开源仓库完成一个\"咸鱼客服\"系统部署，目标包括：",[42,43,44,48,51,54],"ul",{},[45,46,47],"li",{},"接入闲鱼消息场景",[45,49,50],{},"配置大模型 API",[45,52,53],{},"通过 AI 自动生成客服回复",[45,55,56],{},"实现尽可能自动化的客服处理流程",[18,58,59,60],{},"最开始采用的项目仓库为：",[61,62,63],"a",{"href":63,"rel":64},"https:\u002F\u002Fgithub.com\u002Fshaxiu\u002FXianyuAutoAgent",[65],"nofollow",[34,67,69],{"id":68},"二第一阶段部署原始仓库-xianyuautoagent","二、第一阶段：部署原始仓库 XianyuAutoAgent",[71,72,74],"h3",{"id":73},"_1-获取项目源码","1. 获取项目源码",[18,76,77],{},"最开始通过 Codex 协助完成仓库部署。由于本地环境访问 GitHub 存在限制，因此通过替代方式将项目源码下载并解压到本地目录。",[71,79,81],{"id":80},"_2-检查项目依赖","2. 检查项目依赖",[18,83,84],{},"对仓库进行检查后，确认其主要依赖包括：",[42,86,87,93,98,103,108],{},[45,88,89],{},[90,91,92],"code",{},"openai",[45,94,95],{},[90,96,97],{},"websockets",[45,99,100],{},[90,101,102],{},"loguru",[45,104,105],{},[90,106,107],{},"python-dotenv",[45,109,110],{},[90,111,112],{},"requests",[18,114,115,116],{},"随后执行依赖安装：",[90,117,118],{},"pip install -r requirements.txt",[18,120,121],{},"安装成功后，说明项目已经满足基本运行条件。",[71,123,125,126],{"id":124},"_3-创建并配置-env","3. 创建并配置 ",[90,127,128],{},".env",[18,130,131,132,135],{},"根据项目 README 和 ",[90,133,134],{},".env.example","，需要配置以下关键参数：",[42,137,138,143,148,153],{},[45,139,140],{},[90,141,142],{},"API_KEY",[45,144,145],{},[90,146,147],{},"COOKIES_STR",[45,149,150],{},[90,151,152],{},"MODEL_BASE_URL",[45,154,155],{},[90,156,157],{},"MODEL_NAME",[34,159,161],{"id":160},"三第二阶段获取-cookie-与配置大模型","三、第二阶段：获取 Cookie 与配置大模型",[71,163,165],{"id":164},"_1-获取闲鱼-cookie","1. 获取闲鱼 Cookie",[18,167,168],{},"为了模拟已登录的闲鱼网页端身份，需要获取浏览器中的 Cookie。",[18,170,171],{},"主要尝试了两种方式：",[18,173,174],{},[22,175,176],{},"方式一：通过 Network 获取",[178,179,180,183,186,189,192,195,198],"ol",{},[45,181,182],{},"打开闲鱼网页版并登录",[45,184,185],{},"按 F12 打开开发者工具",[45,187,188],{},"切换到 Network",[45,190,191],{},"刷新页面",[45,193,194],{},"点击某个 xhr\u002Ffetch 请求",[45,196,197],{},"在 Request Headers 中找到 cookie",[45,199,200],{},"复制完整 Cookie 串",[18,202,203,206],{},[22,204,205],{},"方式二：通过 Application 获取","\n在 Application > Cookies 中查看各个 Cookie 字段，但需要手动拼接。",[18,208,209,210,32],{},"最终确认，",[22,211,212],{},"通过 Network 直接复制请求头中的 Cookie 更稳妥",[71,214,216],{"id":215},"_2-配置模型参数","2. 配置模型参数",[18,218,219],{},"项目需要接入兼容 OpenAI 接口的大模型服务。",[18,221,222],{},"本次实践中使用的是阿里云百炼兼容模式配置：",[224,225,230],"pre",{"className":226,"code":227,"language":228,"meta":229,"style":229},"language-env shiki shiki-themes github-light github-dark","MODEL_BASE_URL=https:\u002F\u002Fdashscope.aliyuncs.com\u002Fcompatible-mode\u002Fv1\nMODEL_NAME=qwen-max\nAPI_KEY=你的模型密钥\n","env","",[90,231,232,240,246],{"__ignoreMap":229},[233,234,237],"span",{"class":235,"line":236},"line",1,[233,238,239],{},"MODEL_BASE_URL=https:\u002F\u002Fdashscope.aliyuncs.com\u002Fcompatible-mode\u002Fv1\n",[233,241,243],{"class":235,"line":242},2,[233,244,245],{},"MODEL_NAME=qwen-max\n",[233,247,249],{"class":235,"line":248},3,[233,250,251],{},"API_KEY=你的模型密钥\n",[71,253,255,256,258],{"id":254},"_3-env-配置中遇到的问题","3. ",[90,257,128],{}," 配置中遇到的问题",[18,260,261,262,264],{},"在配置过程中，项目曾持续提示缺少 ",[90,263,142],{},"。排查后发现：",[42,266,267,272,277],{},[45,268,269,271],{},[90,270,128],{}," 第一行前存在隐藏字符",[45,273,274,276],{},[90,275,147],{}," 被写成了多行",[45,278,279,281],{},[90,280,157],{}," 格式不规范",[18,283,284],{},"经过调整后，所有字段均已成功读取。",[34,286,288],{"id":287},"四第三阶段运行原始项目并排查失败原因","四、第三阶段：运行原始项目并排查失败原因",[71,290,292],{"id":291},"_1-首次运行项目","1. 首次运行项目",[18,294,295,296,299],{},"在环境变量能够正确读取后，执行 ",[90,297,298],{},"python main.py","，程序成功进入实际执行阶段，但在\"获取初始 token\"时失败。",[71,301,303],{"id":302},"_2-错误表现","2. 错误表现",[18,305,306],{},"多次测试后，错误现象始终一致：",[42,308,309,316,322],{},[45,310,311,312,315],{},"错误发生在 ",[22,313,314],{},"获取初始 token"," 阶段",[45,317,318,319],{},"接口返回 ",[90,320,321],{},"FAIL_SYS_USER_VALIDATE",[45,323,324,325],{},"同时出现 ",[90,326,327],{},"RGV587_ERROR",[71,329,331],{"id":330},"_3-原因分析","3. 原因分析",[18,333,334],{},"后续排查后得出如下结论：",[42,336,337,340,343,346],{},[45,338,339],{},"当前仓库的核心思路是使用 Cookie 直接请求闲鱼相关接口",[45,341,342],{},"即使 Cookie 是最新获取的，程序仍然会在 token 获取阶段被平台拦截",[45,344,345],{},"当前平台风控更严格，仅凭 Cookie 已不足以通过校验",[45,347,348],{},"平台可能同时校验设备指纹、浏览器上下文、JS 环境、签名链路等额外信息",[71,350,352],{"id":351},"_4-阶段性结论","4. 阶段性结论",[15,354,355],{},[18,356,357],{},[22,358,359],{},"原始仓库 XianyuAutoAgent 当前方案已被平台风控拦截，不适合继续投入。",[34,361,363],{"id":362},"五第四阶段调整思路转向本地-ai-客服助手方案","五、第四阶段：调整思路，转向本地 AI 客服助手方案",[18,365,366],{},"在确认原始方案无法稳定落地后，项目方向进行了调整：",[18,368,369,372,373],{},[22,370,371],{},"新目标","：构建一个 ",[22,374,375],{},"本地可运行的闲鱼 AI 客服助手",[18,377,378],{},"新的目标是：",[42,380,381,384,387,390],{},[45,382,383],{},"输入商品信息",[45,385,386],{},"输入买家消息",[45,388,389],{},"调用大模型生成客服回复",[45,391,392],{},"通过图形界面辅助客服处理对话",[18,394,395],{},"这个方向相比原始方案更稳、更容易落地。",[34,397,399],{"id":398},"六第五阶段创建新的本地项目","六、第五阶段：创建新的本地项目",[71,401,403],{"id":402},"_1-新项目定位","1. 新项目定位",[18,405,406,407,410],{},"新的项目采用 ",[22,408,409],{},"Python + Streamlit"," 实现，主要功能包括：",[42,412,413,416,419,422,425,428],{},[45,414,415],{},"商品信息输入（标题、成色、价格、是否包邮、最低可接受价）",[45,417,418],{},"买家消息输入",[45,420,421],{},"大模型接口调用",[45,423,424],{},"自动生成客服回复",[45,426,427],{},"支持多轮对话上下文",[45,429,430],{},"支持多种回复模式（礼貌回复、简洁回复、促成交回复）",[71,432,434],{"id":433},"_2-codex-自动生成项目","2. Codex 自动生成项目",[18,436,437],{},"Codex 根据新的目标重新生成了一个本地项目，完成了：",[42,439,440,443,448,453,457,460],{},[45,441,442],{},"项目结构搭建",[45,444,445],{},[90,446,447],{},"requirements.txt",[45,449,450],{},[90,451,452],{},"main.py",[45,454,455],{},[90,456,134],{},[45,458,459],{},"Streamlit 页面",[45,461,462],{},"回复生成逻辑",[34,464,466],{"id":465},"七第六阶段依赖安装测试与启动","七、第六阶段：依赖安装、测试与启动",[71,468,470],{"id":469},"_1-安装依赖","1. 安装依赖",[18,472,473,474,476],{},"执行 ",[90,475,118],{},"，安装成功。",[71,478,480],{"id":479},"_2-语法检测","2. 语法检测",[18,482,473,483,486],{},[90,484,485],{},"python -m py_compile main.py","，通过。",[71,488,490],{"id":489},"_3-启动-streamlit-页面","3. 启动 Streamlit 页面",[224,492,496],{"className":493,"code":494,"language":495,"meta":229,"style":229},"language-bash shiki shiki-themes github-light github-dark","cd E:\\github\\咸鱼客服\\xianyu_ai_assistant\nstreamlit run main.py\n","bash",[90,497,498,526],{"__ignoreMap":229},[233,499,500,504,508,511,514,517,520,523],{"class":235,"line":236},[233,501,503],{"class":502},"sj4cs","cd",[233,505,507],{"class":506},"sZZnC"," E:",[233,509,510],{"class":502},"\\g",[233,512,513],{"class":506},"ithub",[233,515,516],{"class":502},"\\咸",[233,518,519],{"class":506},"鱼客服",[233,521,522],{"class":502},"\\x",[233,524,525],{"class":506},"ianyu_ai_assistant\n",[233,527,528,532,535],{"class":235,"line":242},[233,529,531],{"class":530},"sScJk","streamlit",[233,533,534],{"class":506}," run",[233,536,537],{"class":506}," main.py\n",[18,539,540],{},"页面成功启动。",[34,542,544],{"id":543},"八第七阶段页面结构与功能","八、第七阶段：页面结构与功能",[18,546,547],{},"当前页面主要包括以下模块：",[18,549,550,553],{},[22,551,552],{},"左侧","：模型配置（API_KEY、MODEL_BASE_URL、MODEL_NAME）",[18,555,556,559],{},[22,557,558],{},"中间","：商品信息（标题、成色、价格、是否包邮、最低可接受价）",[18,561,562,565],{},[22,563,564],{},"右侧","：对话输入（回复模式选择、买家消息输入框、生成回复按钮）",[18,567,568,571],{},[22,569,570],{},"下方","：生成结果（展示大模型生成的客服回复内容）",[34,573,575],{"id":574},"九本次实践的阶段性成果","九、本次实践的阶段性成果",[18,577,578,581],{},[22,579,580],{},"成果一","：完成了原始仓库的完整部署验证",[42,583,584,587,590,595],{},[45,585,586],{},"环境配置流程梳理完成",[45,588,589],{},"Cookie 获取方式实践完成",[45,591,592,594],{},[90,593,128],{}," 参数配置规范明确",[45,596,597],{},"原始方案失败原因定位清晰",[18,599,600,603],{},[22,601,602],{},"成果二","：成功搭建本地可运行的咸鱼 AI 客服助手",[42,605,606,609,612,615],{},[45,607,608],{},"接收商品信息",[45,610,611],{},"接收买家消息",[45,613,614],{},"基于大模型生成客服回复",[45,616,617],{},"通过可视化界面进行操作",[34,619,621],{"id":620},"十最终总结","十、最终总结",[18,623,624],{},"本次咸鱼客服项目的部署与实现，整体经历了两个关键阶段。",[18,626,627,630],{},[22,628,629],{},"第一阶段","：尝试基于 GitHub 开源仓库进行部署，虽然顺利完成了各项配置，但项目在获取初始 token 阶段持续触发平台风控，无法稳定运行。",[18,632,633,636],{},[22,634,635],{},"第二阶段","：在确认原始技术路线受限后，及时调整思路，通过 Python + Streamlit 方式成功构建了本地可运行的 AI 客服辅助系统。",[18,638,639],{},"这次实践证明了，当一条技术路线受阻时，及时调整方向、降低目标复杂度，往往能更快地获得可运行的成果。",[641,642,643],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":229,"searchDepth":242,"depth":242,"links":645},[646,647,653,659,665,666,670,675,676,677],{"id":36,"depth":242,"text":37},{"id":68,"depth":242,"text":69,"children":648},[649,650,651],{"id":73,"depth":248,"text":74},{"id":80,"depth":248,"text":81},{"id":124,"depth":248,"text":652},"3. 创建并配置 .env",{"id":160,"depth":242,"text":161,"children":654},[655,656,657],{"id":164,"depth":248,"text":165},{"id":215,"depth":248,"text":216},{"id":254,"depth":248,"text":658},"3. .env 配置中遇到的问题",{"id":287,"depth":242,"text":288,"children":660},[661,662,663,664],{"id":291,"depth":248,"text":292},{"id":302,"depth":248,"text":303},{"id":330,"depth":248,"text":331},{"id":351,"depth":248,"text":352},{"id":362,"depth":242,"text":363},{"id":398,"depth":242,"text":399,"children":667},[668,669],{"id":402,"depth":248,"text":403},{"id":433,"depth":248,"text":434},{"id":465,"depth":242,"text":466,"children":671},[672,673,674],{"id":469,"depth":248,"text":470},{"id":479,"depth":248,"text":480},{"id":489,"depth":248,"text":490},{"id":543,"depth":242,"text":544},{"id":574,"depth":242,"text":575},{"id":620,"depth":242,"text":621},"项目实践","2025-07-10","从开源仓库部署到方案重构，完整记录咸鱼 AI 客服助手的实现过程","🤖","md","https:\u002F\u002Ftrae-api-cn.mchost.guru\u002Fapi\u002Fide\u002Fv1\u002Ftext_to_image?prompt=Modern%20flat%20illustration%20of%20AI%20customer%20service%20chatbot%20concept%2C%20friendly%20robot%20head%20with%20floating%20chat%20bubbles%2C%20dark%20navy%20background%20with%20vibrant%20purple%20gradient%20glow%2C%20minimalist%20tech%20style%2C%20no%20text&image_size=landscape_16_9",{},true,"\u002Fblog\u002Fxianyu-ai-assistant",{"title":5,"description":680},"blog\u002Fxianyu-ai-assistant",[690,691,692,693],"Python","Streamlit","AI","项目部署","X8XOX924t9HCJYfYIDr4uvX0HWf1QgdJ2LzHJm9zpRA",1791776027006]