ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: wcymiss

[原创] 不懂html也来学网抓(xmlhttp/winhttp+fiddler)

    [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-18 15:14 | 显示全部楼层
本帖已被收录到知识树中,索引项:网页交互
onthetrip 发表于 2014-11-17 23:21
我查看了收件箱,没有发送成功debug.print 的数据:
手工发送邮件成功的话,会有一个New Page 1的新窗口,提示 ...


发邮件肯定要先登录吧。但是你的代码中我没有找到相关登录的代码,也没有找到标识发件人身份的变量。(我的示例上传代码,标识发件人身份的是hash码。)

你最好清除浏览器缓存、cookie、历史记录后抓个登录并发送带附件的邮件的包。然后把这个包作为帖子附件发上来。(fiddler菜单里,File-Save即可保存抓包为文件)

另外,我看你代码里发送的内容比抓包里少了些。测试的时候,先模拟完全了,成功之后再考虑精简。





TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-18 15:30 | 显示全部楼层
renahu 发表于 2014-11-18 10:47
吴老师:
58同城这个例子中,共有4个JS文件,其中两个js文件地址是通过搜索函数名getm32str,getm16str, ...

getm32str函数所在js文件名:
https: //passport.58.com/js/v6/source/828ef34c77a2cbed693ba874ce570dfe.js?version=0.0.2
这个文件,里面有一串字母数字混合的字符串,我担心它会变动,所以搜索“828ef34c77a2cbed693ba874ce570dfe”,结果在下面这个js文件的responsetext里找到了它:https: //passport.58.com/static/ppt/js/5_1/comm_js/boot_passport_version.js


js文件:https: //passport.58.com/rsa/ppt_security.js
这个js文件的代码包含了JQuery的语法,所以必须下载JQuery文件,即:https: //passport.58.com/static/js/5_1/jquery1.3.2.js

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-20 11:24 | 显示全部楼层
xfyanmeng 发表于 2014-11-19 17:38
老师好,想请教一下,json数组如果key值不确定怎么处理?我要程序循环处理!
比如你这个第一次循环是 {" ...

检查下你系统文件夹里有没有这个文件:
TLBINF32.DLL
没有的话网上下载一个注册下。

然后测试下面的代码。
  1. Sub Test()
  2.     Const strJSON As String = "[{""name1"":""甲儿"",""age1"":10},{""name2"":""甲女"",""age2"":7}]"
  3.     Dim objJSON As Object
  4.     Dim Child
  5.     Dim i As Long, j As Long
  6.     Dim objTLI As Object
  7.     Dim objMem As Object
  8.    
  9.     Set objTLI = CreateObject("tli.TLIApplication")
  10.    
  11.     With CreateObject("msscriptcontrol.scriptcontrol")
  12.         .Language = "JavaScript"
  13.         .AddCode "var mydata =" & strJSON
  14.         Set objJSON = .CodeObject
  15.     End With
  16.    
  17.     Cells.Clear
  18.     For Each Child In CallByName(objJSON, "mydata", VbGet)
  19.         i = i + 1
  20.         j = 0
  21.         For Each objMem In objTLI.InterfaceInfoFromObject(Child).Members
  22.             j = j + 1
  23.             Cells(i, j) = CallByName(Child, objMem.Name, VbGet)
  24.         Next
  25.     Next
  26.    
  27.     Set Child = Nothing
  28.     Set objJSON = Nothing
  29.     Set objMem = Nothing
  30.     Set objTLI = Nothing
  31. End Sub
复制代码
其实我很少这样取处理json数据。一般我都是用js语句处理好后再拿到vba里调用。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-21 23:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 wcymiss 于 2014-11-24 12:24 编辑
VBA万岁 发表于 2014-11-21 08:53
老师误会了,520楼代码本来就是想实现将字符转换为unicode码功能的。


我快要被你气死了。
实在忍不住了。本来以为这些东西百度下就能查到的,结果你在这里纠结了好多天。
大概的讲讲编码方面的知识吧。

编码对于计算机,相当于语言对于我们人类。中国有中文,英国有英语。

ANSI编码:这相当于“地方话”的概念,具体在每个区域是不同的。在中国大陆,具体使用的是GB2312,GBK是GB2312的扩展。在中国台湾,使用的Big5。这些编码都统称为ANSI编码。
ANSI编码在vba中使用ascchr进行转换。英文字母标点和数字是1个字节(asc函数结果在0-255之间),而汉字是两个字节且高位为1(asc函数结果是负数)。

因为ANSI编码地域性的缺陷,后来出现了UNICODE编码。这种编码囊括了所有地区的文字。
UNICODE编码在vba中使用ascwchrw进行转换。所有字符都占两个字节。英文字母标点和数字的编码值小于255,所以它们的高位字节值是0。

正因为UNICODE编码的所有字符都占两个字节,造成了以英文为主要文字进行网络传输时资源浪费了一半。这样由UNICODE编码衍生出的UTF-8编码就诞生了。它的英文和数字占1个字节,而汉字等其他字符占3个字节。UTF-8编码是网络传输使用的主要编码。

向服务器发送请求时,汉字及一些特殊字符无法存在于URL中。于是,它们需要按某种编码规则进行编码后(大部分是UTF-8,一些中文网站也会使用GB2312/GBK),按照URL的规则加上百分号,然后才能进行发送。javascript提供了编码函数encodeURI
encodeURIComponent,解码函数decodeURIdecodeURIComponent,它们的编码规则都是UTF-8。

%uxxxx和\uxxxx样的字符,是存在于网页中的用UNICODE规则编码的字符。现在大多用\uxxxx而比较少用%uxxxx。javascript提供了函数escapeunescape来进行普通字符和%uxxxx字符的相互转换,对于\uxxxx字符,可以直接被javascript脚本识别读取。在vba里则可以调用javascript的eval函数将其转为普通文本。

以上所说在细节上可能不完全准确。请有兴趣者自行百度以完善相关知识。

看了以上这些,你知道你错在哪了吗?你还会说我是误会吗?

不要再纠结字符编码了!搜索也不要仅限于论坛。相比整个英特网,论坛的资源实在是太少!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-23 20:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
onthetrip 发表于 2014-11-23 16:39
吴姐,您给我的上传文件代码很成功,太厉害了,不佩服都不行.
另外有几个问题我没想明白,望能释疑:
(1)我抓 ...

1、boundary是一串随机字符串,“-”的个数和字母个数内容都可以随机。
2、抓包的内容可以看到汉字是gb2312编码的字符,所以用strconv函数进行编码。
3、用ado.stream进行转码。编码为gb2312。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-24 20:46 | 显示全部楼层
本帖最后由 wcymiss 于 2014-11-24 20:52 编辑
onthetrip 发表于 2014-11-24 19:57
吴姐,按照您的提示,我已经成功将responsetext的乱码问题解决了,谢谢.
但还有几个Adodb.stream的转码问题 ...


(1)、(2)、晕的。那是我写错了。StrToUTF8Byte函数里面的应该是.Charset = "UTF-8" 。我已经请版主帮我修改了。不过这个网站上传文件用UTF-8或是GB2312都能成功的。

(3)、是的。也有各种编码之分。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-25 10:40 | 显示全部楼层
onthetrip 发表于 2014-11-24 21:12
谢谢.
不好意思,还有两个问题:
(1)charset的位置是有讲究吗?我看strtobyte函数的charset在write方法之前 ...

       编码是针对文本而言的。因为计算机内部只能储存二进制数据,所以文本要储存在计算机里时,需要按照一个指定的规则转换为二进制数据。这个“指定的规则”就是编码。
       比如,“我”这个汉字,假如按照GB2312编码转为二进制数据,第一个字节是206,第二个字节是210;假如按照Unicode编码,第一个字节是98,第二个字节是17。

所以,用ado的stream对象在文本与二进制数据的转换中,charset需要在读出文本(ReadText)或写入文本(WriteText)之前设置,否则stream会按照默认的Unicode编码来读写文本。

stream对象里,
        Type必须设置在数据读写(Write、Read、WriteText、ReadText)之前,用于确定读写数据的类型;
       Charset必须设置在文本读写(WriteText、ReadText)之前,用于确定stream中文本的编码类型;
        Position必须设置在读出数据(Read、ReadText)之前,以确定读出数据的起始位置。
       Mode必须设置在流对象打开(Open)之前,以确定流文件的读写权限。在这些处理文本的自定义函数的stream里,默认值是adModeUnknown,所以这句不设置也可以的。
stream对象的更详细的用法,可以参考access帮助里的ado对象的帮助文档。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-26 08:54 | 显示全部楼层
onthetrip 发表于 2014-11-25 20:38
吴姐,很感谢您.您的讲解使我茅塞顿开啊,之前我看了无数遍的stream的帮助,怎么也没看懂.现在我的理解是这样 ...

StrConv的转码规则是系统默认的编码(ANSI),对于中国大陆地区,一般是GB*编码(GB2312、GBK等等),对于台湾地区,则是BIG5编码。这个可以在strconv函数的第三参数里设置。

在VBA里,文本是按照Unicode的编码形式储存的,也就是说,直接把文本赋值给Byte数组的话,相当于StrToByte(s,"Unicode")函数的效果(需去除Bom头)。

所以,对于VBA代码:C = StrConv(A, B)  ,对于不同的变量类型,它会有以下几种不同的效果:
strconv.png

由上表看出,StrConv函数,第二参数是vbFromUnicode时,是用来把文本按GB2312编码转换为二进制数据的,而是vbUnicode时,是用来把二进制数据按GB2312转换为文本的。如果参数类型不符合这样的要求,系统就会自动再按Unicode编码进行转换。这样就很有可能会达不到预期效果。

stream对象将文本按照Unicode、UTF-8编码转换为二进制数据时,会在前面加上2-3个字节的Bom头。为了让StrToByte函数与StrConv函数的结果保持一致,修改自定义函数StrToByte如下:

  1. Function StrToByte(strText As String, strCharset As String, Optional Bom As Boolean = False)
  2.     With CreateObject("adodb.stream")
  3.         .Type = 2 'adTypeText
  4.         .Charset = strCharset
  5.         .Open
  6.         .Writetext strText
  7.         .Position = 0
  8.         .Type = 1 'adTypeBinary
  9.         If Not Bom Then
  10.             If LCase(strCharset) = "unicode" Then
  11.                 .Position = 2
  12.             ElseIf LCase(strCharset) = "utf-8" Then
  13.                 .Position = 3
  14.             End If
  15.         End If
  16.         StrToByte = .Read
  17.     End With
  18. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-26 20:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
renahu 发表于 2014-11-26 16:56
我附件里面,已经加入了验证码,还是不行,不知道是不是cookie中会不会有动态参数,可我看了,感觉都不是

SendData里少了两个参数:
&ctl00%24ContentPlaceHolder1%24ImageButton1.x=117'数字在某个范围里可以任意
&ctl00%24ContentPlaceHolder1%24ImageButton1.y=16‘数字在某个范围里可以任意
这两个参数是鼠标点击“登录”按钮时坐标。

另外,xmlhttp是不支持setRequest "cookie"和"referer"的。

还有,测试的时候参数不要删减,成功之后再考虑删减参数。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-26 21:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 wcymiss 于 2014-11-26 21:54 编辑
renahu 发表于 2014-11-26 21:03
加上这两个参数还是不行,换成WinHttp也不行,看来这个登陆有些难


可以登录的,只是你对登录的判定有问题。最后的responsetext里包含“欢迎您”字符串的话即为登录。

Post成功后的这个网页是一个302重定向的网页,你用了xmlhttp对象,会自动重定向到新的网页,所以你用getallresponseheaders是无法获取post那个网页的cookie的。用了xmlhttp就不要进行任何设置或读取cookie的操作。

如果要用winhttp,那就不能直接用insert(url)的方法获取图片,而要用winhttp发送获取图片的请求,然后将responsebody转为本地图片文件后插入工作表。

验证码图片的网页的cookie必须与你Post网页的cookie保持一致。insert url可以共享xmlhttp的cookie,所以你用xmlhttp对象登录时,图片可以insert url来获取;用winhttp时,insert url的方法无法与winhttp共享cookie,所以这时要在同一个winhttp对象里获取图片才能传送正确的验证码。

如果你要获取post那个网页的cookie,必须使用winhttp对象然后getallresponseheaders,且winhttp的重定向设置option(6)=false
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-3-29 19:00 , Processed in 0.068975 second(s), 12 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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