吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2881|回复: 2
上一主题 下一主题
收起左侧

[易语言 转载] 精易模块的网页_访问_701错误问题

[复制链接]
跳转到指定楼层
楼主
HAO1998 发表于 2020-9-2 15:40 回帖奖励
本帖最后由 HAO1998 于 2020-9-2 17:34 编辑

最近学到POST登陆,使用精易模块8.3.5模拟POST登陆,精易模块老是卡在这个WinHttpAddRequestHeaders函数,一直设置失败,一直提示710 设置协议头失败!
于是查看源码,网页_访问用的是winnet,网页_访问_对象用的是WinHttp.WinHttpRequest.5.1,网页_访问S用的是WinHttp的API。这个WinHttpAPI(WinHttpAddRequestHeaders)设置,
老是报错,浪费我很多的时间,而且这些函数都会自己设置默认参数,我用这三个函数进行POST登陆没一个成功,索性我把网页_访问拿出来重新写一遍,不要默认参数的。

.版本 2
.支持库 spec

.程序集 窗口程序集_启动窗口

.子程序 __启动窗口_创建完毕

winHttp_send (“https://www.baidu.com”)

.子程序 winHttp_send
.参数 url, 文本型
.参数 cookie, 文本型, 可空
.参数 ret_cookie, 文本型, 可空
.参数 post_data, 文本型, 可空
.局部变量 https, 对象
.局部变量 timeout, 整数型, , , 超时毫秒
.局部变量 res_ary, 文本型, , "0"
.局部变量 n, 整数型

CoInitialize (0)  ' 告诉window以单线程创建com对象
timeout = 1000
https.创建 (“WinHttp.WinHttpRequest.5.1”, )
https.方法 (“Open”, “GET”, url, 假)

https.方法 (“SetTimeouts”, timeout, timeout, timeout, timeout)
https.方法 (“SetRequestHeader”, “Accept-Encoding”, “utf-8”)  ' 可以解析的编码
https.方法 (“SetRequestHeader”, “Connection”, “keep-alive”)  ' 连接状态
https.方法 (“SetRequestHeader”, “Content-Type”, “application/x-www-form-urlencoded”)  ' 连接状态
https.方法 (“SetRequestHeader”, “Referer”, “http://cloud.tg-net.cn/login.jsp”)  ' Referer:
https.方法 (“SetRequestHeader”, “Accept”, “textml,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9”)  ' 接受的格式
https.方法 (“SetRequestHeader”, “Accept-Language”, “zh-CN,zh;q=0.9,en;q=0.8”)  ' 可以接受的语言
https.方法 (“SetRequestHeader”, “User-Agent”, “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36”)  ' 你的浏览器信息
.如果真 (cookie ≠ “”)
    https.方法 (“SetRequestHeader”, “Cookie”, cookie)
.如果真结束

https.方法 (“send”, post_data)  ' post数据

调试输出 (编码_Utf8到Ansi (https.读属性 (“ResponseBody”, ).取字节集 ()))  ' 获取返回html,以无符号的字节格式
调试输出 (“============================================================================”)
调试输出 (https.读文本属性 (“GetallResponseHeaders”, ))  ' 获取返回response头
调试输出 (“============================================================================”)
调试输出 (https.读文本属性 (“Status”, ))  ' 获取返回的状态码
调试输出 (“============================================================================”)
调试输出 (https.读文本属性 (“StatusText”, ))  ' 获取返回response头
调试输出 (“============================================================================”)
调试输出 (https.读文本属性 (“ResponseText”, ))  ' 获取返回的html,以字符串格式

res_ary = 分割文本 (https.读文本属性 (“GetallResponseHeaders”, ), #换行符, )
.计次循环首 (取数组成员数 (res_ary), n)
    .如果真 (寻找文本 (res_ary [n], “Set-Cookie”, , 假) > -1)
        ret_cookie = ret_cookie + 删首尾空 (文本_取出中间文本 (res_ary [n], “Set-Cookie:”, “;”)) + “; ”
    .如果真结束

.计次循环尾 ()

CoUninitialize ()  ' 必须和CoInitialize成对使用



====================================================================================================
701错误的问题无法解决,解决方法就是使用winHttp对象
==============================================
当你用了我这函数还是报错怎么办呢?
在winHttp里面没有这样一个getRequestHeader的方法,我们看不到我们发出去了什么,
无法确认你发出去的数据包和你浏览器进行访问的包是否一模一样!
winHttp的send函数到底是怎么拼接RequestHeader的呢?
因为https的包抓到了我也解析不了,http的包可以抓到解析,我们就可以看send函数干了些啥?
我就使用wireshark进行抓包,一共12行数据
我的代码设置,我设置了9个数据
winHttp帮我们计算了post_data的包的长度,我们设置的内容它并不会按造我们设置的属性排列。

假设我不设置任何内容,winHttp会如何填充呢?

一共7行数据, 连接状态,接受类型,浏览器标识,文本长度这是会默认填充的.User-Agent就暴露了我们不是通过浏览器进行访问的
报错无非就是你和浏览器发出的数据包内容不一, 所以你要自行补全http头信息,我经常遇到要设置Content-Type和浏览器一致,否则就过不了。
无论使用什么工具,如果你不了解它的本质,当它出现问题的时候,你只能啥事也干不了!

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
v1小惰性 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
kantal 发表于 2020-9-2 16:18
这个可以提交到精易论坛去修正
3#
文西思密达 发表于 2020-9-2 17:05
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 23:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表