搜索
查看: 1690|回复: 13

http.post提交遇到GB18030编码,服务器返回异常

[复制链接]

12

主题

57

帖子

423

积分

二级会员

Rank: 3Rank: 3

积分
423
发表于 2017-11-22 15:31:30 | 显示全部楼层 |阅读模式
本帖最后由 iaauto 于 2017-11-22 15:32 编辑

遇到两个网址,一个网址是http://www.hnrsks.gov.cn/sgwy/webRegister/login/preLogin.aspx?timeID=136&examSort=96&examDate=201712,网页编码是GB2312,请求正常
另一个网址是http://www.xysrsjzlzpksbmw.gov.cn/webRegister/login/preLogin.aspx?timeID=136&examSort=96&examDate=201712,网页编码是GB18030,请求出现了服务器错误

问题是不是出这个这个postData编码上?这种情况应该怎么处理?
  1. import console;
  2. query = function(){
  3.         import inet;
  4.         import inet.url;
  5.         import inet.whttp;
  6.         var html,err,errNo;
  7.         var http = inet.whttp("Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko");
  8.         html,err,errNo = http.get("http://www.hnrsks.gov.cn/sgwy/webRegister/login/preLogin.aspx?timeID=136&examSort=96&examDate=201712")
  9.         if(!html){retMsg = "打开查询系统失败";return ; }
  10.         VIEWSTATE = string.match(html,`__VIEWSTATE" value="(.+?)"`)
  11.         VIEWSTATEGENERATOR = string.match(html,`__VIEWSTATEGENERATOR" value="(.+?)"`)
  12.         EVENTVALIDATION = string.match(html,`__EVENTVALIDATION" value="(.+?)"`)
  13.        
  14.         var postData = inet.url.stringifyParameters({
  15.                                                                                                         __VIEWSTATE = VIEWSTATE;
  16.                                                                                                         __VIEWSTATEGENERATOR = VIEWSTATEGENERATOR;
  17.                                                                                                         __VIEWSTATEENCRYPTED = "";
  18.                                                                                                         __EVENTVALIDATION = EVENTVALIDATION;
  19.                                                                                                         Button1="我已阅读并完全理解";

  20.                                                                                                 })
  21.         html,err,errNo = http.post("http://www.hnrsks.gov.cn/sgwy/webRegister/login/preLogin.aspx?timeID=136&examSort=96&examDate=201712",postData,);console.log(html,err,errNo);
  22.         if(!html){retMsg = "进入查询系统失败";return ; }        
  23. }
  24. query()
  25. console.pause(true);
复制代码


回复

使用道具 举报

8

主题

45

帖子

276

积分

二级会员

Rank: 3Rank: 3

积分
276
发表于 2017-11-22 16:12:52 | 显示全部楼层
试了下,post时要带上cookie
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-22 16:14:33 | 显示全部楼层
这跟编码有什么关系?!
返回的内容都是简体中文,并没有乱码。

而且你的网址,用浏览器打开都是报同样的错误。
参数写错了呢。
回复

使用道具 举报

12

主题

57

帖子

423

积分

二级会员

Rank: 3Rank: 3

积分
423
 楼主| 发表于 2017-11-22 16:24:54 | 显示全部楼层
本帖最后由 iaauto 于 2017-11-22 16:26 编辑
Jacen.He 发表于 2017-11-22 16:14
这跟编码有什么关系?!
返回的内容都是简体中文,并没有乱码。

  1. import console;
  2. query = function(url){
  3.         import inet;
  4.         import inet.url;
  5.         import inet.whttp;
  6.         var html,err,errNo;
  7.         var http = inet.whttp("Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko");
  8.         html,err,errNo = http.get(url)
  9.         if(!html){retMsg = "打开查询系统失败";return ; }
  10.         //html = string.fromto(html,54936,65001);
  11.         VIEWSTATE = string.match(html,`__VIEWSTATE" value="(.+?)"`)
  12.         VIEWSTATEGENERATOR = string.match(html,`__VIEWSTATEGENERATOR" value="(.+?)"`)
  13.         EVENTVALIDATION = string.match(html,`__EVENTVALIDATION" value="(.+?)"`)
  14.        
  15.         var postData = inet.url.stringifyParameters({
  16.                                                     __VIEWSTATE = VIEWSTATE;
  17.                                                     __VIEWSTATEGENERATOR = VIEWSTATEGENERATOR;
  18.                                                     __VIEWSTATEENCRYPTED = "";
  19.                                                     __EVENTVALIDATION = EVENTVALIDATION;
  20.                                                                                                         Button1="我已阅读并完全理解";

  21.                                                                                                 },false)
  22.         html,err,errNo = http.post(url,postData,);console.log(html,err,errNo);
  23.         if(!html){retMsg = "进入查询系统失败";return ; }        
  24. }
  25. query("http://www.hnrsks.gov.cn/sgwy/webRegister/login/preLogin.aspx?timeID=136&examSort=96&examDate=201712")
  26. console.log("========================================")
  27. query("http://www.xysrsjzlzpksbmw.gov.cn/webRegister/login/preLogin.aspx?timeID=136&examSort=96&examDate=201712")
  28. console.pause(true);
