标题: [问题求助] [已解决]vbs如何获取网页元素内容 [打印本页]
作者: WindCat 时间: 2017-5-23 03:03 标题: [已解决]vbs如何获取网页元素内容
本帖最后由 WindCat 于 2017-5-24 21:17 编辑
原标题:请问该如何用vbs获取或抓取一个会跳转且内容为css或可能是js加解密的网页内容信息?
https://privnote.com/
随手找网站练习抓取内容就遇到了个这么个难题
可以点击显示选项---勾选不要在显示和销毁笔记时确认 (经典 Privnote 行为)。
来使得直接显示内容页面(只是少了个确认按钮)
-----------------------------
在最初发这个帖子之前,我只是一个会拿着
http://www.bathome.net/thread-44171-1-1.html中的Set html = CreateObject("microsoft.xmlhttp")套用采集网页信息的菜鸡
然后就正常的遇到了会跳转和需要cookie的页面了
于是就百度找了一堆方案都是用CreateObject("InternetExplorer.Application") 的
然而,win10下用这个会报错,百度没找到,G+都是英文,我英语太烂没找到解决办法。
于是我就找了下面一些文章看...没什么收获.
最后意外发现用管理员权限启用vbs就能正常工作了
于是就开始学如何定位元素
然后依照
http://www.bathome.net/viewthread.php?tid=36406&from=favorites
的方法解决了问题(完工代码见9#http://www.bathome.net/redirect. ... id=44245&pid=199734)
最后感谢
523066680的努力(虽然只是一时兴起,不过还是对我起到了提醒作用,让我想到去看看IE下是否真的有加载一些东西
-----------------------------
找了几篇资料...从十二点查到下午5点...今天就到这里了.
还请各位朋友看看有什么收获,然后来交流一下.
使用正确版本的XMLHTTP
http://demon.tw/programming/the-right-version-of-xmlhttp.html
VBS发送带Cookie的HTTP请求
http://demon.tw/programming/vbs-http-cookie.html
Msxml2.XMLHTTP Msxml2.ServerXMLHTTP与缓存
http://demon.tw/programming/msxm ... rxmlhttp-cache.html
再谈Msxml2.XMLHTTP、Msxml2.ServerXMLHTTP与缓存
http://demon.tw/programming/msxm ... tp-cache-again.html
VBS伪造HTTP-REFERER
http://demon.tw/programming/vbs-http-referer.html
VBS伪造HTTP-REFERER(二)
http://demon.tw/programming/vbs-http-referer-two.html
vbs 解析html文档的方法(htmlfile)
http://www.codeweblog.com/vbs-%E ... %E6%B3%95-htmlfile/
作者: codegay 时间: 2017-5-23 18:38
不要贴这个j851的网站的链接。那个是一个垃圾网站。上面的内容全是盗抓别人的。
你需要学一下抓包看http是怎么工作的。
http://www.cnblogs.com/dudu837/p/4323040.html
作者: WindCat 时间: 2017-5-24 00:38
回复 2# codegay
已利用搜索引擎找到源站并更替链接...
请问下下面这个哪里错了。。。
(如何用)InternetExplorer.Application获取网页源代码- dim ie,url,MyStream
- url="http://www.bathome.net"
- if url&"a"<>"a" then
- Set ie=WScript.CreateObject("InternetExplorer.Application")
- ie.visible=true
- ie.navigate url
- msgbox ""
- Do
- Wscript.Sleep 2000
- Loop Until ie.ReadyState=4
- Set MyStream=CreateObject("Adodb.Stream")
- MyStream.Type = 1
- MyStream.Open
- MyStream.Write ie.document.documentElement.outerHTML
- MyStream.SaveToFile "C:\xxx.html"
- Msgbox "保存成功"
- IE.Quit
- End if
复制代码
作者: WindCat 时间: 2017-5-24 18:15
@CrLf
那个...我并没有解决自己的问题...执行会遇到如下错误
---------------------------
Windows Script Host
---------------------------
脚本: G:\Datas\Source_code\vbs登录网页\test-副本.vbs
行: 14
字符: 2
错误: 参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。
代码: 800A0BB9
源: ADODB.Stream
---------------------------
确定
---------------------------
作者: 523066680 时间: 2017-5-24 19:13
本帖最后由 523066680 于 2017-5-24 20:45 编辑
POST /legacy/
&data=U2FsdGVkX184KVBoLvcq2B%2FIhRIXbzDEyjOlkQ6Z%2FFk%3D%0A
&has_manual_pass=false
&duration_hours=0
&dont_ask=true
&data_type=T
¬ify_email=xxxx@xxx.com
¬ify_ref=
dont_ask 就是那个选项了
字符串加密的部分还在探索,我的原文是 abc,在提交的列表中变成:
U2FsdGVkX1%2Fcj0LhMKHyjkidrfBqLybT5BUBPhvLDks%3D%0A
转字符:
U2FsdGVkX1/cj0LhMKHyjkidrfBqLybT5BUBPhvLDks=
base64解码:
Salted__BᰡHj/&Ӥ>ˎK
Salted_ 开头好像是 OpenSSL 的风格?
看 js 疑是 AES 加密?
密钥好像是随机生成
common.js:
var common=function()
{
var auto_pass_length=9;
var auto_pass_chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
var encrypt=function(data,password)
{
return GibberishAES.enc(data,password)
}
var decrypt=function(data,password)
{
return GibberishAES.dec(data,password)
}
var make_password=function()
{
var length=auto_pass_length;
var chars=auto_pass_chars;
var str="";
for(var i=0; i<length; i++)
{
pos=Math.floor(Math.random()*chars.length);
str+=chars.charAt(pos);
}
return str;
}
作者: WindCat 时间: 2017-5-24 20:06
本帖最后由 WindCat 于 2017-5-24 20:07 编辑
回复 5# 523066680
先停一停,文本框里解密内容为test时,定位输入栏元素,内容为U2FsdGVkX18QQ6eYCCJ+4YGn5oA9wrQgebRu+1XnrIM=,改变后会直接如明文覆盖应用到页面
但是,我发现了一个选择文本按钮,能不能用vbs调用WScript.CreateObject("InternetExplorer.Application") 后台打开IE窗体然后点击选择文本按钮然后复制选择内容?
或者说给按钮元素增加一个复制到剪贴板的动作
作者: codegay 时间: 2017-5-24 20:23
python 有已经做好的库。
https://github.com/intelligentguy/pyPrivnote
作者: 523066680 时间: 2017-5-24 20:45
本帖最后由 523066680 于 2017-5-24 20:46 编辑
啊哈,加密部分用openssl穷举测试,试出来了
如果提交后得到的地址是:
https://privnote.com/jdMjyawp#n03p9QITx
则 n03p9QITx 是解密密钥,加密方式是 aes256。
加密过程是:
原文 -> aes256 + 随机密钥 -> 转 base64 -> 特殊字符转URL编码
随机密钥就在 生成的链接地址的末尾部分(#字符后面)
作者: WindCat 时间: 2017-5-24 20:52
本帖最后由 pcl_test 于 2017-5-25 00:28 编辑
回复 8# 523066680
辛苦了;w;虽然我绝对不会用这种方式读页面内容
获取加密链接- Set ie = CreateObject("InternetExplorer.Application")
- ie.Visible = true
- ie.navigate "https://privnote.com/#dont_ask"
-
- On Error Resume Next
- Set btn=ie.Document.getElementByID("encrypt_note")
- Do while Err
- On Error Resume Next
- Set btn=ie.Document.getElementByID("encrypt_note")
- WSH.Sleep 500
- Loop
-
- ie.Document.getElementByID("note_raw").value="需加密的内容"
- btn.click()
-
- Do while ie.Document.getElementByID("note_link_input").value = ""
- WSH.Sleep 500
- Loop
- msgbox ie.Document.getElementByID("note_link_input").value
- ie.quit
复制代码
获取解密内容- Set ie = CreateObject("InternetExplorer.Application")
- ie.Visible = true
- ie.navigate "https://privnote.com/3OZyRIdB#eCqP3Bxu5"
-
- On Error Resume Next
- Set textarea=ie.Document.getElementByID("note_contents")
- Do while Err
- On Error Resume Next
- Set textarea=ie.Document.getElementByID("note_contents")
- WSH.Sleep 500
- Loop
-
- Do while textarea.value = ""
- WSH.Sleep 500
- Loop
-
- msgbox textarea.value
- ie.quit
复制代码
直接这样就OK了(不知道为什么Chrome浏览器访问时元素内容是加密后的,而IE是直接的解密内容...害我折腾一个下午)
作者: 523066680 时间: 2017-5-24 20:59
本帖最后由 523066680 于 2017-5-24 21:06 编辑
回复 9# WindCat
你目标是获取提交后链接内的内容,我前面没看到你的需求是要做post 部分还是 get 部分。
只是凭兴趣在探索密文建立的方式,纯属自娱自乐。
作者: yu2n 时间: 2017-5-25 11:10
回复 10# 523066680
樓主只要結果,不管速度。
Chrome 調試門檻高,IE接口簡單粗暴。
1秒與4秒,這中間3秒,嫌麻煩,樓主大可不要。
作者: 523066680 时间: 2017-5-25 11:21
本帖最后由 523066680 于 2017-5-25 12:05 编辑
回复 11# yu2n
网络方面一直是我的短板,这个问题是很好的锻炼机会。
作者: 523066680 时间: 2017-5-25 12:00
本帖最后由 523066680 于 2017-5-25 12:01 编辑
Perl 获取保存7天的笔记内容,示例。几个模块交叉使用,感觉有些凌乱~
use MIME::Base64;
use Crypt::CBC;
use LWP::UserAgent;
my $link = "https://privnote.com/tfXKuLB0#OmbQnPRgb";
$link=~/\/(\w+)#(\w+)/;
my ($noteid, $key) = ($1, $2);
my $req = HTTP::Request->new(GET => "https://privnote.com/hidden#$key");
$req->header('Cookie' => "manual_locale=zh_CN;note_id=$noteid");
my $ua = LWP::UserAgent->new();
my $res = $ua->request( $req );
my $content = $res->content();
my $aes = Crypt::CBC->new(
-key => $key,
-cipher => "Crypt::OpenSSL::AES"
);
if ($content =~ /textarea[^>]+>([^<]+)</s)
{
$cipher = $1;
$cipher =~s/\r?\n//g;
print $aes->decrypt( decode_base64( $cipher ) );
}
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |