首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Chromedp Golang刮刀不正确执行

Chromedp Golang刮刀不正确执行
EN

Stack Overflow用户
提问于 2022-11-17 21:26:35
回答 1查看 72关注 0票数 0

我已经创建了一个Go模块,它使用chromedp登录并从我的公司CRM系统下载一些报告。我把这个报告拉到我们的Ubuntu20.04服务器上,创建了一个bash文件,它进入模块的目录并调用命令: go run。

如果我将ssh放到服务器中,并按预期的方式对它执行的文件调用bash命令,那么这个命令将由CRON作业执行,并登录到选定目录中的一个文件中。它只是记录bash脚本的第一个输出,然后它似乎就被卡住了。

这里是cron作业调用的bash文件的一个例子:

代码语言:javascript
运行
复制
cd ~/projects/DNC_Bot/dnc-bot
go run .

下面是crontab中我的行的一个例子:

代码语言:javascript
运行
复制
30 7 * * 1-5 bash ~/projects/DNC_Bot/dnc-bot > ~/cronLogs/output.log 2>&1

我希望这与我进入服务器并调用bash {bashfile}并且它没有问题时一样运行,对此的指导是非常感谢的!

更新以显示代码示例:

代码语言:javascript
运行
复制
func downloadLists() {
    // Adding options to run in head mode
    opts := append(chromedp.DefaultExecAllocatorOptions[:],
        // Change headless flag to false to see browser when executing
        chromedp.Flag("headless", true),
        // chromedp.UserDataDir(""),
    )

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

    // also set up a custom logger
    taskCtx, cancel := chromedp.NewContext(allocCtx, chromedp.WithLogf(log.Printf))
    defer cancel()
    // Loop through Logics sites
    for entity, url := range logicSites {
        log.Printf("Entity: %s | Logging in to: %s\n", entity, url)
        // Log in and open up cases link list
        err := chromedp.Run(taskCtx,
            // Set Download Behavior/Directory
            page.SetDownloadBehavior(page.SetDownloadBehaviorBehaviorAllow).WithDownloadPath("./downloads/"),
            chromedp.Navigate(url),
            // wait for footer element is visible (ie, page is loaded)
            chromedp.WaitVisible(`#txtUsername2`, chromedp.ByID),
            // Login
            chromedp.SendKeys(`#txtUsername2`, BOT_USER, chromedp.ByID),
            chromedp.SendKeys(`#txtPassword2`, BOT_PASS, chromedp.ByID),
            chromedp.Click(`#btnLogin2`, chromedp.ByID),
            // Wait for Homepage to be viewable
            chromedp.WaitVisible(`#page-nav`, chromedp.ByID),
            // Click on Cases link
            chromedp.Click(`#page-tree > ul > li:nth-child(4)`, chromedp.ByQuery),
            chromedp.Sleep(1*time.Second),
            // Call func to download filtered views
            downloadFilters(),
        )
        if err != nil {
            log.Fatal(err)
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-11-19 07:04:05

首先,如果没有特殊的原因,你应该先构建你的围棋应用程序,然后直接运行这个应用。优点是你的应用程序可以在没有安装的服务器上运行。

我刚刚以cron作业的形式运行了下面的演示程序,它可以工作。您可以先尝试此演示,以检查是否有任何问题。

备注:检查系统日志(大多数情况下,检查是否记录了任何错误消息,并确保cron作业已经运行)。

文件:

代码语言:javascript
运行
复制
├── bot.bash
├── go.mod
└── main.go

bot.bash

代码语言:javascript
运行
复制
cd ~/temp/q74482280
go run .

go.mod

代码语言:javascript
运行
复制
module m

go 1.19

require github.com/chromedp/chromedp v0.8.6

require (
    github.com/chromedp/cdproto v0.0.0-20220924210414-0e3390be1777 // indirect
    github.com/chromedp/sysutil v1.0.0 // indirect
    github.com/gobwas/httphead v0.1.0 // indirect
    github.com/gobwas/pool v0.2.1 // indirect
    github.com/gobwas/ws v1.1.0 // indirect
    github.com/josharian/intern v1.0.0 // indirect
    github.com/mailru/easyjson v0.7.7 // indirect
    golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec // indirect
)

main.go

代码语言:javascript
运行
复制
package main

import (
    "context"
    "log"

    "github.com/chromedp/chromedp"
)

func main() {
    log.Println("hello chromedp")
    ctx, cancel := chromedp.NewContext(context.Background(), chromedp.WithDebugf(log.Printf))
    defer cancel()

    if err := chromedp.Run(ctx, chromedp.Navigate("https://httpbin.org/status/200")); err != nil {
        log.Fatal(err)
    }
    log.Println("goodbye chromedp")
}

cron工作:

代码语言:javascript
运行
复制
40 * * * * bash ~/temp/q74482280/bot.bash > ~/temp/q74482280/log.txt 2>&1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74482280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档