You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Chromedp中发送POST请求并模拟表单/无表单场景提交?

无Form场景下Chromedp发起带上下文凭证POST请求的实现方案

该需求完全可实现,不需要依赖页面存在form元素,常用两种实现方式如下:

方案一:通过Evaluate执行JS发起请求(推荐)

利用chromedp.Evaluate()在当前页面上下文执行JS代码调用原生fetch/XMLHttpRequest接口,请求会自动继承当前浏览上下文的Cookie、请求头、身份凭证,完全符合AJAX请求的特性。

示例代码

package main

import (
	"context"
	"log"
	"github.com/chromedp/chromedp"
)

func main() {
	// 初始化浏览器上下文
	ctx, cancel := chromedp.NewContext(context.Background())
	defer cancel()

	var respResult map[string]interface{}
	err := chromedp.Run(ctx,
		// 先导航到目标站点,获取对应会话凭证
		chromedp.Navigate("https://your-target-domain.com"),
		// 执行异步fetch发起POST请求
		chromedp.Evaluate(`
			(async () => {
				const resp = await fetch('/your-api-path', {
					method: 'POST',
					headers: {
						'Content-Type': 'application/json',
						'X-Requested-With': 'XMLHttpRequest'
					},
					credentials: 'include', // 核心配置:携带当前上下文Cookie,同域请求可省略
					body: JSON.stringify({
						username: "test",
						password: "123456"
					})
				})
				return resp.ok ? await resp.json() : {code: resp.status, msg: "请求失败"}
			})()
		`, &respResult),
	)
	if err != nil {
		log.Fatalf("请求执行失败:%v", err)
	}
	log.Printf("接口返回结果:%+v", respResult)
}

方案优势

  • 无需手动处理Cookie、请求头拼接,完全复用浏览器上下文的身份状态
  • 不会触发站点的反爬指纹校验,请求行为和页面原生AJAX完全一致
  • 代码实现简单,适配所有需要动态凭证、签名的接口场景

方案二:提取上下文凭证后用net/http原生发起请求

如果需要完全使用Golang原生代码发起请求,可先从Chromedp上下文提取当前页面的Cookie、UA等参数,再用标准库net/http构造POST请求。

示例代码

package main

import (
	"context"
	"net/http"
	"net/http/cookiejar"
	"log"
	"github.com/chromedp/cdproto/network"
	"github.com/chromedp/chromedp"
)

func main() {
	ctx, cancel := chromedp.NewContext(context.Background())
	defer cancel()

	// 导航到目标站点初始化会话
	err := chromedp.Run(ctx, chromedp.Navigate("https://your-target-domain.com"))
	if err != nil {
		log.Fatalf("页面导航失败:%v", err)
	}

	// 提取当前浏览器上下文的所有Cookie
	cookies, err := network.GetAllCookies().Do(ctx)
	if err != nil {
		log.Fatalf("Cookie提取失败:%v", err)
	}

	// 构造net/http客户端
	jar, _ := cookiejar.New(nil)
	client := &http.Client{Jar: jar}

	// 构造POST请求
	req, err := http.NewRequest("POST", "https://your-target-domain.com/your-api-path", nil)
	if err != nil {
		log.Fatalf("请求构造失败:%v", err)
	}

	// 填充从Chromedp获取的Cookie
	for _, c := range cookies {
		req.AddCookie(&http.Cookie{Name: c.Name, Value: c.Value})
	}

	// 填充请求头,和浏览器上下文保持一致
	req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

	// 发起请求
	resp, err := client.Do(req)
	if err != nil {
		log.Fatalf("请求发起失败:%v", err)
	}
	defer resp.Body.Close()

	log.Printf("响应状态码:%d", resp.StatusCode)
}

注意事项

如果目标站点有动态请求签名、动态请求头校验,该方案需要额外处理对应校验参数,这种场景优先选择方案一。

内容的提问来源于stack exchange,提问作者Jayden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:45:02