搜索
查看: 722|回复: 8

whttp在有些系统下无返回cookie 请解决

[复制链接]

1

主题

6

帖子

32

积分

新手入门

Rank: 1

积分
32
发表于 2017-11-21 17:47:22 | 显示全部楼层 |阅读模式
本帖最后由 luyimoon 于 2017-11-21 17:49 编辑

测试系统:
1.本机 2008 r2 datacenter(ghost系统)
2.服务器 win7专业版(不确定是不是ghost系统)
3.华为服务器 2008 enterprise pack2

结果:
1.本机 无返回cookie
2.win7服务器 无返回cookie
3.华为服务器 有返回 cookie
这里说的无返回cookie 为两次访问均没有返回cookie



问题:
1.如果一定要使用whttp 这种问题该如何解决(排除重新做系统 因为要复制到其他服务器上 没办法选择系统)
2.出现这种问题 和winhttp.dll有关吗




代码: (两次get请求 一次有设置header 一次无设置header)
import console;
import inet.whttp;
http1 = inet.whttp();
http2 = inet.whttp();
http1.afterSend = function(statusCode,contentLength){
    console.log("http1返回的协议头")

        console.log(http1.readHeader())
}
http2.afterSend = function(statusCode,contentLength){
    console.log("http2返回的协议头")

        console.log(http2.readHeader())
}

header2 = /***Accept:text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8
Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
User-Agent:Mozilla/5.0 (Windows NT 6.1; W…) Gecko/20100101 Firefox/57.0
Connection:keep-alive
Host:passport.baidu.com***/


http2.beforeSend = function(){
        http2.writeHeader(header2)
}
http1.get("http://passport.baidu.com")

http2.get("http://passport.baidu.com")
console.pause(true);


本机控制台信息:
http1返回的协议头
HTTP/1.1 200 OK
Connection: keep-alive
Date: Tue, 21 Nov 2017 09:44:08 GMT
Transfer-Encoding: chunked
Content-Type: text/html
Server: Apache
Vary: Accept-Encoding
Vary: Accept-Encoding
Access-Control-Expose-Headers: Trace-ID
Strict-Transport-Security: max-age=31536000
Trace-Id:
Tracecode: 26481620270432085514112117
Tracecode: 26481620270413372170112117


http2返回的协议头
HTTP/1.1 200 OK
Connection: keep-alive
Date: Tue, 21 Nov 2017 09:44:08 GMT
Transfer-Encoding: chunked
Content-Type: text/html
Server: Apache
Vary: Accept-Encoding
Vary: Accept-Encoding
Access-Control-Expose-Headers: Trace-ID
Strict-Transport-Security: max-age=31536000
Trace-Id:
Tracecode: 26483627730598940170112117
Tracecode: 26483627730969160970112117

华为2008服务器控制台信息
http1返回的协议头
HTTP/1.1 200 OK
Access-Control-Expose-Headers: Trace-ID
Connection: keep-alive
Content-Type: text/html
Date: Tue, 21 Nov 2017 09:45:20 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Server: Apache
Set-Cookie: BAIDUID=E5102F81F1B2ACA78FAF89FBDFB29A61:FG=1; expires=Wed, 21-Nov-1
8 09:45:20 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Strict-Transport-Security: max-age=31536000
Trace-Id:
Tracecode: 27202548690540225034112117
Tracecode: 27202548690322710538112117
Vary: Accept-Encoding
Vary: Accept-Encoding
Transfer-Encoding: chunked


http2返回的协议头
HTTP/1.1 200 OK
Access-Control-Expose-Headers: Trace-ID
Connection: keep-alive
Content-Type: text/html
Date: Tue, 21 Nov 2017 09:45:20 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Server: Apache
Set-Cookie: BAIDUID=F76883FA56A7FDA823B842D1D2947578:FG=1; expires=Wed, 21-Nov-1
8 09:45:20 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Strict-Transport-Security: max-age=31536000
Trace-Id:
Tracecode: 27203205270350846986112117
Tracecode: 27203205270792538122112117
Vary: Accept-Encoding
Vary: Accept-Encoding
Transfer-Encoding: chunked

win7控制台信息
http1返回的协议头
HTTP/1.1 200 OK
Connection: keep-alive
Date: Tue, 21 Nov 2017 09:46:32 GMT
Transfer-Encoding: chunked
Content-Type: text/html
Server: Apache
Vary: Accept-Encoding
Vary: Accept-Encoding
Access-Control-Expose-Headers: Trace-ID
Strict-Transport-Security: max-age=31536000
Trace-Id:
Tracecode: 27923323510962606090112117
Tracecode: 27923323510792538122112117


http2返回的协议头
HTTP/1.1 200 OK
Connection: keep-alive
Date: Tue, 21 Nov 2017 09:46:33 GMT
Transfer-Encoding: chunked
Content-Type: text/html
Server: Apache
Vary: Accept-Encoding
Vary: Accept-Encoding
Access-Control-Expose-Headers: Trace-ID
Strict-Transport-Security: max-age=31536000
Trace-Id:
Tracecode: 27932273830338176010112117
Tracecode: 27932273830792538122112117

补充:使用的是相同的代码生成的exe
回复

使用道具 举报

1

主题

6

帖子

32

积分

新手入门

Rank: 1

积分
32
 楼主| 发表于 2017-11-21 18:58:07 来自手机 | 显示全部楼层
文中定义的协议头有些错误 但这个问题经过测试不是请求头的原因 如需必要 愿意提供服务器进行测试
回复

使用道具 举报

151

主题

