
Skyvern 如何用 Browser Profile 保存登录状态跳过重复登录【免费下载链接】skyvernAutomate browser based workflows with AI项目地址: https://gitcode.com/GitHub_Trending/sk/skyvern如果你的 Skyvern workflow 需要登录同一个账号反复运行日报抓取、定时数据提取、多个 agent 共用一个已登录的后台每次都重新走一遍登录流程既浪费时间也消耗步骤。Skyvern 的Browser Profile就是为这个场景设计的它保存一份浏览器状态快照cookies、localStorage、session files在后续 run 开始前自动恢复这份状态从而跳过登录步骤、直接以已认证身份运行。本文走一遍完整链路创建一个带persist_browser_session的登录 workflow → 运行它 → 把这次运行的浏览器状态固化为 profile → 用browser_profile_id在后续 run 中复用。示例基于 Skyvern Cloud APIhttps://api.skyvern.com和官方 Python SDKTypeScript SDK 与 REST API 的等价调用在项目文档 browser-profiles.mdx 中都有对应代码。准备工作一个 Skyvern API key。Python 示例中Skyvern(api_keyYOUR_API_KEY)和 cURL 示例中$SKYVERN_API_KEY环境变量都需要替换成你的真实 key。后续复用的那个 workflow 必须走run_workflowagent路径——文档明确说明browser_profile_id只对 agent 生效通过run_task传入会被静默忽略。创建 profile 时name在组织内必须唯一且要区分空 profile 和带状态的 profilebrowser_session_id与workflow_run_id二者都不传时创建的是空 profile。第一步创建带persist_browser_session的登录 workflow关键点persist_browser_session是 workflow定义里的属性必须在create_workflow时写入json_definition不是run_workflow的运行时参数。只有定义里开了这个开关Skyvern 才会在 run 结束后把浏览器状态cookies、storage、session files归档供后续创建 profile 使用。workflow await client.create_workflow( json_definition{ title: Visit Hacker News, persist_browser_session: True, # 写在这里而不是 run_workflow 里 workflow_definition: { parameters: [], blocks: [ { block_type: navigation, label: visit_hn, url: https://news.ycombinator.com, navigation_goal: Navigate to the Hacker News homepage and confirm it loaded } ] } } ) print(workflow.workflow_permanent_id) # 文档示例wpid_494674198088536840 print(workflow.persist_browser_session) # True上面的 URL 和navigation_goal是文档教程里使用的 Hacker News 示例实际使用时替换成你的登录页地址和登录目标真实场景下这一步就是一个用凭据完成认证的登录 agent文档 Tip 中给出的用法正是先跑登录 agent之后所有 agent 都跳过登录。第二步运行 workflow 并等待完成run await client.run_workflow( workflow_idworkflow.workflow_permanent_id, wait_for_completionTrue, ) print(run.run_id) # 文档示例wr_494674202383504144 print(run.status) # 文档示例completed如果不用 SDK 的wait_for_completionREST 方式需要轮询GET /v1/runs/{run_id}的status直到状态不再是created/queued/running。run 完成后Skyvern 会在后台异步归档浏览器状态这一点直接决定下一步为什么要加重试。第三步从完成的 run 创建 profile因为归档是异步的run 刚结束就创建 profile 可能失败错误信息里含 persisted表示还没归档完。文档给出的做法是短暂重试实践中归档通常在几秒内就绪for attempt in range(10): try: profile await client.create_browser_profile( namehn-browsing-state, workflow_run_idrun.run_id, descriptionHacker News cookies and browsing state, ) print(profile.browser_profile_id) # 文档示例bp_494674399951999772 break except Exception as e: if persisted in str(e).lower() and attempt 9: await asyncio.sleep(2) continue raise创建成功时返回的 profile 对象文档示例响应{ browser_profile_id: bp_494674399951999772, organization_id: o_475582633898688888, name: hn-browsing-state, description: Hacker News cookies and browsing state, created_at: 2026-02-12T01:09:18.048208, modified_at: 2026-02-12T01:09:18.048212, deleted_at: null }拿到browser_profile_idbp_前缀后可以立刻验证 profile 是否真的保存成功# 列出所有 profile profiles await client.list_browser_profiles() print(len(profiles)) # 文档示例1 # 按 ID 查询单个 profile fetched await client.get_browser_profile(profile_idprofile.browser_profile_id) print(fetched.name) # 文档示例hn-browsing-state对应 REST 调用是GET /v1/browser_profiles列表和GET /v1/browser_profiles/{profile_id}单个列表响应里能看到browser_profile_id、name、created_at。第四步在后续 run 中复用 profile跳过登录运行下一个 agent 时把browser_profile_id传给run_workflow。Skyvern 会在第一个 block 执行之前恢复保存的 cookies、localStorage 和 session files所以第二个 agent 起点就是上次运行结束时的浏览器状态result await client.run_workflow( workflow_iddata_workflow.workflow_permanent_id, browser_profile_idprofile.browser_profile_id, wait_for_completionTrue, ) print(result.status) # 文档示例completedREST 等价调用curl -s -X POST https://api.skyvern.com/v1/run/workflows \ -H x-api-key: $SKYVERN_API_KEY \ -H Content-Type: application/json \ -d { \workflow_id\: \$WORKFLOW2_ID\, \browser_profile_id\: \$PROFILE_ID\ }返回的run_request中能看到browser_profile_id被带上说明本次 run 会加载该 profile 的状态。到这里主路径完成登录只跑一次后续所有 run 直接以已认证状态开始。可选分支从 Browser Session 创建 profile除了 workflow run也可以从一个已关闭的 Browser Session 创建 profile但有一个重要的行为变化session默认不再自动保存profile。只有满足以下两个条件之一关闭后的 session 才能被create_browser_profile转换创建 session 时开启了generate_browser_profile: trueREST API或 Python SDK 通过request_options传additional_body_parameters{generate_browser_profile: True}SDK 原生支持正在逐步上线session 是从一个已保存的 profile 启动的带browser_profile_id的 session 结束时总会保存自己的 profile注意这不会更新原 profile。不满足条件时调用直接返回400而且重试不会有帮助——遇到 400 需要重建 session或更新 n8n 等集成里的 Skyvern node文档明确提示这一点。开启 flag 的方式curl -X POST https://api.skyvern.com/v1/browser_sessions \ -H x-api-key: $SKYVERN_API_KEY \ -H Content-Type: application/json \ -d { timeout: 60, generate_browser_profile: true }也可以在 session 存活期间用PATCH /v1/browser_sessions/{browser_session_id}打开该 flag值在 session 结束时读取所以只要 session 还开着就生效对已关闭的 session 更新会返回409。关闭 session 后归档同样是异步上传创建 profile 时保留文档里的短暂重试逻辑即可。保持登录状态有效定期刷新 profile文档明确指出 session token 和 cookies 会过期profile 需要定期刷新重新跑登录 agent从新的 completed run 创建带日期的 profile再删掉旧的。这是文档 Best practices 给出的模式from datetime import date # 每次登录成功后创建带日期的 profile profile await client.create_browser_profile( namefcrm-login-{date.today()}, workflow_run_idnew_login_run.run_id, ) # 删除旧 profile await client.delete_browser_profile(old_profile_id)两个配套建议同样来自文档命名带账号、站点和用途例如prod-salesforce-admin配 description Admin login for daily opportunity sync避免出现无法识别的profile1想捕获每次 run 中的状态变化比如 token 刷新复用的那个 agent 定义里也要保留persist_browser_sessiontrue这样每次 completed run 都能再生成一份新 profileresult await client.run_workflow( workflow_idworkflow.workflow_permanent_id, browser_profile_idbp_current, wait_for_completionTrue, ) # 从本次 run 创建更新后的 profile new_profile await client.create_browser_profile( namefdaily-sync-{date.today()}, workflow_run_idresult.run_id, )限制与排查browser_profile_id只对run_workflow生效传给run_task会被静默忽略不会报错也不会加载状态。同一次 run 请求里browser_profile_id和browser_session_id不能同时使用。创建 profile 报错含 persisted 字样归档还在后台进行等 1~2 秒重试文档示例循环 10 次报400说 session 未配置生成 profile这是永久性错误只能重建 session。profile 名字在组织内重复会创建失败name要求 unique带日期命名也顺便解决了刷新时的重名问题。空 profile 只包含 profile 骨架有默认浏览器 profile 目录配置时从其派生不含任何登录态要跳过登录必须走带workflow_run_id或browser_session_id的创建路径。如果还需要复用带固定出口 IP 的住宅代理身份文档提供了可选的proxy_location: RESIDENTIAL_ISP固定代理绑定和rotate_proxy_session_id: true轮换接口与登录状态复用相互独立按需查看 browser-profiles.mdx 的 Pin a proxy identity 一节。下一步profile 生命周期里还涉及查询、列表、删除等操作SDK 参考分别在 get_browser_profile、list_browser_profiles、delete_browser_profile、create_browser_profile需要实时交互的长驻浏览器状态则属于 Browser Sessions 的范畴见 browser-sessions.mdx。【免费下载链接】skyvernAutomate browser based workflows with AI项目地址: https://gitcode.com/GitHub_Trending/sk/skyvern创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考