使用Golang从弹窗自动填充网站表单的实现方法

使用Golang从弹窗自动填充网站表单的实现方法 需要一些指导。我是Go语言的新手,但不是编程语言的新手。

在工作中,我有一个需要填写数据并提交的网页表单。 我想创建一个Windows弹出窗口来填写并“提交”数据。

设置大致如下:

  • 登录工作网站并打开表单,准备输入数据
  • 打开Go应用程序,它将激活一个Windows弹出窗口。这允许我填写必填字段。完成后,我将点击窗口上的“提交”按钮。
  • Go应用程序随后将自动将数据填入网页表单

有人能给我提供一些方向或者可以查看的二进制文件吗?

非常感谢!!

2 回复

changelog:

Go应用程序将自动将数据填入网络表单

是从旧表单填入新表单?还是将其保存在数据库中?

更多关于使用Golang从弹窗自动填充网站表单的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


要实现这个需求,可以使用Go的GUI库创建弹窗,并结合浏览器自动化工具来填充网页表单。以下是完整的实现方案:

1. 安装必要的依赖

go get github.com/lxn/walk
go get github.com/lxn/win
go get github.com/chromedp/chromedp

2. 完整的Go应用程序代码

package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "github.com/chromedp/chromedp"
    "github.com/lxn/walk"
    . "github.com/lxn/walk/declarative"
)

// 存储表单数据的结构体
type FormData struct {
    Field1 string
    Field2 string
    Field3 string
}

var formData FormData

func main() {
    // 创建GUI弹窗
    createPopupWindow()
}

func createPopupWindow() {
    var mw *walk.MainWindow
    var field1Edit, field2Edit, field3Edit *walk.LineEdit
    var submitBtn *walk.PushButton

    // 创建主窗口
    if err := (MainWindow{
        AssignTo: &mw,
        Title:    "表单数据输入",
        MinSize:  Size{Width: 400, Height: 300},
        Layout:   VBox{},
        Children: []Widget{
            GroupBox{
                Title:  "输入表单数据",
                Layout: Grid{Columns: 2},
                Children: []Widget{
                    Label{Text: "字段1:"},
                    LineEdit{
                        AssignTo: &field1Edit,
                    },
                    Label{Text: "字段2:"},
                    LineEdit{
                        AssignTo: &field2Edit,
                    },
                    Label{Text: "字段3:"},
                    LineEdit{
                        AssignTo: &field3Edit,
                    },
                },
            },
            PushButton{
                AssignTo: &submitBtn,
                Text:     "提交到网页",
                OnClicked: func() {
                    // 收集表单数据
                    formData.Field1 = field1Edit.Text()
                    formData.Field2 = field2Edit.Text()
                    formData.Field3 = field3Edit.Text()

                    // 关闭弹窗
                    mw.Close()

                    // 填充网页表单
                    go fillWebForm(formData)
                },
            },
        },
    }).Create(); err != nil {
        log.Fatal(err)
    }

    // 运行窗口
    mw.Run()
}

func fillWebForm(data FormData) {
    // 创建ChromeDP上下文
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()

    // 设置超时
    ctx, cancel = context.WithTimeout(ctx, 30*time.Second)
    defer cancel()

    // 执行浏览器自动化任务
    err := chromedp.Run(ctx,
        // 导航到目标页面(假设已登录)
        chromedp.Navigate("https://your-work-website.com/form"),

        // 等待表单加载
        chromedp.WaitVisible(`#form-container`, chromedp.ByID),

        // 填充表单字段
        chromedp.SendKeys(`#field1`, data.Field1, chromedp.ByID),
        chromedp.SendKeys(`#field2`, data.Field2, chromedp.ByID),
        chromedp.SendKeys(`#field3`, data.Field3, chromedp.ByID),

        // 提交表单
        chromedp.Click(`#submit-button`, chromedp.ByID),

        // 等待提交完成
        chromedp.Sleep(2*time.Second),
    )

    if err != nil {
        log.Printf("填充表单失败: %v", err)
    } else {
        fmt.Println("表单已成功提交!")
    }
}

3. 针对实际网站的调整版本

package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "github.com/chromedp/chromedp"
    "github.com/lxn/walk"
    . "github.com/lxn/walk/declarative"
)

type WebFormData struct {
    Username  string
    Email     string
    Phone     string
    Comments  string
}

func main() {
    var data WebFormData
    var mw *walk.MainWindow

    // 创建输入窗口
    MainWindow{
        AssignTo: &mw,
        Title:    "网页表单填充器",
        Size:     Size{Width: 450, Height: 350},
        Layout:   VBox{MarginsZero: true},
        Children: []Widget{
            GroupBox{
                Title:  "输入详细信息",
                Layout: Grid{Columns: 2, MarginsZero: true},
                Children: []Widget{
                    Label{Text: "用户名:"},
                    LineEdit{
                        AssignTo: &data.Username,
                    },
                    Label{Text: "邮箱:"},
                    LineEdit{
                        AssignTo: &data.Email,
                    },
                    Label{Text: "电话:"},
                    LineEdit{
                        AssignTo: &data.Phone,
                    },
                    Label{Text: "备注:"},
                    TextEdit{
                        AssignTo: &data.Comments,
                        MinSize:  Size{Height: 100},
                    },
                },
            },
            PushButton{
                Text: "填充网页表单",
                OnClicked: func() {
                    mw.Close()
                    fillFormAutomation(data)
                },
            },
        },
    }.Run()
}

func fillFormAutomation(data WebFormData) {
    opts := append(chromedp.DefaultExecAllocatorOptions[:],
        chromedp.Flag("headless", false), // 显示浏览器窗口
    )

    allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
    defer cancel()

    ctx, cancel := chromedp.NewContext(allocCtx)
    defer cancel()

    // 执行自动化任务
    tasks := chromedp.Tasks{
        chromedp.Navigate("https://example.com/form-page"),
        
        // 根据实际网页结构调整选择器
        chromedp.WaitVisible(`input[name="username"]`, chromedp.ByQuery),
        chromedp.SendKeys(`input[name="username"]`, data.Username, chromedp.ByQuery),
        
        chromedp.SendKeys(`input[name="email"]`, data.Email, chromedp.ByQuery),
        chromedp.SendKeys(`input[name="phone"]`, data.Phone, chromedp.ByQuery),
        chromedp.SendKeys(`textarea[name="comments"]`, data.Comments, chromedp.ByQuery),
        
        chromedp.Click(`button[type="submit"]`, chromedp.ByQuery),
        chromedp.Sleep(3 * time.Second),
    }

    if err := chromedp.Run(ctx, tasks); err != nil {
        log.Fatal(err)
    }

    fmt.Println("自动化任务完成")
}

4. 编译为Windows可执行文件

# 编译为Windows可执行文件
go build -o form-filler.exe main.go

# 或者编译为不带控制台窗口的GUI程序
go build -ldflags="-H windowsgui" -o form-filler.exe main.go

关键点说明:

  1. GUI弹窗:使用walk库创建Windows原生弹窗
  2. 浏览器自动化:使用chromedp控制Chrome浏览器
  3. 选择器调整:需要根据实际网页的HTML结构调整CSS选择器
  4. 错误处理:添加适当的错误处理和日志记录
  5. 会话保持:确保浏览器已登录状态,或添加登录逻辑

这个方案提供了完整的从Windows弹窗收集数据到自动填充网页表单的工作流程。

回到顶部