Board logo

标题: [问题求助] [已解决]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获取网页源代码
  1. dim ie,url,MyStream
  2. url="http://www.bathome.net"
  3. if url&"a"<>"a" then
  4. Set ie=WScript.CreateObject("InternetExplorer.Application")
  5. ie.visible=true
  6. ie.navigate url
  7. msgbox ""
  8. Do
  9. Wscript.Sleep 2000
  10. Loop Until ie.ReadyState=4
  11. Set MyStream=CreateObject("Adodb.Stream")
  12. MyStream.Type = 1
  13. MyStream.Open
  14. MyStream.Write ie.document.documentElement.outerHTML
  15. MyStream.SaveToFile "C:\xxx.html"
  16. Msgbox "保存成功"
  17. IE.Quit
  18. 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
&notify_email=xxxx@xxx.com
&notify_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;虽然我绝对不会用这种方式读页面内容
获取加密链接
  1. Set ie = CreateObject("InternetExplorer.Application")
  2. ie.Visible = true
  3. ie.navigate "https://privnote.com/#dont_ask"
  4. On Error Resume Next
  5. Set btn=ie.Document.getElementByID("encrypt_note")
  6. Do while Err
  7.     On Error Resume Next
  8.     Set btn=ie.Document.getElementByID("encrypt_note")
  9.     WSH.Sleep 500
  10. Loop
  11. ie.Document.getElementByID("note_raw").value="需加密的内容"
  12. btn.click()
  13. Do while ie.Document.getElementByID("note_link_input").value = ""
  14.     WSH.Sleep 500
  15. Loop
  16. msgbox ie.Document.getElementByID("note_link_input").value
  17. ie.quit
复制代码
获取解密内容
  1. Set ie = CreateObject("InternetExplorer.Application")
  2. ie.Visible = true
  3. ie.navigate "https://privnote.com/3OZyRIdB#eCqP3Bxu5"
  4. On Error Resume Next
  5. Set textarea=ie.Document.getElementByID("note_contents")
  6. Do while Err
  7.     On Error Resume Next
  8.     Set textarea=ie.Document.getElementByID("note_contents")
  9.     WSH.Sleep 500
  10. Loop
  11. Do while textarea.value = ""
  12.     WSH.Sleep 500
  13. Loop
  14. msgbox textarea.value
  15. 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://www.bathome.net/) Powered by Discuz! 7.2