关于登录网页然后post获取数据的问题

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: 关于登录网页然后post获取数据的问题

Re: 关于登录网页然后post获取数据的问题

Post by tmplinshi » 21 Jul 2016, 10:55

wzdg wrote:碰到个需要处理两三万行的数据了,无奈没找到JSON_parse函数,把我存储的所有的json库函数都翻了一下也没找到 :headwall:
在 Google 中搜索 "JSON_parse" autohotkey 或者 "JSON_parse" site:autohotkey.com 可以找到。不过搜索结果中有另一个同名的函数,你自己找的话可能会找错。
代码在这里: https://gist.github.com/grey-code/5563674

Re: 关于登录网页然后post获取数据的问题

Post by wzdg » 21 Jul 2016, 09:34

tmplinshi wrote:简单写了个示例

Code: Select all

; JSON_ToObj -- https://autohotkey.com/boards/viewtopic.php?t=30

#NoEnv
#SingleInstance Force
SetWorkingDir %A_ScriptDir%
SetBatchLines -1

global lv, wb
; -----------------------------------------------------

创建并显示界面()

qbao.打开登录页面()
qbao.等待登录成功()

载入查询结果( qbao.获取我的宝券() )
return

创建并显示界面() {
	Gui, Add, ListView, w226 h608 vlv, 时间|数量
	Gui, Add, ActiveX, x+5 w950 hp vWB, Shell.Explorer
	Gui, Show
	return

	GuiClose:
	ExitApp
}

载入查询结果(obj_result) {
	LV_Delete()
	for i, row in obj_result.data.rows {
		LV_Add("", row.createTime, row.couponAmount)
	}
	MsgBox, % "已载入第 " obj_result.data.pageIndex " 页结果(共 " obj_result.data.pageCount " 页)"
}

class qbao {

	打开登录页面() {
		wb.silent := true
		wb.navigate("http://user.qbao.com/usercenter/ucIndex.html")
	}

	等待登录成功() {
		loop {
			Sleep, 200
		} until (wb.document.getElementById("islogin"))
	}

	获取我的宝券(idx = 1) {
		url := "http://bq.qbao.com/flow/query.html"
		ref := "http://bq.qbao.com/portle/my.html"
		postData := "type=0&idx=" idx
		while, !HttpRequest(url, ioData := postData, ioHdr := this.hdr(ref), "Charset: UTF-8") {
			Sleep, 1000
		}
		return JSON_ToObj(ioData)
	}

	hdr(referer = "") {
		return "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36" . "`n"
		     . "Referer: " referer
	}
}
处理小的 JSON 数据,我习惯用 JSON_ToObj 和 JSON_FromObj。
JSON 数据很大的话(几千几万行),用 JSON_parse 能快很多倍。
碰到个需要处理两三万行的数据了,无奈没找到JSON_parse函数,把我存储的所有的json库函数都翻了一下也没找到 :headwall:

Re: 关于登录网页然后post获取数据的问题

Post by wzdg » 08 Apr 2016, 10:21

恩,好的,谢谢了

Re: 关于登录网页然后post获取数据的问题

Post by tmplinshi » 08 Apr 2016, 00:57

这两个问题我都抓包看了下,都比较复杂,需要分析很多抓包数据。“签到”的最后一步拼图还需要想办法识别图片上六个文字,然后跟这六个文字的图片对应得出顺序。

所以呢,请自行研究。

Re: 关于登录网页然后post获取数据的问题

Post by wzdg » 03 Apr 2016, 11:43

大哥,在请教个问题吧,登陆钱宝网,然后依次点击任务管理--->>>进行中的任务--->>>分享任务,就可以找到正在做的任务了,然后去做任务就可以看广告了,看完广告点击立即分享,会弹出一个分享对话框,选择分享到微博,就会跳转到微博分享界面了,我想用软件看完广告,然后把分享界面的那个短链接取出来应该怎么实现呢,具体流程详见附图

ps 实际上我想把签到功能也做出来,只是功力太浅,不知该怎么下手 :cry:
Attachments
Screenshot_2016-04-04-00-40-03.jpeg
Screenshot_2016-04-03-00-40-33.jpeg
Screenshot_2016-04-03-00-40-43.jpeg

Re: 关于登录网页然后post获取数据的问题

Post by wzdg » 31 Mar 2016, 18:38

嗯,明白了,昨晚半夜逛论坛,偶遇作者的帖子了,(⊙o⊙) 贴出来,万一遇到需要的人就好参考了,作者帖子地址:https://autohotkey.com/board/topic/6798 ... nicodex64/

