golang

golang爬虫登录(四-进阶版)以及利用fiddler抓包

故事扮演 提交于 2020-02-08 15:46:10
前几篇文章摸索了如何用golang模拟登录;对简单的情况,甚至可以用GET方式代替POST方式登录。 但现在想抓取公司泛微OA系统的网页,就遇到一些困难。 难点: 1、登录页POST提交后,会有http 302跳转。后来发现不是问题,因为用http.Client.Do会自动处理跳转。 2、网站使用了FrameSet,还有大量jquery动态生成加载内容,这个处理起来比较困难,链接也是JS生成,只能针对具体问题具体分析。 3、用chrome控制台抓到的header提交不成功,于是想到fiddler抓包,正好电脑上曾经下载过一个汉化版。 过程(主要是解决了POST登录问题): 1、参考 https://blog.csdn.net/qq_24373725/article/details/80584810 用fiddler抓包(我下载的汉化版本一启动就自动抓所有包,感觉很方便,就是不知道有无后门),在过滤器中设置服务器网址:192.168.132.80;在 规则-自动断点处-勾选 在请求之前。 2、在IE中从登录页输入用户名、密码后提交登录。就会在fiddler中抓到表单对应的提交网址:/login/VerifyLogin.jsp,接着在断点处中断了。点击相应的: 运行到结束,或:中断响应(对于rameset中的一些页面可以中断响应,框架网页的一部分会显示空白),经过几次鼠标点击操作

golang---如何阻塞一个goroutine

有些话、适合烂在心里 提交于 2020-02-07 17:26:46
如何阻塞一个goroutine 下面的方法都可以永远阻塞当前的goroutine 方法1:从一个不发送数据channel中接收数据 <-make(chan struct{})  // or <-make(<-chan struct{}) 方法2:向不接收数据的channel中发送数据 make(chan struct{}) <- struct{}{} // or make(chan<- struct{}) <- struct{}{} 方法3:从空的channel中接收数据 <-chan struct{}(nil) 方法4:向空channel中发送数据 chan struct{}(nil) <- struct{}{} 方法5:使用select select{} 来源: https://www.cnblogs.com/double12gzh/p/12273464.html

golang []byte转string