复制代码


我改一下代码,可以看到输出的内容不一样的,第一个请求正常,第二个网址请求返回500错误
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-22 16:35:02 | 显示全部楼层
iaauto 发表于 2017-11-22 16:24
我改一下代码,可以看到输出的内容不一样的,第一个请求正常,第二个网址请求返回500错误

你服务器上ASP.NET错误,
服务端弹出一大堆C#错误信息,如果这是你自己做的网站,你要到服务端去调试找原因。

目前看你提供的信息,并没有乱码,HTTP客户端都工作正常。
换了inet.http是一样的结果,所以也有可能是你自己提交的参数错误,
你可以用浏览器打开操作,仔细抓包对比,这种东西一个字节不对结果就是错的,自己先排除掉自己的问题。
回复

使用道具 举报

8

主题

45

帖子

276

积分

二级会员

Rank: 3Rank: 3

积分
276
发表于 2017-11-22 16:41:41 | 显示全部楼层
我这边带上cookie测试正常,去掉cookie返回 500 错误。。。

import console;

import inet.whttp;
var http = inet.whttp();
   
var link = "http://www.xysrsjzlzpksbmw.gov.cn/webRegister/login/preLogin.aspx?timeID=136&examSort=96&examDate=201712"
var post = "__VIEWSTATE=%2FwEPDwULLTExNDA4OTEwMzMPFgQeCWV4YW1Mb2dpbgUTd2hldGhlciB0byByZWdpc3Rlch4Cd2oFCDk2MjAxNzEyFgJmD2QWBGYPFgIeCWlubmVyaHRtbAVX572R5LiK5oql5ZCN4oCU4oCU5rKz5Y2X55yB57uf5LiA5b2V55So5YWs5Yqh5ZGY5ZKM5YWs5a6J5py65YWz5oub5b2V5Lq65rCR6K2m5a%2Bf6ICD6K%2BVZAIED2QWAgIBDw8WAh4HVmlzaWJsZWhkZGS35CxYC0xYP9JqiR2UGRyW7Q95OA%3D%3D&__EVENTVALIDATION=%2FwEWAgKvgr7YCAKM54rGBuwdILrU3MhITBeulGnyPd55ZNX3&Button1=+%CE%D2%D2%D1%D4%C4%B6%C1%B2%A2%CD%EA%C8%AB%C0%ED%BD%E2+"
var html,err,errNo = http.post(link, post, "Cookie:ASP.NET_SessionId=zljjuyjeywaca4rxta1a2455")
console.log(html,err,errNo)

console.pause(
true);

回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-22 16:52:16 | 显示全部楼层
土冒 发表于 2017-11-22 16:41
我这边带上cookie测试正常,去掉cookie返回 500 错误。。。

import console;

应当不是cookie的问题,
inet.whttp是隔离会话,不是没有会话,仍然是自动管理会话cookie的,
我刚才抓包试了一下 ASP.NET_SessionId 这些是自动提交了的。

这种问题,每个网站都是不同的人写的,要求的参数都不同,只能自己去仔细抓包对比。不要写错参数,应该都是没问题的。
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-22 16:54:18 | 显示全部楼层
为什么IE浏览器内核跟inet.http能共享会话呢,因为底层用的都是同一个WinInet,
一般用浏览器可以的东西,用inet.http是不会不行的,他们本来就是在同一个会话里。

如果用inet.http提交,服务端也报错,先找自己的原因。
回复

使用道具 举报

8

主题

45

帖子

276

积分

二级会员

Rank: 3Rank: 3