Re: 关于登录网页然后post获取数据的问题

Post by tmplinshi » 31 Mar 2016, 13:33

wzdg wrote:嗯,谢谢,差不多都懂了,第二个参数为空时是get请求,那get到的数据是存储在哪儿了呢。论坛搜索函数名,真心找不到作者的帖子,
必须要传递一个变量名过去,才能获取返回结果。

Code: Select all

HttpRequest("http://baidu.com", "") ; 这样虽然能提交请求,但是获取不到结果
HttpRequest("http://baidu.com", inOutData) ; inOutData 为空则是进行 GET 请求。不管是 GET 还是 POST,结果都是返回到 inOutData 这个变量中。

Re: 关于登录网页然后post获取数据的问题

Post by wzdg » 31 Mar 2016, 11:10

嗯,谢谢,差不多都懂了,第二个参数为空时是get请求,那get到的数据是存储在哪儿了呢。论坛搜索函数名,真心找不到作者的帖子,

Re: 关于登录网页然后post获取数据的问题

Post by tmplinshi » 31 Mar 2016, 10:00

HttpRequest 的作者帖子中有详细的帮助信息。帖子链接: https://autohotkey.com/board/topic/6798 ... nicodex64/

回答你的问题:

第一:HttpRequest 的第2个参数是输入输出数据。POST 数据是写在这里,返回的数据也是保存在这里。
HttpRequest 的第3个参数是输入输出表头。要发送 HTTP 表头写在这里,返回的表头也是保存在这里。

第二:当进行 POST 时必须要设置 Content-Type,不过 HttpRequest 会自动设置这个表头,所以可以省略。其他的 Referer和 User-Agent 一般可以省略,不过呢最好是带上去,因为很多网站会检测来源判断是不是机器人。

第三:HttpRequest 的第2个参数为空时是进行 GET 请求,而有数据时则进行 POST 请求。

第四:第四项参数 Options 见 HttpRequest 作者的帖子。

Re: 关于登录网页然后post获取数据的问题

Post by wzdg » 31 Mar 2016, 08:58

tmplinshi wrote:简单写了个示例

Code: Select all

; JSON_ToObj -- https://autohotkey.com/boards/viewtopic.php?t=30

#NoEnv
#SingleInstance Force
SetWorkingDir %A_ScriptDir%
SetBatchLines -1

global lv, wb
; -----------------------------------------------------

创建并显示界面()

qbao.打开登录页面()
qbao.等待登录成功()

载入查询结果( qbao.获取我的宝券() )
return

创建并显示界面() {
	Gui, Add, ListView, w226 h608 vlv, 时间|数量
	Gui, Add, ActiveX, x+5 w950 hp vWB, Shell.Explorer
	Gui, Show
	return

	GuiClose:
	ExitApp
}

载入查询结果(obj_result) {
	LV_Delete()
	for i, row in obj_result.data.rows {
		LV_Add("", row.createTime, row.couponAmount)
	}
	MsgBox, % "已载入第 " obj_result.data.pageIndex " 页结果(共 " obj_result.data.pageCount " 页)"
}

class qbao {

	打开登录页面() {
		wb.silent := true
		wb.navigate("http://user.qbao.com/usercenter/ucIndex.html")
	}

	等待登录成功() {
		loop {
			Sleep, 200
		} until (wb.document.getElementById("islogin"))
	}

	获取我的宝券(idx = 1) {
		url := "http://bq.qbao.com/flow/query.html"
		ref := "http://bq.qbao.com/portle/my.html"
		postData := "type=0&idx=" idx
		while, !HttpRequest(url, ioData := postData, ioHdr := this.hdr(ref), "Charset: UTF-8") {
			Sleep, 1000
		}
		return JSON_ToObj(ioData)
	}

