1.参考网上Python的例子自己写了一个go语言的。这个仅供学习技术参考,为了方便有部分参数直接phantomjs执行js获取,代码基本都有注释,测试打印没有删除,还请见谅!

2.本文参考http://blog.csdn.net/qiye_/article/details/52884491

话不多说,直接上码

package main

import (
"errors"
"fmt"
"math/big"
"crypto/rsa"
"bytes"
"net/http"
"io/ioutil"
"time"
"net/http/cookiejar"
"net/url"
"github.com/urturn/go-phantomjs" // exported package is phantomjs
"regexp"
"strconv"
"strings"
"encoding/base64"
"crypto/rand"
"encoding/pem"
"crypto/x509"
"os"
)
//全局变量
var CurCookies []*http.Cookie
var CurCookieJar *cookiejar.Jar //管理cookie //初始化
func init() {
CurCookies = nil
//var err error;
CurCookieJar,_ = cookiejar.New(nil)
} //get url response html
func getUrlRespHtml(strUrl string, postDict map[string]string) string{
fmt.Printf("in getUrlRespHtml, strUrl=%s\n", strUrl)
fmt.Printf("postDict=%s\n", postDict) var respHtml string = "" httpClient := &http.Client{
Jar:CurCookieJar,
} var httpReq *http.Request
if nil == postDict {
fmt.Printf("is GET\n")
httpReq, _ = http.NewRequest("GET", strUrl, nil) } else {
fmt.Printf("is POST\n")
postValues := url.Values{}
for postKey, PostValue := range postDict{
postValues.Set(postKey, PostValue)
}
fmt.Printf("postValues=%s\n", postValues)
postDataStr := postValues.Encode()
fmt.Printf("postDataStr=%s\n", postDataStr)
postDataBytes := []byte(postDataStr)
fmt.Printf("postDataBytes=%s\n", postDataBytes)
postBytesReader := bytes.NewReader(postDataBytes)
httpReq, _ = http.NewRequest("POST", strUrl, postBytesReader)
httpReq.Header.Add("Content-Type", "application/x-www-form-urlencoded")
} httpResp, err := httpClient.Do(httpReq)
if err != nil {
fmt.Printf("http get strUrl=%s response error=%s\n", strUrl, err.Error())
}
fmt.Printf("httpResp.Header=%s\n", httpResp.Header)
fmt.Printf("httpResp.Status=%s\n", httpResp.Status) defer httpResp.Body.Close() body, errReadAll := ioutil.ReadAll(httpResp.Body)
if errReadAll != nil {
fmt.Printf("get response for strUrl=%s got error=%s\n", strUrl, errReadAll.Error())
}
CurCookies = CurCookieJar.Cookies(httpReq.URL)
respHtml = string(body)
return respHtml
} //get url response code
func getImg(strUrl string, postDict map[string]string){ httpClient := &http.Client{
Jar:CurCookieJar,
} var httpReq *http.Request
if nil == postDict {
httpReq, _ = http.NewRequest("GET", strUrl, nil) } else {
postValues := url.Values{}
for postKey, PostValue := range postDict{
postValues.Set(postKey, PostValue)
}
postDataStr := postValues.Encode()
postDataBytes := []byte(postDataStr)
postBytesReader := bytes.NewReader(postDataBytes)
httpReq, _ = http.NewRequest("POST", strUrl, postBytesReader)
httpReq.Header.Add("Content-Type", "application/x-www-form-urlencoded")
} httpResp, err := httpClient.Do(httpReq)
if err != nil {
fmt.Printf("http get strUrl=%s response error=%s\n", strUrl, err.Error())
} defer httpResp.Body.Close() body, errReadAll := ioutil.ReadAll(httpResp.Body)
if errReadAll != nil {
fmt.Printf("get response for strUrl=%s got error=%s\n", strUrl, errReadAll.Error())
}
CurCookies = CurCookieJar.Cookies(httpReq.URL);
code, error := os.Create("D:/baiducode.png")
if error != nil {
fmt.Println(error)
}
code.Write([]byte(body))
code.Close()
} //打印cookie
func printCurCookies() {
var cookieNum int = len(CurCookies);
fmt.Printf("cookieNum=%d\r\n", cookieNum)
for i := 0; i < cookieNum; i++ {
var curCk *http.Cookie = CurCookies[i];
fmt.Printf("curCk.Raw=%s\r\n", curCk.Value)
}
} //获取unix时间
func getMillisecond() int64{
MS := time.Now().Unix()
return MS
} // 密码加密
func RsaEncrypt(publicKey []byte,origData []byte) ([]byte, error) {
block, _ := pem.Decode(publicKey)
if block == nil {
return nil, errors.New("public key error")
}
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return nil, err
}
pub := pubInterface.(*rsa.PublicKey)
return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
} func main() { uname := ""
upassword := "" p, err := phantomjs.Start()
if err != nil {
panic(err)
}
defer p.Exit() // Don't forget to kill phantomjs at some point.
var gid interface{}
var callback interface{}
//获取gid
err = p.Run("function gid(){ return 'xxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (e) { var t = 16 * Math.random() | 0,n = 'x' == e ? t : 3 & t | 8;return n.toString(16)}).toUpperCase()}", &gid)
//获取callback()
err = p.Run("function callback(){ return 'bd__cbs__'+Math.floor(2147483648 * Math.random()).toString(36)}", &callback)
if err != nil {
panic(err)
}
//获取token
//tokenUrl := "https://passport.baidu.com/v2/api/?getapi&tpl=netdisk&subpro=netdisk_web&apiver=v3&tt="+strconv.FormatInt(getMillisecond(),10)+"&class=login&gid="+gid.(string)+"&logintype=basicLogin&callback="+callback.(string)
//tokenUrl := "https://passport.baidu.com/v2/api/?getapi&tpl=netdisk&subpro=netdisk_web&apiver=v3&tt=1508470686&class=login&gid=E67758A-D8DB-45E0-B488-4DF52405EB73&logintype=basicLogin&callback=bd__cbs__lzwd5"
//body1 := getUrlRespHtml(tokenUrl,nil)
//fmt.Printf("第一次返回结果:%s\n",body1)
//https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true
var token string
var getapiUrl string = "https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true";
getApiRespHtml := getUrlRespHtml(getapiUrl, nil) loginTokenP, _ := regexp.Compile(`bdPass\.api\.params\.login_token='(?P<loginToken>\w+)';`)
foundLoginToken := loginTokenP.FindStringSubmatch(getApiRespHtml)
if nil != foundLoginToken {
strLoginToken := foundLoginToken[1] //tmp go regexp not support named group, so use index here
token = strLoginToken
}
//获取rsakey和pubkey
rsaUrl := "https://passport.baidu.com/v2/getpublickey?token="+token+"&tpl=netdisk&subpro=netdisk_web&apiver=v3&tt="+strconv.FormatInt(getMillisecond(),10)+"&gid="+gid.(string)+"&callback="+callback.(string)
pubkeyHtml := getUrlRespHtml(rsaUrl, nil)
println(pubkeyHtml)
i := strings.Index(pubkeyHtml, "-----BEGIN PUBLIC KEY-----")
j := strings.Index(pubkeyHtml, "-----END PUBLIC KEY-----")
println("pubkey裁剪后:" + pubkeyHtml[i:j+26])
str := pubkeyHtml[i:j+26]
var pubkey string
//pubkey = strings.Replace(str, "\n", "\\n", -1)
pubkey = strings.Replace(str, "\\n", "\n", -1)
pubkey2 := strings.Replace(pubkey, "\\/", "/", -1)
println("pubkey替换后:"+pubkey)
println("pubkey替换后2:"+pubkey2)
k_i := strings.Index(pubkeyHtml,"\"key\":'")
k_j := strings.LastIndex(pubkeyHtml,",")
key := pubkeyHtml[k_i+7:k_j-1]
println("key:" + key)
//加密后的密码
data, err := RsaEncrypt([]byte(pubkey2),[]byte(upassword))
pwd:= base64.StdEncoding.EncodeToString(data)
println(pa) //准备post参数
postDict := map[string]string{}
postDict["staticpage"] = "https://passport.baidu.com/static/passpc-account/html/v3Jump.html"
postDict["charset"] = "UTF-8"
postDict["token"] = token
postDict["tpl"] = "pp"
postDict["subpro"] = ""
postDict["apiver"] = "v3"
postDict["tt"] = strconv.FormatInt(getMillisecond(),10)
postDict["codestring"] = ""
postDict["safeflg"] = "0"
postDict["u"] = "https://passport.baidu.com/"
postDict["isPhone"] = ""
postDict["detect"] = "1"
postDict["gid"] = gid.(string)
postDict["quick_user"] = "0"
postDict["logintype"] = "basicLogin"
postDict["logLoginType"] = "pc_loginBasic"
postDict["idc"] = ""
postDict["loginmerge"] = "true"
postDict["username"] = uname
postDict["password"] = pwd
postDict["mem_pass"] = "on"
postDict["rsakey"] = key
postDict["crypttype"] = "12"
postDict["ppui_logintime"] = "71755"
postDict["countrycode"] = ""
postDict["fp_uid"] = "a4cb1898d835565da9359337df7f1bc6"
postDict["fp_info"] = "a4cb1898d835565da9359337df7f1bc6002~~~asaanRiuI~9is-0_haaFFiLBEF1B5GKBYX_iiLBEF1B5Gls-X_EapGqDapGqOaaqZapkZSikH~meF~VwFtc96xym4~GQE9qEIOF~suRgskR1tjqDBEB1rx6hPX__HhaqziuB-4iBX__rhaX-haXKhaqGig6bIO3t79HwqhFtsSPLT~NLHh0L6eFxIvPvujNvke3x99~x0JaX0nXGhYYXn9XO-EfVJ5XnQnmoZXGtX1a1XSXeXSXpGnOGXvZXpXlTL0yeISHgUuXrvOcOXXXZpZg70fyGG7fDmaGGNKIhaqVhaqxhaqLhaqXaaaMiu2xGV0Ol_uiA3LKj4vI-NLcdcL0_ahaqpassNfHBYAaaXehaXdas8TBnAZchaXJhaXUhaXlhaXmiErEnisYaysY0lCYajCY4OsjaOs0__"
postDict["dv"] = "MDExAAoAvgALA2QAIwAAAF00AAwCACOJ2NjY2OhuOns1ciBhLHMsfC9_IBNME2MCcQJ1GmgMfA94HAcCAASRkZGRDAIAI4nY2NjY9xJGB0kOXB1QD1AAUwNcbzBvH34NfglmFHAAcwRgBwIABJGRkZEJAgAkiY2-v7i4uLi4nQMDVxZYH00MQR5BEUISTX4hfgt4HW8hQC1IBwIABJGRkZEIAgAhiYpAQX19fXC96ajmofOy_6D_r_ys88CfwLDRotGmybvfDQIAHZGRnOX9qeim4bPyv-C_77zss4DfgPCR4pHmifufBwIABJGRkZEJAgAkiY3Dwvv7-_v79sjInN2T1IbHitWK2onZhrXqtcWk16TTvM6qDQIAHZGRmfDovP2z9KbnqvWq-qn5ppXKleCT9oTKq8ajDQIABZGRkkBABwIABJGRkZEXAgAHkJMDAwF1FhYCACKwxK-fsYW8hbyIu4y6grOGv4e1hreGs4O7j7iKv4q5i72LBAIABpKSkJGkkgECAAaRk5ODju4FAgAEkZGRnRUCAAiRkZDP-AB_QxACAAGREwIAKJG1tbXdqd2t3uTL5JT1hvWF6pjswqDBqMy5l_Sb9tmvnbKN4Y7pgO4GAgAokZGR7e3t7e3t7evExMTGJiYmIGBgYGPn5-fhoaGhov7-_vioqKirxw0CAAWRkZHa2ggCACGJjaSlo6Ojq53JiMaB05LfgN-P3IzT4L_gleaD8b_es9YJAgAkiY2oqaysrKyspOvrv_6w96Xkqfap-ar6pZbJluOQ9YfJqMWgBwIABJGRkZEIAgAhiYpFRElJSUO14aDuqfu696j3p_Sk-8iXyL3Oq9mX9pv-DQIAHZGRnPTsuPm38KLjrvGu_q39opHOkeSX8oDOr8KnDAIAI4mBgYGBjpTAgc-I2pvWidaG1YXa6bbpmfiL-I_gkvaG9YLmCAIACZGXi4uXl5eHKAgCAB6Eh0ZGhYWFp2k9fDJ1J2YrdCt7KHgnFEsUcQNxHmwJAgAkiY2FhLu7u7u7k7q67q_hpvS1-Kf4qPur9MeYx7fWpdahzrzYBwIABJGRkZEMAgAjiejo6OjblsKDzYrYmdSL1ITXh9jrtOub-on6jeKQ9IT3gOQMAgAjievr6-vYJnIzfTpoKWQ7ZDRnN2hbBFsrSjlKPVIgRDRHMFQ"
postDict["traceid"] = "2F0ADB01"
var callback2 interface{}
err = p.Run("function callback(){ return 'bd__cbs__'+Math.floor(2147483648 * Math.random()).toString(36)}", &callback2)
postDict["callback"] = "parent."+callback2.(string) //第一次post
onePost := "https://passport.baidu.com/v2/api/?login" body2 :=getUrlRespHtml(onePost, postDict)
println("omePost:"+ body2) //获取codeString
compile1, _ := regexp.Compile("codeString=(\\w+)&")
match1 := compile1.FindString(body2)
println("codestring:" + match1[11:len(match1)-1])
codeString := match1[11:len(match1)-1]
postDict["codestring"] = codeString
//获取验证码
verifycodeUrl := "https://passport.baidu.com/cgi-bin/genimage?"+codeString
getImg(verifycodeUrl,nil)
//验证验证码
var callback3 interface{}
err = p.Run("function callback(){ return 'bd__cbs__'+Math.floor(2147483648 * Math.random()).toString(36)}", &callback3)
var verifycode = ""
println("请输入验证码:")
fmt.Scanln(&verifycode)
println("验证码:" + verifycode)
l3, _ := url.Parse(verifycode)
println("验证码:" + l3.Query().Encode())
checkVerifycodeUrl := "https://passport.baidu.com/v2/?checkvcode&token="+token+"&tpl=netdisk&subpro=netdisk_web&apiver=v3&tt="+ strconv.FormatInt(getMillisecond(),10)+ "&verifycode="+verifycode+"&codestring="+codeString+"&callback="+callback3.(string) res3 := getUrlRespHtml(checkVerifycodeUrl, nil)
println(res3) postDict["verifycode"] = verifycode
postDict["ppui_logintime"] = "81755" lastUrl := "https://passport.baidu.com/v2/api/?login"
res4 := getUrlRespHtml(lastUrl, postDict)
println(res4) //判断err_no=0为登录成功!其他代码可参考:https://bbs.125.la/thread-13881883-1-2.html }

go 语言模拟百度登录的更多相关文章

  1. POST模拟百度登录和自动发帖

    这里用HttpClient发包模拟百度登录和发帖,验证码部分采用机器下载人工识别. 登陆百度的原理:1. 访问https://passport.baidu.com/v2/api/?getapi& ...

  2. C#模拟百度登录并到指定网站评论回帖(五)

    前面的四篇已经说完了全部的模拟百度登录,接下来就是到指定的网站去发表评论,当然你也可能是获取其他信息,其实这些套路都是万变不离其宗的,弄懂之后觉得像这种请求-响应获取信息的功能实在很简单(想起当初走的 ...

  3. C#模拟百度登录并到指定网站评论回帖(一)

    核心信息: 请求网址:  https://passport.baidu.com/v2/api/?login请求方法:  POST状态码:  HTTP/1.1 200 OK请求头  //用户代理 Use ...

  4. C#模拟百度登录

    目录: 1.fiddler解析百度登录地址 2.处理传入参数 1.fiddler解析百度登录地址 因工作需要,所以研究了下百度的登陆.首先打开https://passport.baidu.com/v2 ...

  5. C#模拟百度登录并到指定网站评论回帖(二)

    序言: 回归正题:前面讲到的抓包分析的数据,是模拟登录要获得得必要信息(当然有些也不是必要的...我只是都列举出来这样有个对比)如果说,有哪个英文字母不知道什么意思的,可以问一下度娘,有不少前辈都发过 ...

  6. C#模拟百度登录并到指定网站评论回帖(三)

    上次说到怎么获取BAIDUID,这个相信很多人都能够拿到就不多说了,今天一连说两个,获取token和raskey 2.利用以上获得的cookie直接访问页面 https://passport.baid ...

  7. C#模拟百度登录并到指定网站评论回帖(四)

    基本的实现功能前面已经全部讲完,基本上可以复制黏贴完成登录百度的过程了 今天的这一贴就说说怎么获取百度的验证码 内容回顾:还记得前面第一贴说的如果登录发生异常,百度会发回2个值吗?是的,就是codeT ...

  8. Java语言使用HttpClient模拟浏览器登录

    使用HttpClient来模拟浏览器登录网站,然后可以进行操作,比如发布信息等 第一步:获取实际的post网址,(不考虑复杂情况下) 1.需要使用到firefox的httpfox插件,httpfox中 ...

  9. 语言模拟ATM自动取款机系统

    C语言实验报告       题目名称:C语言模拟ATM自动取款机系统 C语言模拟实现ATM自动取款机功能:输入密码,余额查询,取款,存款,转账,修改密码,退出功能: 代码实现的功能: 账号及密码输入: ...

随机推荐

  1. 【洛谷P1983】车站分级

    车站分级 题目链接 首先,可以发现火车停靠站点的大小是没有什么规律的, 火车可以停靠在级别<=当前级别的站点,必须停靠在级别>=当前最高级别的站点 但是所有没有被停靠的站点级别一定比所有被 ...

  2. 旧文备份:硬盘MBR引导记录损坏的一种修复方法

    硬盘MBR信息损坏原因:硬盘上安装了windows XP和linux双系统,在windows下安装一套软件,破解的时候修改了硬盘的序列号,结果导致引导系统的grub无法完成linux的引导,只能进到w ...

  3. tomcate8配置多个二级域名问题解决根目录空白2017年12月9日

    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDepl ...

  4. TDD: 测试静态方法

    对于静态方法,mock框架大多不支持测试.所以需要修改代码,以便调用的静态方法可测试. 1  一个静态方法类: public class MyHelper{ public static string ...

  5. Vue nodejs商城项目-商品列表价格过滤和加入购物车功能

    一.价格过滤功能 GoodsList.vue >>点击价格区间时发送请求 methods:{     getGoodsList(flag){         var param = {   ...

  6. Swift_控制流

    Swift_控制流 点击查看源码 for-in 循环 //for-in 循环 fileprivate func testForIn() { //直接循环提取内部数据 //[1,5] for index ...

  7. Linux性能监控工具 gtop

    给大家介绍一款性能监控工具,个人对比界面比top美观,常用指标比较清晰毕竟top上的指标不是每个人都能熟悉,也不是所有指标参数都需要看,对于新手也不便查找,好了说的再多先上图大家参观一下. 1.安装需 ...

  8. org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field xxx exceeds its maximum permitted size of 1048576 bytes.

    springboot 通过MultipartFile接受前端传过来的文件时是有文件大小限制的(springboot内置tomact的的文件传输默认为1MB),我们可以通过配置改变它的大小限制 首先在启 ...

  9. CentOS7 minimal 没有netstat命令

    在CentOS 7 minimal中使用netstat 时,发现显示如下,明显没有了netstat 命令 [root@localhost ~]# netstat -a -bash: netstat: ...

  10. Linux下文件字符编码格式检测和转换

    目前多数情况下, 我们遇到的非英文字符文件都是使用UTF-8编码的, 这时一般我们查看这些文件的内容都不会有问题. 不过有时, 我们有可能会遇到非UTF-8编码的文件, 比如中文的GBK编码, 或者俄 ...