积分
276
发表于 2017-11-22 17:04:40 | 显示全部楼层
Jacen.He 发表于 2017-11-22 16:54
为什么IE浏览器内核跟inet.http能共享会话呢,因为底层用的都是同一个WinInet,
一般用浏览器可以的东西, ...

重写了代码,先get访问一次,同时获取post参数,再post数据时,就不需要cookie参数了...下面的代码测试正常




import console;

import inet.whttp;
var http = inet.whttp();
   
var link = "http://www.xysrsjzlzpksbmw.gov.cn/webRegister/login/preLogin.aspx?timeID=136&examSort=96&examDate=201712"
var html = http.get(link)

var post = inet.url.stringifyParameters({
    __VIEWSTATE = ..string.match(html,
"<@@__VIEWSTATE@>[^>]+<@@value@>[\s='""]+([^'""]+)");
    __EVENTVALIDATION = ..string.match(html,
"<@@__EVENTVALIDATION@>[^>]+<@@value@>[\s='""]+([^'""]+)");
    Button1 =
"我已阅读并完全理解"
})
var html = http.post(link, post)
console.log(html)

console.pause(
true);


回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-22 17:36:38 | 显示全部楼层
土冒 发表于 2017-11-22 17:04
重写了代码,先get访问一次,同时获取post参数,再post数据时,就不需要cookie参数了...下面的代码测试正 ...

很不错,能通过反复的尝试查找到问题,并且也热心助人。

建议大家遇到此类问题,可以抓包比对数据就可以了,例如在浏览器里按F12,或者在 Wireshark 里写上 http.host = "要抓包的域名"抓取数据包,一般我比较愿意提供解决问题的思路,而不是直接给结果(因为我也没那么多时间)。

对于HTML,建议不要写模式匹配,直接用个HTML解析器,例如string.xml,或者 web.mshtml,例如:
import console;
import inet.whttp;

var http = inet.whttp();
   
var link = "http://www.xysrsjzlzpksbmw.gov.cn/webRegister/login/preLogin.aspx?timeID=136&examSort=96&examDate=201712"
var html = http.get(link)

import string.xml;
var htmlDoc = string.xml(html);
var postData = inet.url.stringifyParameters({
    __VIEWSTATE = htmlDoc.queryEle( id =
"__VIEWSTATE" ).value;
    __EVENTVALIDATION = htmlDoc.queryEle( id =
"__EVENTVALIDATION" ).value;
    Button1 =
"我已阅读并完全理解";
})

var html = http.post(link, postData);
console.log( string.xml(html).html[1].body[1].innerText()  ) ;

console.pause();


回复

使用道具 举报

12

主题

57

帖子

423

积分

二级会员

Rank: 3Rank: 3

积分
423
 楼主| 发表于 2017-11-22 18:46:17 | 显示全部楼层
本帖最后由 iaauto 于 2017-11-22 18:47 编辑
Jacen.He 发表于 2017-11-22 17:36
很不错,能通过反复的尝试查找到问题,并且也热心助人。

建议大家遇到此类问题,可以抓包比对数据就可 ...


不好意思是我把两个网址搞混了,我以为只有网页编码不一样,没想post请求参数也不一样,第二网址单独做了一遍可以请求成功了
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-22 18:48:50 | 显示全部楼层
iaauto 发表于 2017-11-22 18:46
不好意思是我把两个网址搞混了,我以为只有网页编码不一样,没想post请求参数也不一样,第二网址单独做 ...
又是同样的错误,还是参数写错了,
aardio编辑器里有括号配对的,仔细看括号位置,
回复

使用道具 举报

12

主题

57

帖子

423

积分

二级会员

Rank: 3Rank: 3

积分
423
 楼主| 发表于 2017-11-22 19:04:47 | 显示全部楼层
Jacen.He 发表于 2017-11-22 18:48
又是同样的错误,还是参数写错了,
aardio编辑器里有括号配对的,仔细看括号位置,

提交了才发现括号位置错了,已经删除错误代码以兔误人
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-22 23:30:01 | 显示全部楼层
iaauto 发表于 2017-11-22 19:04
提交了才发现括号位置错了,已经删除错误代码以兔误人

这倒没有关系,错误代码也可以给他人启发,
这种错误其实在编程中是很常见的,有句话说的是编程中大多数的错误都是低级笔误
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-12-15 22:53 , Processed in 0.078125 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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