Golang实现自动点击网站登录按钮的方法

Golang实现自动点击网站登录按钮的方法 大家好, 我一直在尝试从一个网站获取数据(我确实拥有密码等信息,并且可以使用PowerShell实现),该网站需要输入密码、电子邮件ID、csrf cookie和会话cookie,同时还需要点击一个按钮。我已经尝试了一些方法,从使用cookie到使用url.Value,但都无法使其正常工作。请问有什么想法可以解决这个问题吗?

4 回复

输入密码、邮箱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: 我还没有在网上找到关于按钮点击的示例。

按钮被集成在表单元素中。

w3schools.com

HTML Forms

W3Schools Logo

W3Schools 提供涵盖所有主要网络语言的免费在线教程、参考和练习。涵盖 HTML、CSS、JavaScript、Python、SQL、Java 等众多热门主题。

在Go中实现自动登录并点击按钮,通常需要模拟完整的浏览器行为。以下是使用collynet/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)
}

关键点:

  1. 使用cookiejar管理会话cookies
  2. 正确处理CSRF令牌的获取和提交
  3. 对于简单HTML表单使用net/httpcolly
  4. 对于JavaScript密集型网站使用chromedp
回到顶部