ReEdgeGPT:免费接入Bing Copilot的Python逆向工程实践指南
1. 项目概述与核心价值如果你和我一样对探索前沿AI对话模型充满好奇但又不想被高昂的API费用或复杂的申请流程劝退那么今天要聊的这个开源项目ReEdgeGPT绝对值得你花时间了解一下。简单来说它是一个通过逆向工程实现的Python库让你能够免费、直接地与新版Bing Chat现在更常被称为Copilot进行对话交互。这听起来可能有点“黑科技”但它的核心价值在于为开发者、研究者和爱好者提供了一个绕过官方限制、低成本研究和使用大型语言模型的窗口。在AI应用井喷的今天像GPT-4这样的模型能力强大但直接使用官方接口往往意味着不菲的成本和地域限制。ReEdgeGPT的出现巧妙地利用了微软通过Bing/Copilot网页端提供的免费服务将其封装成易于调用的Python接口。这意味着你可以用几行代码就启动一个具备联网搜索、多轮对话、甚至图像生成能力的“智能助手”而无需支付任何费用。这对于个人项目原型验证、自动化脚本开发、或是单纯想体验最新AI对话能力的朋友来说无疑是一个极具吸引力的选择。当然天下没有免费的午餐。这种“非官方”的接入方式也伴随着一些挑战比如需要手动管理身份验证Cookie、可能面临服务端策略变更导致接口失效、以及需要处理一些反爬虫机制等。但正是这些挑战让这个项目不仅仅是一个工具更是一个学习网络协议、理解现代Web应用交互的绝佳案例。接下来我将带你从零开始深入拆解ReEdgeGPT的部署、使用、高级功能以及那些官方文档里不会写的“避坑指南”。2. 环境准备与核心依赖解析在开始敲代码之前扎实的环境准备是成功的第一步。ReEdgeGPT作为一个深度依赖特定网络环境和身份验证的项目其准备工作比安装一个普通的Python包要稍微复杂一些但每一步都有其必要性。2.1 Python环境与基础安装首先确保你的Python版本在3.9或以上。这是项目明确声明的硬性要求因为代码中可能使用了较新的语法特性如类型注解的增强。你可以通过命令行输入python --version或python3 --version来确认。安装包本身非常简单使用pip一键完成pip install re_edge_gpt --upgrade这里我强烈建议加上--upgrade参数。因为这个项目处于活跃开发中作者会频繁修复由于Bing/Copilot前端变更导致的接口适配问题。保持最新版本能最大程度避免“昨天还能用今天突然报错”的尴尬情况。安装完成后你可以尝试导入来验证import re_edge_gpt print(re_edge_gpt.__version__)如果成功打印出版本号说明基础包安装无误。2.2 身份验证Cookie的获取与管理这是整个项目最核心也最容易出错的环节。ReEdgeGPT通过模拟浏览器行为与Bing/Copilot服务通信而Cookie就是你的“通行证”。微软通过Cookie来验证用户身份、维持会话状态。简单来说你需要从你已经登录了微软账户并能够正常访问Bing Chat或Copilot的浏览器中导出这些Cookie信息。为什么需要Cookie微软并非在全球所有地区都无条件开放Bing Chat/Copilot的免费使用。在某些IP地址特别是数据中心IP、常见的代理或VPN出口IP发起请求时服务器会要求进行账户登录验证。直接从代码发起请求没有浏览器环境下的登录状态就会被拦截。提供Cookie就是告诉服务器“我是那个已经在你这里登录过的合法用户”。实操步骤获取你的Cookie浏览器选择与配置推荐方案直接使用最新版的Microsoft Edge浏览器。这是最“原生”的环境兼容性最好。备用方案使用Chrome或Firefox但需要安装“User-Agent Switcher”类插件将浏览器的User-Agent字符串修改为Edge的。例如Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.51。这样做是为了让你的请求看起来更像来自Edge浏览器降低被识别为异常客户端的风险。登录与验证用上述配置好的浏览器访问https://bing.com/chat或https://copilot.microsoft.com。如果页面直接显示出聊天对话框并且你可以正常发送消息恭喜你你所在的地区或网络可能不需要强制登录。但为了保险起见我仍然建议登录你的微软账户点击页面右上角进行登录。如果页面提示你需要登录或加入候补名单请按要求登录你的微软账户。导出Cookie在能够正常聊天的页面安装并打开“Cookie Editor”浏览器扩展Chrome和Firefox商店均有。点击扩展图标在弹出的面板中你应该能看到一系列域名包含.bing.com或.microsoft.com的Cookie。找到右下角的“Export”按钮点击后选择“Export as JSON”。此时你所有的Cookie数据一个庞大的JSON数组已经被复制到剪贴板。保存Cookie文件在你的项目目录下创建一个新的文本文件。将剪贴板内容粘贴进去。关键一步将文件命名为bing_cookies.json或copilot_cookies.json。文件名必须严格匹配这个模式因为ReEdgeGPT内部会通过正则表达式来识别和加载这些文件。如果你是为Bing Chat准备的就用前者如果专门为Copilot就用后者。妥善保管这个文件。它包含了你的登录会话信息切勿分享或上传到公开仓库。重要提示微软Cookie的有效期在不断调整。早期可能有一周但现在普遍缩短到3天左右。这意味着大约3天后你之前导出的Cookie就会失效再次调用API时会收到“Authentication failed”之类的错误。此时你需要重新打开浏览器确保会话依然有效重复上述导出步骤更新你的cookies.json文件。这是使用此类逆向工程工具最常见的维护成本。3. 核心功能使用详解环境准备好后我们就可以开始探索ReEdgeGPT的核心功能了。它主要提供了两种使用方式便捷的命令行交互和灵活的Python API编程。我们将逐一拆解。3.1 命令行交互模式快速测试与对话对于想快速体验或进行简单测试的用户命令行工具是最佳选择。安装好包后直接在终端运行python -m re_edge_gpt这会启动一个交互式的聊天会话。你可以直接输入问题按回车发送。程序会以流式逐字输出的方式返回Bing/Copilot的回复。命令行工具提供了丰富的参数来定制你的会话--cookie-file指定自定义的Cookie文件路径。如果不指定它会尝试在当前目录寻找bing_cookies.json。--style {creative, balanced, precise}设置对话风格。creative天马行空富有想象力balanced在创造性和准确性间平衡precise更倾向于事实准确和简洁。根据你的问题类型选择。--no-stream关闭流式输出等待回答完全生成后一次性打印。适合需要完整记录的场景。--locale设置地区例如en-US,zh-CN。这会影响模型的一些本地化行为如日期格式、部分用语。--prompt提供一个初始提示直接开始对话。实操示例python -m re_edge_gpt --cookie-file ./my_cookies.json --style balanced --locale zh-CN这个命令会使用你指定的Cookie文件以平衡模式、中文环境启动聊天。在聊天过程中你可以输入!help查看支持的命令输入!exit退出。命令行模式非常适合快速验证Cookie是否有效以及感受不同对话风格的区别。3.2 Python API编程集成与自动化对于开发者而言将ReEdgeGPT集成到自己的Python脚本或应用中才是重头戏。其核心是Chatbot类并且强烈建议使用asyncio异步编程模型因为网络请求是I/O密集型操作异步能极大提升效率。基础对话流程 下面是一个最简化的、包含完整错误处理的异步对话示例import asyncio import json from pathlib import Path from re_edge_gpt import Chatbot, ConversationStyle async def chat_with_bing(): bot None try: # 1. 加载Cookie cookie_path Path.cwd() / bing_cookies.json with open(cookie_path, encodingutf-8) as f: cookies json.load(f) # 2. 创建聊天机器人实例 bot await Chatbot.create(cookiescookies) # 如果需要使用Copilot模式则bot await Chatbot.create(cookiescookies, modeCopilot) # 3. 发送提问并获取回复 response await bot.ask( prompt用简单的语言解释量子计算的基本原理, conversation_styleConversationStyle.balanced, simplify_responseTrue, # 推荐开启返回结构化的简洁数据 wss_linkwss://sydney.bing.com/sydney/ChatHub # 通常无需指定除非官方变更 ) # 4. 处理回复 # simplify_responseTrue 时返回一个字典其中 text 键是主要回复内容 if response and text in response: print(Bing的回答) print(response[text]) # 回复中可能还包含其他信息如建议的追问、搜索来源等 if suggestions in response: print(\n建议追问, response[suggestions]) else: # simplify_responseFalse 时返回原始复杂响应 print(json.dumps(response, indent2, ensure_asciiFalse)) except Exception as e: print(f对话过程中出现错误{e}) # 这里可以添加更细致的异常处理如网络错误、认证错误等 finally: # 5. 务必关闭会话释放资源 if bot: await bot.close() # 运行异步函数 if __name__ __main__: # 如果在Jupyter Notebook中运行需要先安装 nest_asyncio 并 apply() # from nest_asyncio import apply; apply() asyncio.run(chat_with_bing())代码逐行解析与避坑点Cookie加载使用pathlib.Path构建路径是跨平台的好习惯。确保文件读取编码为utf-8。创建实例Chatbot.create是一个异步工厂方法。mode参数默认为Bing如果你专门为Copilot导出了Cookie记得设置为modeCopilot。发起提问ask方法是核心。prompt: 你的问题或指令。可以很长模型有较大的上下文窗口。conversation_style: 使用ConversationStyle枚举类清晰且不易出错。simplify_responseTrue强烈建议开启。如果关闭你会收到一个非常庞大、嵌套很深的原始JSON响应包含了对话ID、消息列表、节流状态等大量元数据不利于快速提取文本。开启后它会帮你提取出最关键的回复文本、建议追问和可能的网络搜索结果。wss_link: 这是WebSocket连接的端点。除非项目维护者特别说明或你遇到了连接问题否则不要修改。Bing的后端服务地址可能会变更关注项目GitHub的Issue区可以获取最新信息。处理回复简化后的响应是一个字典。主要回复在response[text]中。回复内容通常以Markdown格式返回包含加粗、列表、链接等你可以根据需要进一步渲染或处理。资源清理在finally块中调用await bot.close()至关重要。这会优雅地关闭底层的WebSocket连接避免资源泄露。即使程序中途出错这个清理步骤也会被执行。多轮对话的实现Chatbot实例在创建后会维护一个会话上下文。你只需要连续调用ask方法它就会自动将之前的对话历史包含在新的请求中实现连贯的多轮对话。async def multi_turn_chat(bot): first_response await bot.ask(莎士比亚最著名的悲剧是哪一部, simplify_responseTrue) print(fAI: {first_response[text]}) # 基于上一轮回答继续提问 follow_up await bot.ask(它主要讲述了什么故事, simplify_responseTrue) print(fAI: {follow_up[text]})这就是会话上下文的魔力你无需手动管理历史记录。4. 高级功能与场景应用掌握了基础对话我们来看看ReEdgeGPT的一些高级玩法这些功能能极大扩展其应用场景。4.1 图像生成功能除了文本对话新版Bing/Copilot还集成了DALL-E图像生成模型。ReEdgeGPT通过ImageGen和ImageGenAsync类提供了同步和异步的图片生成接口。使用前的重要准备 图像生成功能需要另一个独立的认证Cookie名为_U。这个Cookie和聊天用的Cookie不是同一套。获取_UCookie在已登录的Edge或模拟Edge的浏览器中打开https://bing.com注意是主页不是聊天页。按下F12打开开发者工具。切换到“控制台”(Console)标签页。输入以下命令并按回车cookieStore.get(_U).then(result console.log(result.value))控制台会打印出一长串字符串这就是你需要的_UCookie值。将其复制出来保存到一个文本文件中例如命名为bing_auth_cookie.txt。图像生成与下载示例import asyncio from re_edge_gpt import ImageGenAsync import os async def generate_and_save_image(): # 1. 读取认证Cookie with open(bing_auth_cookie.txt, r) as f: auth_cookie f.read().strip() # 注意去除可能的换行符 # 2. 创建异步图像生成器 async_gen ImageGenAsync(auth_cookieauth_cookie) # 3. 生成图像返回的是图片URL列表 try: print(正在生成图像...) image_urls await async_gen.get_images(promptA serene landscape with a lake and mountains at sunset, digital art) print(f生成了 {len(image_urls)} 张图片的链接。) # 4. 下载并保存图像 output_dir generated_images os.makedirs(output_dir, exist_okTrue) # 创建输出目录 # 你可以选择下载全部或指定某一张 await async_gen.save_images(image_urls, output_dir) print(f图片已保存至目录{output_dir}) # 或者下载单张并自定义文件名 # await async_gen.save_images([image_urls[0]], output_dir, file_namemy_landscape) except Exception as e: print(f图像生成失败{e}) # 运行 asyncio.run(generate_and_save_image())图像生成功能的注意事项配额限制微软对图像生成有次数限制。虽然具体数值不公开但频繁调用很快会触发限制返回错误或需要验证码。内容政策生成内容需遵守微软的内容政策避免生成暴力、成人或侵权内容。网络问题save_images方法会从返回的URL下载图片确保你的网络能访问这些CDN地址。4.2 插件功能的使用ReEdgeGPT支持通过plugin_ids参数来激活特定的对话插件这可以增强模型在某些垂直领域的能力例如计算、旅行规划等。插件ID需要从Bing/Copilot的生态中获取通常比较隐蔽。如何使用插件 在创建Chatbot实例时传入plugin_ids参数即可。bot await Chatbot.create( cookiescookies, modeBing, # 或 Copilot plugin_ids[c310c353-b9f0-4d76-ab0d-1dd5e979cf68] # 示例插件ID )项目README中给出的示例插件IDc310c353-b9f0-4d76-ab0d-1dd5e979cf68可能是一个用于处理长文本或复杂分析的插件。当你发送一段非常长的文本如项目中的罗马历史时模型可能会调用该插件来辅助理解和总结。如何发现更多插件 目前没有公开的插件市场列表。一种探索方式是监控浏览器中Bing/Copilot网页端的网络请求当使用某些特定功能如“搜索”、“创作”、“洞察”时观察WebSocket发送的消息或网络请求负载中是否包含pluginIds字段。这需要一定的前端调试技巧。4.3 流式输出与实时交互在命令行中我们看到了流式输出在Python API中同样可以实现这对于构建需要实时显示回复的聊天应用非常有用。async def stream_response(): bot await Chatbot.create(cookiescookies) # 注意流式输出时simplify_response 的行为可能不同通常返回一个异步生成器 async for final, response in bot.ask_stream( prompt写一首关于春天的五言绝句, conversation_styleConversationStyle.creative ): # final 是一个布尔值表示是否是最终片段 # response 是当前片段的文本 if not final: print(response, end, flushTrue) # 逐段打印不换行 else: # 最终片段可能包含完整信息或结束标志 print() # 换行 print(--- 流式传输结束 ---) await bot.close()流式输出能显著提升用户体验尤其是在回复较长时用户无需等待全部生成完毕就能看到开头。5. 常见问题排查与实战经验在实际使用中你几乎一定会遇到各种问题。下面是我在长期使用中总结出的最常见错误及其解决方案很多都是爬坑得来的经验。5.1 认证与Cookie相关错误问题1Exception: Authentication failed. You have not been accepted into the beta.原因这是最经典的错误。意味着你提供的Cookie无效、已过期或者你的IP地址/账号没有被授予访问Bing Chat/Copilot的权限。解决步骤检查Cookie文件确保文件路径正确内容格式是有效的JSON。可以用在线JSON校验工具检查。更新CookieCookie很可能已过期特别是超过3天。重新打开浏览器访问bing.com/chat确认能正常聊天然后重新导出并替换Cookie文件。检查网络环境如果你使用了代理或VPN尝试更换节点或直接使用本地网络。某些数据中心IP被微软严格限制。检查账号权限确保你的微软账号确实可以访问Bing Chat/Copilot。可以尝试在浏览器无痕模式下登录该账号看是否能正常使用聊天功能。问题2CaptchaChallenge验证码挑战现象程序运行后长时间无响应或返回错误提示需要解决验证码。原因微软的反爬虫系统检测到异常行为如高频请求、脚本化访问触发了人机验证。解决方案立即停止脚本不要再继续用程序请求。人工干预用之前导出Cookie的那个浏览器手动访问bing.com/chat或copilot.microsoft.com。很大概率会弹出验证码如拼图、文字识别等按照提示完成验证。更新Cookie验证通过后在浏览器中重新导出Cookie。因为完成验证后会话状态更新了新的Cookie包含了“已通过验证”的令牌。降低请求频率在代码中增加随机延迟如await asyncio.sleep(random.uniform(5, 15))模拟人类操作间隔。避免短时间内发送大量请求。5.2 网络与连接错误问题3TimeoutError或ConnectionResetError原因网络不稳定或目标服务器sydney.bing.com暂时不可用或你的本地网络有防火墙/代理限制。解决方案检查本地网络连接。尝试使用--proxy参数命令行或在创建Chatbot时通过proxies参数Python API设置代理。格式如http://user:passhost:port或socks5://host:port。注意代理IP本身也可能被Bing限制。关注项目GitHub的Issue看是否有大规模的服务端故障报告。问题4WSS Link相关错误原因微软更改了WebSocket服务的端点地址。解决方案这是需要社区协作解决的。首先去ReEdgeGPT的GitHub仓库查看最新版本和Issue讨论。开发者可能会发布新版本更新默认的wss_link。你也可以尝试在代码中手动指定await bot.ask(..., wss_link新的WSS地址)。新地址有时可以通过浏览器开发者工具的“网络”(Network)标签页筛选WebSocket (WS)请求来发现。5.3 程序运行与依赖错误问题5在Jupyter Notebook中运行报错RuntimeError: This event loop is already running原因Jupyter本身运行在asyncio事件循环上直接调用asyncio.run()或get_event_loop().run_until_complete()会造成冲突。解决方案安装nest_asyncio包并应用补丁。pip install nest_asyncio在Notebook单元格中import nest_asyncio nest_asyncio.apply() # 然后再运行你的异步代码 await chat_with_bing() # 在Notebook中可以直接用await问题6返回的响应内容乱码或包含特殊字符原因响应中可能包含非ASCII字符如中文、Emoji而控制台或文件编码不支持。解决方案在打印时确保控制台使用UTF-8编码。在Python中设置环境变量PYTHONIOENCODINGutf-8。使用json.dumps(response, ensure_asciiFalse, indent2)来打印字典ensure_asciiFalse能正确显示非英文字符。写入文件时指定encodingutf-8。5.4 性能与稳定性优化建议会话复用与超时创建一个Chatbot实例后可以用于多次ask调用实现多轮对话。但长时间不用的会话可能会超时。对于需要长时间运行的服务最好实现一个会话管理机制定期如每30分钟发送一个心跳消息如“你好”来保持会话活跃或者在检测到会话过期错误时自动重建实例。错误重试机制网络请求天然不稳定务必添加重试逻辑。可以使用tenacity或backoff库对瞬时的网络错误或服务器限流错误进行指数退避重试。import tenacity tenacity.retry( stoptenacity.stop_after_attempt(3), waittenacity.wait_exponential(multiplier1, min4, max10), retry(tenacity.retry_if_exception_type((TimeoutError, ConnectionError))), ) async def robust_ask(bot, prompt): return await bot.ask(promptprompt, simplify_responseTrue)资源限制意识无论是对话还是生图微软后端都有明确的频率限制。不要试图用脚本进行压测或批量生产内容这会导致你的账号或IP被临时甚至永久封禁。以研究和轻度个人使用为主。关注项目动态由于是逆向工程Bing/Copilot前端的任何一次更新都可能导致ReEdgeGPT暂时失效。最好的做法是Star项目的GitHub仓库并关注Release和Issue讨论区。当出现大面积失效时维护者通常会很快发布修复版本。6. 项目架构浅析与安全思考虽然我们主要是使用者但了解一点ReEdgeGPT的内部原理能帮助我们在出现问题时更好地理解和排查。本质上它扮演了一个“无头浏览器”或“协议客户端”的角色。核心通信流程握手与初始化使用提供的Cookie模拟浏览器向Bing/Copilot的WebSocket端点 (wss://sydney.bing.com/sydney/ChatHub) 发起连接完成一系列协议握手建立会话。消息封装将用户的prompt、选择的conversation_style以及其他参数封装成特定格式的JSON消息。这个格式是通过分析浏览器与服务器之间的真实通信逆向得来的。请求与流式接收通过WebSocket发送消息。服务器会以流式chunk by chunk返回响应。ReEdgeGPT的核心工作之一就是正确地拼接这些数据块并从中解析出最终的回复文本、引用来源等信息。会话管理维护对话ID、上下文消息列表等状态以便在后续请求中实现连贯的多轮对话。安全与合规警示账号风险使用此工具意味着你的微软账号行为模式会与脚本行为关联。虽然项目尽力模拟人类操作但仍存在被微软检测为异常活动而导致账号功能受限如暂时无法使用Chat的风险。切勿使用重要的主账号建议使用一个单独的、不包含敏感信息的账号进行测试。服务条款微软的Bing/Copilot服务条款明确禁止未经授权的自动化访问、爬取或大量复制内容。使用此类工具可能存在违反条款的风险。数据隐私你通过此工具发送的所有提示prompt和接收的回复都会经过微软的服务器。避免发送个人隐私、商业秘密或任何敏感信息。项目可持续性这是一个由社区驱动的逆向工程项目完全依赖于微软不改变其前端通信协议。一旦微软进行重大升级或加强防护项目可能随时失效。因此不建议将其用于任何生产环境或关键业务。ReEdgeGPT是一个强大的学习工具和原型验证助手它巧妙地打开了通往大型语言模型的一扇侧门。通过它我们可以低成本地体验AI对话的前沿能力学习网络协议逆向的实践并激发更多关于AI应用集成的创意。然而在享受其便利的同时务必清醒认识其边界和风险以负责任的态度进行探索和使用。