Golang实现自动点击网站登录按钮的方法
Golang实现自动点击网站登录按钮的方法 大家好, 我一直在尝试从一个网站获取数据(我确实拥有密码等信息,并且可以使用PowerShell实现),该网站需要输入密码、电子邮件ID、csrf cookie和会话cookie,同时还需要点击一个按钮。我已经尝试了一些方法,从使用cookie到使用url.Value,但都无法使其正常工作。请问有什么想法可以解决这个问题吗?
输入密码、邮箱ID、CSRF Cookie和会话Cookie,并点击按钮
一种方法是创建一个HTML <form>,并将这些值POST到Go中的一个端点。从表单中读取输入元素,并将它们传递给Go变量。
你尝试过什么?
更多关于Golang实现自动点击网站登录按钮的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我几乎尝试了所有方法,但可能是我做错了什么。我尝试使用 http.Get 来获取 cookie 访问权限,这工作正常。然后接着使用了 NewRequest,在这里我尝试了 Get 和 Post 方法,Post 是更符合逻辑的选择。简单的测试是检查 Get 和 NewRequest 是否返回相同的 csrf cookie,它们本应如此。我目前还没有在网上找到关于点击按钮的示例。
Jmac: 我还没有在网上找到关于按钮点击的示例。
按钮被集成在表单元素中。
HTML Forms

W3Schools 提供涵盖所有主要网络语言的免费在线教程、参考和练习。涵盖 HTML、CSS、JavaScript、Python、SQL、Java 等众多热门主题。
在Go中实现自动登录并点击按钮,通常需要模拟完整的浏览器行为。以下是使用colly和net/http包实现的示例:
package main
import (
"fmt"
"log"
"net/http"
"net/http/cookiejar"
"net/url"
"strings"
"github.com/gocolly/colly"
)
func main() {
// 创建cookie容器
jar, _ := cookiejar.New(nil)
// 创建HTTP客户端
client := &http.Client{
Jar: jar,
}
// 第一步:获取初始页面和CSRF令牌
req, _ := http.NewRequest("GET", "https://example.com/login", nil)
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// 这里需要根据实际网站解析CSRF令牌
// 假设从响应中提取csrf_token
csrfToken := extractCSRFToken(resp)
// 第二步:提交登录表单
loginData := url.Values{
"email": {"your-email@example.com"},
"password": {"your-password"},
"csrf_token": {csrfToken},
}
req, _ = http.NewRequest("POST", "https://example.com/login",
strings.NewReader(loginData.Encode()))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err = client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// 第三步:使用colly访问需要点击按钮的页面
c := colly.NewCollector()
// 设置相同的cookies
c.SetClient(client)
// 查找并点击按钮
c.OnHTML("button[type='submit']", func(e *colly.HTMLElement) {
// 模拟点击按钮
e.Request.Visit(e.Attr("onclick"))
})
// 访问目标页面
c.Visit("https://example.com/dashboard")
}
// 提取CSRF令牌的函数(需要根据实际HTML结构调整)
func extractCSRFToken(resp *http.Response) string {
// 这里使用colly解析HTML获取CSRF令牌
c := colly.NewCollector()
var csrfToken string
c.OnHTML("input[name='csrf_token']", func(e *colly.HTMLElement) {
csrfToken = e.Attr("value")
})
c.ParseHTML(resp.Body)
return csrfToken
}
如果需要处理JavaScript渲染的按钮,可以使用chromedp:
package main
import (
"context"
"log"
"time"
"github.com/chromedp/chromedp"
)
func main() {
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
var res string
err := chromedp.Run(ctx,
chromedp.Navigate("https://example.com/login"),
chromedp.WaitVisible(`input[name="email"]`, chromedp.ByQuery),
chromedp.SendKeys(`input[name="email"]`, "your-email@example.com", chromedp.ByQuery),
chromedp.SendKeys(`input[name="password"]`, "your-password", chromedp.ByQuery),
chromedp.Click(`button[type="submit"]`, chromedp.ByQuery),
chromedp.WaitVisible(`#target-button`, chromedp.ByQuery),
chromedp.Click(`#target-button`, chromedp.ByQuery),
chromedp.Sleep(2*time.Second),
chromedp.Text(`#result-element`, &res, chromedp.ByQuery),
)
if err != nil {
log.Fatal(err)
}
log.Printf("结果: %s", res)
}
关键点:
- 使用
cookiejar管理会话cookies - 正确处理CSRF令牌的获取和提交
- 对于简单HTML表单使用
net/http或colly - 对于JavaScript密集型网站使用
chromedp

