[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

  1. @echo off
  2. for /f "delims=" %%a in ('powershell "(irm 'https://189.ly93.cc/api.php?c=list&shareCode=VVFnmuRviQRj&accessCode=?&fileId=').count"') do (
  3.     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 (
  4.         echo %%c>>test.txt
  5.     )
  6. )
  7. pause
复制代码
1

评分人数

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

回复 39# lonron


    18行改成这样
  1. $z=irm ($y+$id+'&limit='+$limit+'&page='+$i);
复制代码
1

评分人数

TOP

回复 38# idwma


    还是重复的,和刚才那个区别 $i 一个是1 一个是2

TOP

回复 37# lonron
  1. $a=0;
  2. function test($id){
  3.     $limit=100;
  4.     $y='https://189.ly93.cc/file/list?code=QBBzaevemUbm&pwd=4d0d&id=';
  5.     $z=irm ($y+$id+'&limit='+$limit);
  6.     $b=$z.count;
  7.     $c={
  8. $z|%{
  9.     if(!$global:a){($global:a=$_.path.id)}
  10.     sleep 1;
  11.     $_.data|%{if($_.isdir){$_.id;test($_.id)}}
  12. }
  13.     }
  14.     if($b -le 100){&$c}else{
  15. &$c;
  16. for($($i=2;$b+=100);($b-=$limit) -gt 0;++$i){
  17.     sleep 1;
  18.     $z=irm ($y+$id+'&limit='+$lilmit+'&page='+$i);
  19.     &$c
  20. }
  21.     }
  22. }
  23. test
复制代码

TOP

回复 36# idwma


    测试了下第102个开始出现部分重复了,https://189.ly93.cc/file/list?code=QBBzaevemUbm&pwd=4d0d&id=&limit=100 这是用来测试的数据您看下,然后path字段又被他修改回原来了,所以还是用原来的path.id就可以了。

TOP

回复 35# lonron
  1. $a=0;
  2. function test($id){
  3.     $limit=100;
  4.     $y='https://189.ly93.cc/api.php?c=list&code=7n6r22uae6Jn&pwd=r6sf&fileId=';
  5.     $z=irm ($y+$id+'&limit='+$limit);
  6.     $b=$z.count;
  7.     $c={
  8. z|%{
  9.     if(!$global:a){($global:a=$_.path.psobject.properties.name)}
  10.     sleep 1;
  11.     $_.data|%{if($_.isdir){$_.id;test($_.id)}}
  12. }
  13.     }
  14.     if($b -le 100){&$c}else{
  15. &$c;
  16. for($($i=1;$b+=100);($b-=$limit) -gt 0;++$i){
  17.     sleep 1;
  18.     $z=irm ($y+$id+'&limit='+$lilmit+'&page='+$i);
  19.     &$c
  20. }
  21.     }
  22. }
  23. test
复制代码

TOP

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

回复 32# idwma


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

TOP

回复 33# lonron


前面的不用管把原来的改成第7行一样的就行了
全部获取是要全部显示出来吗
$_.path.psobject.name 是id
$_.path.psobject.value 是文件夹名称
path对象类型变了,可以看下帮助https://learn.microsoft.com/zh-c ... bout-pscustomobject
1

评分人数

    • lonron: 哇,就是这样的,非常感谢技术 + 1

TOP

回复 32# idwma


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

TOP

回复 31# lonron
  1. $a=0;
  2. function test($id){
  3. $y='https://189.ly93.cc/api.php?c=list&code=7n6r22uae6Jn&pwd=r6sf&fileId=';
  4. $z=irm ($y+$id);
  5. if($z.count -gt 30){sleep 1;$z=irm ($y+$id+'&limit='+$z.count)}
  6. $z|%{
  7. if(!$global:a){($global:a=$_.path.psobject.properties.name)}
  8. sleep 1;
  9. $_.data|%{if($_.isdir){$_.id;test($_.id)}}
  10. }
  11. }
  12. test
复制代码

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

一二条在同一个页面
重置变量$a
  1. powershell "$a=0;function test($id){$z=irm ('https://189.ly93.cc/api.php?c=list&shareCode=VVFnmuRviQRj&accessCode=?'+'&fileId='+$id);$z='https://189.ly93.cc/api.php?c=list&limit='+$z.count+'&shareCode=VVFnmuRviQRj&accessCode=?'+'&fileId='+$id;sleep 1;irm $z|%%{if(!$global:a){($global:a=$_.path.fileId)}$_.data|%%{if($_.isFolder){sleep -m 500;$_.fileId;test($_.fileId)}}}};test"
复制代码
1

评分人数

TOP

回复 28# idwma


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

TOP

  1. @echo off
  2. for /f "delims=" %%a in ('powershell "function test($id){$z=irm ('https://189.ly93.cc/api.php?c=list&shareCode=VVFnmuRviQRj&accessCode=?'+'&fileId='+$id);$z='https://189.ly93.cc/api.php?c=list&limit='+$z.count+'&shareCode=VVFnmuRviQRj&accessCode=?'+'&fileId='+$id;sleep 1;irm $z|%%{if(!$global:a){($global:a=$_.path.fileId)}$_.data|%%{if($_.isFolder){$_.fileId;sleep -m 500;test($_.fileId)}}}};test"') do (
  3.         echo %%a>>test.txt
  4. )
  5. pause
复制代码

TOP

回复 26# idwma


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

TOP

返回列表