【毕设扫描器】【动态爬虫】CrawlerGo源码分析1:cli库的使用

文章目录

    • 配置运行参数
    • main函数1:cli结构
        • 介绍和简单使用
    • 结合源码分析
        • cli 库的定义:75-258行(大体完成阅读)

配置运行参数

入口文件:根据项目提供的编译命令找到入口文件 crawlergo_cmd.go

入口函数:找到65行的 func main()函数,在主函数的代码中下断点。

配置:添加程序实参

(chrome程序路径必须加引号,否则会报错:navigate timeout http://127.0.0.1/upload-labs-master/)

(取消了参数-o json,这样就不会在命令行/控制台、打印比较混乱的Json结果数据)

-c "C:\Program Files\Google\Chrome\Application\chrome.exe" --output-json debug.json http://127.0.0.1/upload-labs-master/

验证配置是否正确:运行程序,发现程序退出。经过验证,在配置中为Chrome路径添加引号,成功执行程序。

生成编译程序 go_build_crawlergo_cmd_go.exe、以及爬虫结果文件 debug.json

main函数1:cli结构

介绍和简单使用

参考:Go 每日一库之 cli

介绍:cli是一个用于构建命令行程序的库,所有的初始化操作就是创建一个cli.App结构的对象。通过为对象的字段赋值来添加相应的功能。

示例:理论上创建一个 cli.App 结构的对象,然后调用其 Run() 方法,传入命令行的参数即可。空白的cli程序如下:

func main(){
	(&cli.App{}).Run(os.Args)
}

说明文档:https://github.com/urfave/cli/。官方一个完整示例,分析过程见代码注释部分。

func main(){
	// 定义 cli.App{} 作为应用
	app := &cli.App{
		Name: "",				// 工具名称,会显示在帮助中
		Usage: "",			// 工具参数,会显示在帮助中
		// 接收命令行参数,开始执行定义的动作
		Action: func(c *cli.Context) error {},	
	}
	
	// 调用 cli.App{}.Run() 执行动作,动作接收命令行参数作为形参
	// 动作执行结果赋值给err变量,用于判断执行是否出错
	err := app.Run(os.Args)
	
	// 如果出错则打印错误信息
	if err != nil {
		log.Fatal(err)
	}
}
cli库小结 应用 说明
内置字典对象1 cli.App{} cli库的信息对象 定义横幅、主要执行方法
内置键.Run(os.Args) 接收命令行参数,执行Action键值中的方法
自定义键 help打印信息
内置键字典 Flags Flags字段是[]cli.Flag类型,用于添加选项
选项 cli为常见类型都实现了对应的XxxFlag 共用字段有:Name/Value/Usage
选项 选项是通过c.Type(name)来获取的 例如 if c.String(“lang”) == “english”
存入变量 将选项存到某个预先定义好的变量中 只需要设置Destination字段为变量的地址
选项的必要性声明 Required: true,
- - -
内置对象2 cli.Context() 可以获取传给命令行的参数信息 -
- NArg()返回参数个数 -
- Args()返回cli.Args对象 调用其Get(i)获取位置i上的参数

结合源码分析

cli 库的定义:75-258行(大体完成阅读)

func main() {

// cli 代码的漏网之鱼:72-74行

// 定义 cli.App{}:75-252行
	app := &cli.App{
		声明帮助文本
		声明选项1 Chrome.exe 路径 {
			Aliases:     []string{"c"},				// 命令行输入参数的别名,例如-c chromePath
			Destination: &taskConfig.ChromiumPath	// 可以事先存入变量
		声明选项2 User-Agent 字段
		声明选项3 Post 数据 {
			Aliases:     []string{"d"},				// 输入参数的别名, -d a=1&b=2
			Destination: &taskConfig.MaxCrawlCount,	// 也可以事先存入
		声明选项4 过滤器模式 {
			Aliases:     []string{"f"},
			Usage:       "filtering `Mode` used for collected requests. Allowed mode:\"simple\", \"smart\" or \"strict\".",
		声明选项5 输出数据位置
		声明选项6 输出文件格式
		声明选项7 以隐匿形式启动浏览器
		声明选项8 最大线程
			Name:        "max-tab-count",
			Aliases:     []string{"t"},
			Value:       8,
			Usage:       "maximum `Number` of tabs allowed.",
		声明选项9 使用一般路径对目标进行Fuzz测试
		声明选项10 路径Fuzz字典
			Name:        "fuzz-path-dict",
			Usage:       "`Path` of fuzz dict. Such as \"/home/test/fuzz_path.txt\"",
		声明选项11 是否从 robots.txt 寻找路径
		声明选项12 请求代理
		声明选项13 是否对url进行编码
		声明选项14 单线程的超时时间
		……
		Action: run
	
		err := app.Run(os.Args)
		if err != nil {
			logger.Logger.Fatal(err)
		}
	}
}

你可能感兴趣的:(漏洞扫描器,java,tomcat,safari)