返回列表 发帖

[文本处理] [已解决]批处理如何遍历网页文件夹ID并输出至文本?

https://189.ly93.cc/api.php?c=list&shareCode=VVFnmuRviQRj&accessCode=? 是某网盘根文件夹里的数据,只需提取 isFolder 和 fileId 参数的值。
进入子文件夹的方式:当 “isFolder” 为 true 时,表示 fileId 值是子文件夹ID。(格式:https://189.ly93.cc/api.php?c=list&shareCode=VVFnmuRviQRj&accessCode=?&fileId=17位fileId
以下是一个大概的框架,请问要怎么写才能遍历根文件夹及多级子文件夹,以获取其文件夹的fileId,并输出至文本?

@echo off
for /f "delims=" %%a in ('powershell "(irm 'https://189.ly93.cc/api.php?c=list&shareCode=VVFnmuRviQRj&accessCode=?&fileId=').count"') do (
    for /f "eol=F delims=| tokens=1-2" %%b in ('powershell "(irm 'https://189.ly93.cc/api.php?c=list&limit=%%a&shareCode=VVFnmuRviQRj&accessCode=?&fileId=').data | %% {'{0}|{1}' -f $_.isfolder,$_.fileid}"') do (
        echo %%c>>test.txt
    )
)
pauseCOPY
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

搞不懂你为什么要在bat里调用ps?既然有json那直接用js啊?js也有可以get post的com组件可以用啊
你好

TOP

回复 2# jyswjjgdwtdtj


原来用的就是纯bat的方式,要不是for不能支持一行8000多个字符,我根本不想用PS
主要还是完全不会js,一丁点都不会,憋都憋不出一句话。。。
而且我是拿实例学bat的过程中,只是这次刚好遇到的是json罢了。

TOP

回复 3# lonron


    纯bat能干啥?必须调用外部命令啊

attrib.exe
net.exe
arp.exe

等等windows自带的外部命令

还有众多的第三方命令

curl.exe
gwak.exe

那为啥不能调用

powershell.exe
cscript.exe

QQ 20147578

TOP

回复 4# czjt1234


    我觉得吧 与其调用来调用去的 不如直接写ps或者js或者vbs
你好

TOP

回复 4# czjt1234

没毛病,我并不反感用第三方命令,只是相对于js,PS我还能看得懂自己能修改,而且在我看来PS实现一些东西可以更简单点。只是原本我用的for取截取json数据有点笨办法的意思。。。不过也是弃之不用了

TOP

本帖最后由 jyswjjgdwtdtj 于 2023-5-4 20:12 编辑

回复 3# lonron


    盲写一段(没测试过)
var http=new ActiveXObject("msxml2.xmlhttp");
http.Open("GET","https://189.ly93.cc/api.php?c=list&shareCode=3UBZ3ei6NJJz&accessCode=?",False)
http.Send()
var result=eval(http.ResponseText)COPY
大小写不熟悉 可能大小写上会出错
然后就
WScript.Echo(result.data[0].fileId)COPY
输出72373164319523966

#-_-#莫名不能用……估计是json里有啥不兼容jscript的地方吧
还是去用ps好
你好

TOP

回复 7# jyswjjgdwtdtj


    用PS是没问题的,主要是我现在不知道用bat该怎么写才能达到遍历所有子文件夹ID,然后给curl批量下载。获取这个网页数据的原理我都摸索出来了,我要的数据我都有,但就是不会写循环,好痛苦!!!

TOP

回复 8# lonron


    那你为啥要用bat呢?直接用ps不成?( ̄_ ̄|||)
你好

TOP

set dom=createobject("htmlfile")
set http=createobject("msxml2.xmlhttp")
http.open "GET","https://189.ly93.cc/api.php?c=list&shareCode=3UBZ3ei6NJJz&accessCode=?",false
http.send()
dom.parentwindow.execscript("var j="&http.responsetext)
set json=dom.parentwindow.jCOPY
这个json就是js对象 你可以使用它来干啥啥
你好

TOP

本帖最后由 buyiyang 于 2023-5-4 22:19 编辑

给一个循环的例子
@echo off
if "%~1"=="" (
    set "url=https://189.ly93.cc/api.php?c=list&limit=10&shareCode=3UBZ3ei6NJJz&accessCode=?") else (
    set "url=%~1"
)
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('powershell "(irm '%url%').path | %% {'{0}' -f $_.fileName}"') do (
    timeout /t 1 /nobreak
    for /f "eol=0 delims=| tokens=1-3" %%b in ('powershell "(irm '%url%').data | %% {'{0}|{1}|{2}|{3}' -f $_.fileSize,$_.fileId,$_.fileName,$_.isFolder}"') do (
        if "%%e"=="true" (
        set "url=%url%&fileId=%%c"
        call "%~0" "!url!"
        ) else (
        curl
        )
    timeout /t 1 /nobreak
    )
)
pauseCOPY

TOP

当“isFolder”参数为true时表示子文件夹ID、为false时表示文件ID。
我是没理解两种情况你要怎么分开处理?
分别怎么处理要给出来

TOP

回复 12# pd1


    他们的实际应用关系就是红色加粗部分的:

父(子)文件夹ID都是以第一个网页最后面加&fileId=xxxx呈现的。(可以理解为类似本地情况下,进入某个文件夹。)
文件ID就是在要下载的时候要用,在curl后面的下载地址里面呈现的。

TOP

#@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
$global:a='https://189.ly93.cc/api.php?c=list&shareCode=3UBZ3ei6NJJz&accessCode=?'
$global:b='https://189.ly93.cc/3UBZ3ei6NJJz/{0}?accessCode=?'
function test($id){
    irm ($global:a+'&fileId='+$id)|%{
$path=($_.path|%{$_.fileName}) -join '\'
        md $path
$_.data|%{
    if($_.isFolder){test($_.fileId)}else{
curl --ssl-no-revoke -Lo ($path+'\'+$_.fileName) ($global:b -f $_.fileId)
    }
}
    }
}
testCOPY

TOP

#@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
$global:a='https://189.ly93.cc/api.php?c=list&shareCode=VVFnmuRviQRj&accessCode=?'
$global:b='https://189.ly93.cc/VVFnmuRviQRj/{0}?accessCode=?'
function test($id){
    irm ($global:a+'&fileId='+$id)|%{
$_.data|%{
    if($_.isFolder){$_.fileId;test($_.fileId)}
}
    }
}
test|sc test.txtCOPY
1

评分人数

TOP

返回列表