	hdr(referer = "") {
		return "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36" . "`n"
		     . "Referer: " referer
	}
}
处理小的 JSON 数据,我习惯用 JSON_ToObj 和 JSON_FromObj。
JSON 数据很大的话(几千几万行),用 JSON_parse 能快很多倍。
谢谢回答的这么详细,还提供了这么好的学校代码 :bravo: :bravo: ,有几个地方比较困惑:
第一:就是你提到的InOutData是发送给服务器的数据,但是我在另一个代码里看到的他是存储返回的数据的,(实际上while, !HttpRequest(url, ioData := postData, ioHdr := this.hdr(ref), "Charset: UTF-8") 这段代码里ioData 是存储返回的数据,postData又是发送的data数据)见图片注释
第二:对request header 部分有几处疑问,有时候用到的是它的这几部分(比如Content-Type和Referer),有时候用到又是其他的几部分(比如,Referer和User-Agent),有时候不用也可以,有点搞不明白
第三:HttpRequest可以get数据吗,我论坛逛了逛,没找到相关信息,
第四:关于httprequest的第四项参数Options,由于没有帮助信息,不知道他一般是添加的哪些参数呢
:crazy: :crazy: 不好意思了,一下子说了这么一堆,只是觉的这几个好像都很重要,所以就都问了 :D :D
Attachments
IN192QJU@GT%I)NI{J{4ZM8.png

Re: 关于登录网页然后post获取数据的问题

Post by tmplinshi » 30 Mar 2016, 14:29

简单写了个示例

Code: Select all

; JSON_ToObj -- https://autohotkey.com/boards/viewtopic.php?t=30

#NoEnv
#SingleInstance Force
SetWorkingDir %A_ScriptDir%
SetBatchLines -1

global lv, wb
; -----------------------------------------------------

创建并显示界面()

qbao.打开登录页面()
qbao.等待登录成功()

载入查询结果( qbao.获取我的宝券() )
return

创建并显示界面() {
	Gui, Add, ListView, w226 h608 vlv, 时间|数量
	Gui, Add, ActiveX, x+5 w950 hp vWB, Shell.Explorer
	Gui, Show
	return

	GuiClose:
	ExitApp
}

载入查询结果(obj_result) {
	LV_Delete()
	for i, row in obj_result.data.rows {
		LV_Add("", row.createTime, row.couponAmount)
	}
	MsgBox, % "已载入第 " obj_result.data.pageIndex " 页结果(共 " obj_result.data.pageCount " 页)"
}

class qbao {

	打开登录页面() {
		wb.silent := true
		wb.navigate("http://user.qbao.com/usercenter/ucIndex.html")
	}

	等待登录成功() {
		loop {
			Sleep, 200
		} until (wb.document.getElementById("islogin"))
	}

	获取我的宝券(idx = 1) {
		url := "http://bq.qbao.com/flow/query.html"
		ref := "http://bq.qbao.com/portle/my.html"
		postData := "type=0&idx=" idx
		while, !HttpRequest(url, ioData := postData, ioHdr := this.hdr(ref), "Charset: UTF-8") {
			Sleep, 1000
		}
		return JSON_ToObj(ioData)
	}

	hdr(referer = "") {
		return "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36" . "`n"
		     . "Referer: " referer
	}
}
处理小的 JSON 数据,我习惯用 JSON_ToObj 和 JSON_FromObj。
JSON 数据很大的话(几千几万行),用 JSON_parse 能快很多倍。

Re: 关于登录网页然后post获取数据的问题

Post by tmplinshi » 30 Mar 2016, 12:57

你发送的 InOutData 是空变量,而实际上需要发送 type=0&idx=1 到服务器

Image

idx=1 根据分析得知表示的是查询第一页。

关于登录网页然后post获取数据的问题

Post by wzdg » 30 Mar 2016, 10:02

关于登录网页然后post获取数据的问题,我是根据网页元素“所有记录”来判断是否登录完成的,登录完成后,我post得到的数据并不是想要的,我想要的数据是图二和图三部分的数据,也就是分享宝券的这些数据,我登录后获取到的一些内容见图一,大神测试的时候可以用下面我提供的这个账号来测试,谢谢了。
账号:18434360249 密码:gqr6851826 来测试,谢谢了
代码如下

Code: Select all

SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#SingleInstance force
#NoEnv
#Include <HTTPRequest>

Gui Add, ListView, vlistview x18 y54 w226 h608, a|b|c
Gui Add, ActiveX,  x+5 y53 w900 h640 vWB, Shell.Explorer  ;最后一个参数是ActiveX组件的名称.
Gui Add, Button,  x77 y9 w75 h23, 开始
Gui Add, Button, x191 y8 w75 h23, 暂停
Gui Show,  , Window

加载网页:
	Gui submit,NoHide
	;~ url_group := "http://qun.qzone.qq.com/"
	url_group := "http://bq.qbao.com/portle/my.html"
	wb.Silent := True					 ; 这一句可以避免一些网页弹出脚本错误
	wb.Navigate(url_group)
	wb.visible :=true ;浏览器窗口可见
	Sleep, 1000

	Loop { ;等待网页加载完成!
		Sleep,200
		if (wb.ReadyState="complete" or wb.ReadyState=4 or A_LastError!=0)
			break
	} ;****************************************************************

	Sleep 300

	Loop{			;简单的方法来判断是否登录成功
		Sleep 100
	}
	until (wb.document.getElementById("ut88").outerText = "所有记录")   ;根据是否出现“所有记录”这个网页元素来判断是否登录成功
	gosub GetGroupList
return


GetGroupList:						;post获取数据
	url =
	(LTrim Join&
		http://bq.qbao.com/flow/query.html
	)
	Sleep, 1000

	while !HttpRequest(url, InOutData, out_h := Headers())   ;InOutData获取到的数据
		Sleep, 1000

	MsgBox %InOutData%
	Clipboard:=InOutData
	FileAppend,%InOutData%,分享数据json.txt

	if !RegExMatch(InOutData, "\{.*\}", json_GroupList)
	{
		TrayTip, 正在获取数据, 正在获取数据, 3
		goto, GetGroupList
	}

	jGroup := JSON_parse(json_GroupList).data   ;群列表的json数据

	Loop, % jGroup.total                      ;总共的群数量
	{
		GroupId   := jGroup["rows", A_Index, "createTime"]                    ;分享时间
		GroupName := jGroup["rows", A_Index, "couponAmount"]        ;所得宝券数量
		LV_Add("", GroupName, GroupId)
		FileAppend,%GroupName%`t`t%GroupId%`n,分享数据处理过的数据.txt
	}
return

Button暂停:
	Pause
return


JSON_parse(jsonStr) {
	SC := ComObjCreate("ScriptControl")
	SC.Language := "JScript"
	;ComObjError(false)
	jsCode =
	(
    function arrangeForAhkTraversing(obj) {
        if(obj instanceof Array) {
            for(var i=0 ; i<obj.length ; ++i)
                obj[i] = arrangeForAhkTraversing(obj[i]) ;
            return ['array',obj] ;
        } else if(obj instanceof Object) {
            var keys = [], values = [] ;
            for(var key in obj) {
                keys.push(key) ;
                values.push(arrangeForAhkTraversing(obj[key])) ;
            }
            return ['object',[keys,values]] ;
        } else
            return [typeof obj,obj] ;
    }
	)
	SC.ExecuteStatement(jsCode "; obj=" jsonStr)
	return convertJScriptObj2AHK(SC.Eval("arrangeForAhkTraversing(obj)"))
}

Headers(referer = "")
{
	global userAgent
	if !userAgent
		userAgent := "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)"
	;~ Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
	Headers =
	( LTRIM
		Accept:application/json, text/javascript, */*; q=0.01
        Accept-Encoding:gzip, deflate
        Accept-Language:zh-CN,zh;q=0.8
        Cache-Control:max-age=0
        Connection:keep-alive
        Content-Length:12
        Content-Type:application/x-www-form-urlencoded; charset=UTF-8
		Host:bq.qbao.com
		Origin:http://bq.qbao.com
		Referer:http://bq.qbao.com/portle/my.html
		User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
		X-Requested-With:XMLHttpRequest
	)
	return Headers
}

convertJScriptObj2AHK(jsObj) {
	if (jsObj[0]="object") {
		obj := {}, keys := jsObj[1][0], values := jsObj[1][1]
		Loop % keys.length
			obj[keys[A_Index-1]] := convertJScriptObj2AHK(values[A_Index-1])
		return obj
	} else if (jsObj[0]="array") {
		array := []
		Loop % jsObj[1].length
			array.Insert(convertJScriptObj2AHK(jsObj[1][A_Index-1]))
		return array
	} else return jsObj[1]
}

URLDownloadToVar(url, Encoding = "",Method="GET",postData=""){ ;网址,编码,请求方式,post数据
	hObject:=ComObjCreate("WinHttp.WinHttpRequest.5.1")
	if Method = GET
	{
		Try
		{
			hObject.Open("GET",url)
			hObject.Send()
		}
		catch e
			return -1
	}
	else if Method = POST
	{
		Try
		{
			hObject.Open("POST",url,False)
			hObject.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
			hObject.Send(postData)
		}
		catch e
			return -1
	}

	if (Encoding && hObject.ResponseBody)
	{
		oADO := ComObjCreate("adodb.stream")
		oADO.Type := 1
		oADO.Mode := 3
		oADO.Open()
		oADO.Write(hObject.ResponseBody)
		oADO.Position := 0
		oADO.Type := 2
		oADO.Charset := Encoding
		return oADO.ReadText(), oADO.Close()
	}
	return hObject.ResponseText
}
Attachments
3.png
2.png
1.png

Top