返回列表 发帖

[文本处理] [已解决]批处理如何遍历网页文件夹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

回复 2# jyswjjgdwtdtj


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

TOP

回复 4# czjt1234

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

TOP

回复 7# jyswjjgdwtdtj


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

TOP

回复 12# pd1


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

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

TOP

回复 15# idwma


    是我要的效果,非常感谢,另外问下,是否有纯P的方法?

TOP

回复 18# idwma


    万分感谢,终于解决了,纠结了我好几天了 T_T,我光改问题说明想让大家看清楚,就改了好几次。

TOP

回复 21# czjt1234


    隔行如隔山啊,同样是脚本语言,对PS和P实在很吃力,有的问题用pascal就容易多了

TOP

本帖最后由 lonron 于 2023-5-8 22:11 编辑

回复 18# idwma


    老师,不好意思,刚刚认真测试代码后发现有三个问题被我忽略了。还恳请您再次帮忙修改下,谢谢:

1、是需要在遍历的开始就先输出一行根目录ID。(根目录ID在path字段里可以获取,但是子文件夹path字段里的feliId是包括自身以及所有上级目录ID数据的,就是目录树。)
2、是这个页面有一个条数限制,默认是30条数据。(格式是在 c=list 后面加上 &limit= 条数,count 字段是当前目录的文件和文件夹总数。)
3、是这个网站好像对抓取数据有做过载保护,所以需要每次获取一条ID后延迟一秒。(测试过一秒一条基本安全没出现过报错。)

TOP

回复 24# idwma


    这个limit能获取实际的数吗?

TOP

回复 26# idwma


    条数这个我确实一开始也这么想的,不过我本来就是拿实例学习的,如果老师您方便,还希望您能帮我修改下,真的非常感谢!

TOP

回复 28# idwma


    非常感谢!!!最后有一个小小的疑问,就是单独把ps这段放入控制台的时候,我发现第一条和第二条是同时出现的,其他都是按固定的延迟显示出来,还有就是抓取ID中途我ctrl+c终止,重新运行这段代码时,根目录的ID不会读取了这是为什么?

TOP

本帖最后由 lonron 于 2023-5-18 09:44 编辑

回复 30# idwma

https://189.ly93.cc/api.php?c=list&code=7n6r22uae6Jn&pwd=r6sf
   
老师,麻烦您再帮我看下,由于这个网页的api更新了,path字段里现在变成没有fileid和filename字段了,而是直接用实际id配对实际name这种格式,这种情况要怎么获取根id呢?另外,path里的(子)文件夹名称又要怎样写才能全部获取出来?
powershell "$a=0;function test($id){$z=irm ('https://189.ly93.cc/api.php?c=list&code=7n6r22uae6Jn&pwd=r6sf'+'&id='+$id);$z='https://189.ly93.cc/api.php?c=list&limit='+$z.count+'&code=7n6r22uae6Jn&pwd=r6sf'+'&id='+$id;sleep 1;irm $z|%%{if(!$global:a){($global:a=$_.path.fileId)}$_.data|%%{if($_.isdir){sleep -m 500;$_.id;test($_.id)}}}};test"

TOP

回复 32# idwma


    有点看懵了,似乎是比原来代码多加了一个前置判断总条数是否大于30?

TOP

本帖最后由 lonron 于 2023-5-20 12:35 编辑

回复 32# idwma


    老师,网站所有者跟我说,直接用count赋值给limit的这种方式不可取,会让他的服务器有一定的风险,可能会存在瞬时post或get过多数据的情况。所以他建议我limit应该固定在100以内,然后用&page=的方式来分流获取数据。这貌似涉及到循环了,还请您再帮忙修改下源代码,实在不好意思一直劳烦您,真的非常感谢!

TOP

返回列表