2381

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13090
发表于 2017-11-23 00:22:12 | 显示全部楼层
这个跟操作系统应当没什么关系,

应该是你在参数中写错了网址,https://passport.baidu.com/v2/?login 才会设置cookie

而且其他参数你都是乱填一气,还是要稍微看一下函数说明再写呀,例如UA是写在inet.whttp的第一个参数里。
回复

使用道具 举报

1

主题

6

帖子

32

积分

新手入门

Rank: 1

积分
32
 楼主| 发表于 2017-12-10 07:47:25 | 显示全部楼层
Jacen.He 发表于 2017-11-23 00:22
这个跟操作系统应当没什么关系,

应该是你在参数中写错了网址,https://passport.baidu.com/v2/?login  ...

很抱歉  很久没来论坛 一直没有回复
这个问题的原因已经找到 但是还没有找到完美的解决办法

我将无法获取cookie的系统的winhttp.dll强制删除
并将可以获取cookie的华为云系统中的winhttp.dll 复制进去 重启被删除的winhttp.dll的服务器后 重新注册winhttp.dll后 遍可以获取到cookie了(估计无法获得cookie的操作系统都是ghost版的原因)

但是有遇到了新问题   是否有更简单的解决办法?
回复

使用道具 举报

1

主题

6

帖子

32

积分

新手入门

Rank: 1

积分
32
 楼主| 发表于 2017-12-10 07:50:38 | 显示全部楼层
因为软件要在租用的vps中使用 而租用的vps的系统 几乎都是ghost版的 所以避免不了替换winhttp.dll的操作

但是从我的解决办法来看 是很繁琐的  不知道有没有更快的解决办法(因为在运行的win操作系统中 winhttp.dll 无法通过Regsvr32卸载  如果强制删除的话又不得不重启系统)
回复

使用道具 举报

151

主题

2381

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13090
发表于 2017-12-10 13:00:07 | 显示全部楼层
luyimoon 发表于 2017-12-10 07:50
因为软件要在租用的vps中使用 而租用的vps的系统 几乎都是ghost版的 所以避免不了替换winhttp.dll的操作

...
winhttp不能获取cookie,哪个版本的winhttp呢?!古老的XP都没这问题。
这种问题,你最好是联系给你提供VPS的服务商协助你解决一下!

所以没有必要,尽量不要用 winhttp

回复

使用道具 举报

1

主题

6

帖子

32

积分

新手入门

Rank: 1

积分
32
 楼主| 发表于 2017-12-10 13:17:54 | 显示全部楼层
Jacen.He 发表于 2017-12-10 13:00
winhttp不能获取cookie,哪个版本的winhttp呢?!古老的XP都没这问题。
这种问题,你最好是联系给你提供VP ...

我有两个租用的服务器 1.华为云2008系统 有返回cookie 2.win7 vps(猜测应该是ghost系统)无返回cookie

而我本机是2008 ghost系统 也没有cookie

win7vps因为没有找到对应版本的winhttp.dll 所以没替换 未测试

我本机的2008的winhttp.dll替换成华为云2008系统的winhttp.dll后 相同的程序有了返回cookie
回复

使用道具 举报

1

主题

6

帖子

32

积分

新手入门

Rank: 1

积分
32
 楼主| 发表于 2017-12-10 13:25:41 | 显示全部楼层
等我回到家后 把两个2008系统的winhttp.dll上传吧 顺便再贴上对比图
也当做给其他遇到相同问题的人解惑了
回复

使用道具 举报

151

主题

2381

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13090
发表于 2017-12-10 15:03:57 | 显示全部楼层
luyimoon 发表于 2017-12-10 13:25
等我回到家后 把两个2008系统的winhttp.dll上传吧 顺便再贴上对比图
也当做给其他遇到相同问题的人解惑了

ghost的系统也没必要去替换系统自带的winhttp.dll搞的不能用。
如果不是系统自带的,最好不要随意替换。我的win10肯定不是ghost的,而且系统自带winhttp肯定是最新版本的,
测试你的代码,结果是一样的:
import console;
import inet.whttp;

var http1 = inet.whttp();
http1.afterSend =
function(statusCode,contentLength){
    console.log(
"http1返回的协议头");
    console.log(http1.readHeader());
}

http1.get(
"https://passport.baidu.com")
console.pause(
true);

并没有返回cookie,
但是网址改成实际的 "https://passport.baidu.com/v2/?login" 就有cookie了。

这个原因很简单,跟你的winhttp.dll的版本没多大关系(我已经是最新版本了)
因为他这个中间有一个跳转URL的过程,服务器并不是每次都有必要写一个新的会话ID给你。
为什么有时候你会读到cookie呢?! 这可能是一个巧合的原因,可能你读cookie的时候他刚好卡了一下没跳过去。

你要得到这个cookie也很简单,禁用302自动跳转就可以了,示例:

import console;
import inet.whttp;

var http1 = inet.whttp();
http1.afterSend =
function(statusCode,contentLength){
    console.log(
"http1返回的协议头");
    console.log(http1.readHeader());
}

http1.disableRedirects();
http1.get(
"https://passport.baidu.com/v2/?login") ;
console.pause(
true);

但是一般没有必要这么做,让他自己去处理就行了。

另外你的代码中错误不少,例如写UA是这样写,
inet.whttp("Mozilla/5.0 (Windows NT 6.1; W…) Gecko/20100101 Firefox/57.0")
先不要忙着替换系统DLL文件,先找找自己代码中的低级错误。






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-4-27 06:59 , Processed in 0.062500 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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