要实现这个需求,可以使用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
关键点说明:
- GUI弹窗:使用
walk库创建Windows原生弹窗
- 浏览器自动化:使用
chromedp控制Chrome浏览器
- 选择器调整:需要根据实际网页的HTML结构调整CSS选择器
- 错误处理:添加适当的错误处理和日志记录
- 会话保持:确保浏览器已登录状态,或添加登录逻辑
这个方案提供了完整的从Windows弹窗收集数据到自动填充网页表单的工作流程。