在折腾eve online转存国内加速的过程中,碰到个需求,即从动态网站获取最新的下载链接。

需求

目标网站:

https://www.eveonline.com/download

示例链接:

https://binaries.eveonline.com/EveLauncher-1669171.exe

需求是在Windows上编写bat脚本,能从https://www.eveonline.com/download网站获取https://binaries.eveonline.com/EveLauncher-1669171.exe下载链接。

最开始使用wget尝试下载网站所有文件,原以为链接是静态的。结果在wget下载的所有网站文件内都没搜到下载链接。
于是开始缩小索引范围。
搜索binaries.eveonline.com/EveLauncher,在main.f7d7a958.chunk.js文件中找到了线索:

launcherVersionDownloadUrl="https://binaries.eveonline.com/EveLauncher-"

因此确定了链接是动态生成的。
虽然可以用浏览器的CTRL+S来保存渲染完成的HTML文件,但这样就不好写脚本了。

phantomjs

写教程时不可复现,仅供参考


本来是可以用的,但写教程的时候又不可用了,懒得分析原因,建议使用下面的http get请求方法。

最开始,通过谷歌搜索,我查到了一个工具:PhantomJS
PhantomJS作为“headless browser”,可以通过命令保存网页JS渲染完成后的浏览器界面到一个HTML文件中。
虽然PhantomJS已经停止更新了。但还可以用:

choco install phantomjs

来安装。
测试下效果:
首先创建save_page.js文件来设置保存的方案。

var system = require('system');
var page = require('webpage').create();

page.open(system.args[1], function()
{
    console.log(page.content);
    phantom.exit();
});

接着在save_page.js所在目录执行:

phantomjs save_page.js https://www.eveonline.com/download > eveonline.html

获得的html文件虽然不能用浏览器打开,但可以用编辑器(vim,nano一类)打开,生成的速度比较慢,要等段时间。

接下来就可以用正则啥的匹配下载链接了。

HTTP GET

虽然我上面那个方法能实现需求,简单粗暴,但实在是太浪费系统资源了。虽然好用
我在群里问了下后,UCW大佬帮我找到了网站提供版本的js文件。

https://launcher.eveonline.com/launcherVersions.json

使用HTTP GET请求后,得到

{
    "win": 1669171,
    "mac": 1669171,
    "linux": 1548102
}

即实时最新的版本号。
在Windows下可以用powershell的Invoke-WebRequest组件来发送GET请求。
则可以用powershell脚本来获取json格式的版本号了。

Invoke-WebRequest -Method Get  "https://launcher.eveonline.com/launcherVersions.json" -OutFile "C:\eveonline\new_launcherVersions.txt"

再通过分离,匹配,管道传输参数,则可以生成最新下载文件的完整下载地址了。
成功高大上的完成了“Windows脚本从动态网站获取最新的下载链接”需求。


参考:
How to get WGET to download exact same web page html as browser
Invoke-WebRequest

最后修改:2020 年 02 月 21 日
如果觉得我的文章对你有用,请随意赞赏