点点圈 提交于 2020-02-07 10:11:21
golang []byte转string golang中,字符切片[]byte转换成string最简单的方式是 package main import ( "fmt" _ "unsafe" ) func main() { bytes := []byte("I am byte array !") str := string(bytes) bytes[0] = 'i'//注意这一行,bytes在这里修改了数据,但是str打印出来的依然没变化, fmt.Println(str) }   打印信息:I am byte array !   上面的代码bytes在这里修改了数据,但是str打印出来的依然没变化,是因为[]byte的内存被拷贝了。接着看下面的代码 package main import ( "fmt" "unsafe" ) func main() { bytes := []byte("I am byte array !") str := (*string)(unsafe.Pointer(&bytes)) bytes[0] = 'i' fmt.Println(*str) }   打印信息:i am byte array !    现在打印出来的信息已经是改变过的了,现在可以看出来str和bytes共用一片内存。   这样做的意义在于,在网络通信中,大多数的接受方式都是[]byte

gRPC+protobuf学习

自作多情 提交于 2020-02-07 04:11:26
gRPC学习网站 https://grpc.io/docs/guides/ Golang protobuff 先安装protoc大环境: https://github.com/protocolbuffers/protobuf/releases 再安装针对于go的小环境 https://github.com/golang/protobuf echo学习 https://echo.labstack.com/guide/installation protobuf https://developers.google.com/protocol-buffers/docs/reference/overview 来源: CSDN 作者: 项目技术总监 链接: https://blog.csdn.net/LiuHandsomes/article/details/104200962

Golang 接口简介 1

蓝咒 提交于 2020-02-07 00:57:39
这篇教程是我们关于接口的两篇教程中的第一篇。 什么是接口? 在面向对象的世界中,接口的一般定义是“接口定义了一个对象的行为”。它仅指出这个对象应该做什么,而实现这个行为的方法(实现细节)则取决于具体的对象。 在Go语言中,接口是一组方法签名。当一个类型实现了接口中所有的方法时,我们就说这个类型实现了这个接口。这和面向对象世界中的概念是非常相似的。接口指定类型应该具有什么方法,类型决定如何实现这些方法。 例如:WashingMachine 是一个具有Cleaning()和Drying()方法签名的接口。任何实现了Cleaning()和Drying()方法的类型,都可以被认为实现了WashingMachine接口。 声明和实现一个接口 接下来,让我们直接用一个创建并实现了接口的程序来体验一下。 package main import ( "fmt" ) //interface definition type VowelsFinder interface { FindVowels ( ) [ ] rune } type MyString string //MyString implements VowelsFinder func ( ms MyString ) FindVowels ( ) [ ] rune { var vowels [ ] rune for _ , rune :=

Chapter017 golang反射

寵の児 提交于 2020-02-06 07:27:19
上一章: Chapter016 goroutine协程 和 channel管道 官方文档: https://studygolang.com/pkgdoc 本章纲要 一、反射的使用场景 二、基本介绍 三、反射的相关函数 四、反射快速入门 五、反射的注意事项 六、反射的应用 一、反射的使用场景 1、结构体标签 2、函数的适配器 3、甚至可以自己开发go框架 … 二、基本介绍 1、反射可以在运行时动态获取变量的各种信息,比如变量的类型(type)、类别(kind) 2、如果是结构体变量,还可以获取结构体本身的信息(包括结构体的字段、方法) 3、通过反射,可以修改变量的值,可以调用关联方法 4、使用反射,需要import reflect 5、示意图 三、反射的相关函数 1、reflect.TypeOf,获取变量的类型,返回reflect.Type类型 2、reflect.ValueOf,获取变量的类型,返回reflect.ValueOf类型 3、变量、interface{}和reflect.Value是可以相互转换的 (1)将 interface{} 转换成 reflect.Value rval := reflect . ValueOf ( b ) (2)将 reflect.Value 转换成 interface{} iVal := rVal . Interface ( ) (3)将

Golang go-gin路由

谁都会走 提交于 2020-02-05 12:27:25
代码实现 main.go package main import ( "fmt" "github.com/jihite/go-gin-example/pkg/setting" "github.com/jihite/go-gin-example/routers" "net/http" ) func main() { router := routers.InitRouter() s := &http.Server{ Addr: fmt.Sprintf(":%d", setting.HTTPPort), Handler: router, ReadTimeout: setting.ReadTimeout, WriteTimeout: setting.WriteTimeout, MaxHeaderBytes: 1 << 20, } s.ListenAndServe() } http:Server: Addr:监听的TCP地址,格式为 :8000 Handler:http句柄,实质为 ServeHTTP ,用于处理程序响应HTTP请求 ReadTimeout:允许读取的最大时间 WriteTimeout:允许写入的最大时间 MaxHeaderBytes:请求头的最大字节数 实现InitRouter() func InitRouter() *gin.Engine { r := gin.New()

golang beego框架对运行异常的处理

六眼飞鱼酱① 提交于 2020-02-05 07:53:36
运行时异常 panic 在通常情况下,函数向其调用方报告错误的方式都是返回一个 error 类型的值。但是当遇到致命错误的时候,很可能会使程序无法继续运行。Go推荐通过调用 panic 函数来报告致命错误,它会停止当前控制流程,并引发一个运行时恐慌。例如: package main import "errors" func main() { outerFunc() } func outerFunc() { innerFunc() } func innerFunc() { panic(errors.New("an intended fatal error")) } 程序执行后的结果为: D:\gotest>go run main.go panic: an intended fatal error goroutine 1 [running]: main.innerFunc(...) D:/gotest/main.go:14 main.outerFunc(...) D:/gotest/main.go:10 main.main() D:/gotest/main.go:6 +0x77 exit status 2 当调用 innerFunc 函数中的 panic 函数后, innerFunc 的执行会被停止。紧接着,流程控制权会交给调用方 outerFunc 函数。然后, outerFunc

344. 反转字符串 golang

落花浮王杯 提交于 2020-02-05 01:57:41
Me 双指针操作。首指针和尾指针 func reverseString ( s [ ] byte ) { left , right : = 0 , len ( s ) - 1 for left < right && len ( s ) != 0 { s [ left ] , s [ right ] = s [ right ] , s [ left ] left ++ right -- } } 来源: CSDN 作者: 寇浩哲 链接: https://blog.csdn.net/csdn_kou/article/details/104173130

leetcode的golang实现【0005】最长回文子串

情到浓时终转凉″ 提交于 2020-02-05 01:31:27
题目 给定一个字符串 s ,找到 s 中最长的回文子串。你可以假定 s 的最大长度为1000. 示例1: 输入: babad 输出:bab 注意:aba也是有效答案 示例2: 输入:cbbd 输出:bb 题解 1、暴力法 func longestPalindrome ( s string ) string { var maxLen int var maxStr string for i := 0 ; i < len ( s ) ; i ++ { for j := i + 1 ; j < len ( s ) + 1 ; j ++ { len := isPalindrome ( s [ i : j ] ) if len > maxLen { maxStr = s [ i : j ] maxLen = len } } } return maxStr } func isPalindrome ( s string ) int { var newStr string for i := len ( s ) - 1 ; i >= 0 ; i -- { newStr += s [ i : i + 1 ] } if s == newStr { return len ( s ) } return 0 } 很显然,超时了。 时间复杂度:O(n 3 ) 空间复杂度:O(1) 2、动态规划 如果子串 P