注册 登录
发贴工具
查看: 404|回复: 0
打印 上一主题 下一主题

[24小时收录超级好的网站] AiWork软件下载蓝奏云OCR文件到文件夹

[复制链接]

2256

主题

2304

帖子

1万

积分

积分
13740
跳转到指定楼层
楼主



AiWork软件下载蓝奏云OCR文件到文件夹 群发软件发帖工具 AiWork软件下载蓝奏云OCR文件到文件夹 群发软件发帖工具 AiWork软件下载蓝奏云OCR文件到文件夹 群发软件发帖工具 AiWork软件下载蓝奏云OCR文件到文件夹 群发软件发帖工具

  1. /*
  2.    欢迎使用AiWork安卓自动化IDE

  3. */

  4. // 定义主函数
  5. function downloadLanzouFile(url, saveFilePath, maxRetries) {
  6.     // 设置默认参数
  7.     if (maxRetries === undefined) {
  8.         maxRetries = 5;  // 增加默认重试次数
  9.     }
  10.    
  11.     var http = new okHttp();
  12.     var domains = ["wwt.lanzouu.com", "wwt.lanzoui.com", "wwt.lanzoux.com"];  // 备用域名
  13.     var currentDomain = domains[0];
  14.     var startTime = new Date().getTime();
  15.    
  16.     function sleep(ms) {
  17.         java.lang.Thread.sleep(ms);
  18.     }
  19.    
  20.     // 指数退避算法计算等待时间
  21.     function getWaitTime(retryCount) {
  22.         return Math.min(2000 * Math.pow(1.5, retryCount), 10000);  // 最长等待10秒
  23.     }
  24.    
  25.     function formatTime(ms) {
  26.         if (ms < 1000) return ms + "毫秒";
  27.         return Math.floor(ms / 1000) + "秒";
  28.     }
  29.    
  30.     for (var retryCount = 0; retryCount < maxRetries; retryCount++) {
  31.         if (retryCount > 0) {
  32.             var waitTime = getWaitTime(retryCount);
  33.             printl("第" + (retryCount + 1) + "次尝试下载...(等待" + formatTime(waitTime) + ")");
  34.             
  35.             // 每次重试时尝试切换域名
  36.             currentDomain = domains[retryCount % domains.length];
  37.             printl("切换到域名: " + currentDomain);
  38.             
  39.             sleep(waitTime);
  40.         }
  41.         
  42.         try {
  43.             printl("开始下载过程...");
  44.             
  45.             // 获取初始页面
  46.             printl("正在获取初始页面...");
  47.             var processedUrl = url.replace(/wwt\.lanzo[a-z]{1,2}\.com/, currentDomain);
  48.             var r = http.get(processedUrl);
  49.             
  50.             // 检查是否包含错误信息
  51.             if (r.includes("文件不存在") || r.includes("已被删除")) {
  52.                 throw "文件不存在或已被删除";
  53.             }
  54.             
  55.             // 获取跳转路径
  56.             var regex = /\/fn\?[\w-]+/g;
  57.             var fnPathMatch = r.match(regex);
  58.             if (!fnPathMatch) {
  59.                 throw "无法获取跳转路径";
  60.             }
  61.             var fnPath = fnPathMatch[0];
  62.             printl("获取跳转路径:", fnPath);

  63.             // 获取二级页面
  64.             var r2 = http.get("https://" + currentDomain + fnPath);
  65.             printl("已获取二级页面");
  66.             
  67.             // 检查二级页面是否有效
  68.             if (r2.includes("文件不存在") || r2.includes("已被删除")) {
  69.                 throw "文件不存在或已被删除";
  70.             }

  71.             // 使用更精确的正则匹配sign
  72.             var signMatch = r2.match(/var wp_sign = '([^']+)';/);
  73.             if (!signMatch) {
  74.                 throw "无法提取签名参数";
  75.             }
  76.             var sign = signMatch[1];
  77.             printl("获取签名:", sign);

  78.             // 匹配ajax请求路径
  79.             var ajaxPathMatch = r2.match(/url : '(\/ajaxm\.php\?file=\d+)'/);
  80.             if (!ajaxPathMatch) {
  81.                 throw "无法提取ajax路径";
  82.             }
  83.             var ajaxUrl = "https://" + currentDomain + ajaxPathMatch[1];
  84.             printl("构造请求地址:", ajaxUrl);

  85.             // 配置请求头
  86.             http.clearHeader();
  87.             http.setHeader('Referer', "https://" + currentDomain + fnPath);
  88.             http.setHeader('User-Agent', "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36");
  89.             http.setHeader('X-Requested-With', 'XMLHttpRequest');
  90.             http.setHeader('Origin', "https://" + currentDomain);
  91.             http.setHeader('Content-Type', 'application/x-www-form-urlencoded');
  92.             http.setHeader('Accept', 'application/json, text/javascript, */*; q=0.01');
  93.             http.setHeader('Accept-Language', 'zh-CN,zh;q=0.9,en;q=0.8');
  94.             http.setHeader('Connection', 'keep-alive');
  95.             http.setHeader('Cache-Control', 'no-cache');
  96.             http.setHeader('Pragma', 'no-cache');

  97.             // 构造POST数据
  98.             var data = new map();
  99.             data.add('action', 'downprocess');
  100.             data.add('signs', sign.substring(0, 5));
  101.             data.add('sign', sign);
  102.             data.add('websign', '');
  103.             data.add('websignkey', '61rx');
  104.             data.add('ves', 1);

  105.             // 发送POST请求
  106.             var postRes = http.post(ajaxUrl, data);
  107.             
  108.             // 检查是否返回了错误页面
  109.             if (postRes.includes("<!DOCTYPE html>") || postRes.includes("405")) {
  110.                 throw "服务器返回了错误页面,需要重试";
  111.             }
  112.             
  113.             try {
  114.                 var postData = JSON.parse(postRes);
  115.                
  116.                 if (!postData.dom || !postData.url) {
  117.                     throw "无法获取下载信息";
  118.                 }
  119.                
  120.                 // 获取下载地址
  121.                 var downloadUrl = postData.dom + "/file/" + postData.url;
  122.                 printl("初始下载地址:", downloadUrl);
  123.                
  124.                 // 尝试直接访问下载地址,设置跟随重定向
  125.                 printl("尝试直接访问下载地址...");
  126.                 http.clearHeader();
  127.                 http.setHeader('User-Agent', "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36");
  128.                 http.setHeader('Accept', "*/*");
  129.                 http.setHeader('Accept-Language', "zh-CN,zh;q=0.9,en;q=0.8");
  130.                 http.setHeader('Referer', "https://" + currentDomain + "/");
  131.                 http.setHeader('Connection', 'keep-alive');
  132.                
  133.                 // 直接尝试下载文件
  134.                 printl("开始下载文件...");
  135.                 var downloadStartTime = new Date().getTime();
  136.                 http.downloadFile(downloadUrl, saveFilePath);
  137.                 var downloadEndTime = new Date().getTime();
  138.                 var downloadTime = downloadEndTime - downloadStartTime;
  139.                
  140.                 printl("文件下载完成,耗时: " + formatTime(downloadTime));
  141.                
  142.                 // 检查文件大小
  143.                 try {
  144.                     var file = new java.io.File(saveFilePath);
  145.                     var fileSize = file.length();
  146.                     printl("文件大小: " + formatFileSize(fileSize));
  147.                     
  148.                     if (fileSize < 1024) {  // 如果文件小于1KB,可能是错误页面
  149.                         printl("警告: 文件大小异常小,可能下载不完整");
  150.                     }
  151.                 } catch (e) {
  152.                     printl("无法获取文件信息: " + e);
  153.                 }
  154.                
  155.                 var totalTime = new Date().getTime() - startTime;
  156.                 printl("总耗时: " + formatTime(totalTime));
  157.                 return true; // 下载成功,退出重试循环
  158.                
  159.             } catch (jsonError) {
  160.                 printl("解析JSON失败: " + jsonError + ", 响应内容: " + postRes.substring(0, 100));
  161.                 throw "无法解析服务器响应";
  162.             }
  163.             
  164.         } catch (error) {
  165.             printl("当前尝试出错: " + error);
  166.             if (retryCount === maxRetries - 1) {
  167.                 // 最后一次尝试也失败了
  168.                 printl("所有重试都失败了");
  169.                 return false;
  170.             }
  171.             // 否则继续下一次重试
  172.             continue;
  173.         }
  174.     }
  175.     return false;
  176. }

  177. // 格式化文件大小
  178. function formatFileSize(bytes) {
  179.     if (bytes < 1024) return bytes + " B";
  180.     else if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + " KB";
  181.     else if (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)).toFixed(2) + " MB";
  182.     else return (bytes / (1024 * 1024 * 1024)).toFixed(2) + " GB";
  183. }

  184. // 使用示例
  185. var url = "https://wwwgmg.lanzn.com/tomatoOCR";
  186. var saveFilePath = "/sdcard/Download/TomatoOCR.apk";
  187. var result = downloadLanzouFile(url, saveFilePath);

  188. if (result) {
  189.     printl("文件成功下载到: " + saveFilePath);
  190. } else {
  191.     printl("文件下载失败");
  192. }
复制代码



这段代码是一个用于从蓝奏云(Lanzou)下载文件的自动化工具脚本,主要基于JavaScript编写,并且是在一个安卓自动化环境中运行的,例如使用AiWork这样的自动化IDE。代码中定义了一个主要的函数downloadLanzouFile,它接受三个参数:文件的URL地址url,保存文件的路径saveFilePath,以及最大重试次数maxRetries(如果未提供,函数默认设置为5次)。
代码的主要功能和步骤如下:
  • 初始化和配置:


    • 定义了蓝奏云的备用域名列表,以便在遇到某个域名无法访问时进行切换。
    • 定义了一个sleep函数用于线程休眠,以便在重试之间等待一段时间。
    • 定义了两个辅助函数:getWaitTime用于计算每次重试时的等待时间,采用指数退避算法;formatTime用于将毫秒数格式化为更易读的时间格式。
  • 下载主逻辑:


    • 使用一个for循环来实现下载的重试机制,每次遇到错误时会增加重试次数。
    • 在每次重试之前,通过sleep函数等待一段时间,时间会随着重试次数增加而增加。
    • 使用okHttp库来发送HTTP请求,首先获取初始页面内容。
    • 解析初始页面以获取跳转路径,并访问二级页面以获取文件的签名参数sign。
    • 通过解析二级页面的HTML内容,获取用于下载文件的AJAX请求URL。
    • 配置HTTP请求头,模拟浏览器行为,以获取正确的下载地址。
    • 构造POST请求的数据,包括签名信息等,发送POST请求以获取下载地址。
    • 下载文件并通过formatFileSize函数格式化输出文件大小。
    • 检查文件大小是否异常小,以判断文件是否下载完整。
  • 错误处理:


    • 如果在下载过程中遇到任何错误(如文件不存在、服务器返回错误页面、无法解析JSON等),会被捕获并输出错误信息。
    • 如果在最大重试次数内仍未能成功下载文件,函数将返回false,表示下载失败。
  • 格式化文件大小:


    • formatFileSize函数用于将文件大小从字节转换为KB、MB或GB,并保留两位小数。
  • 示例使用:


    • 提供了一个使用示例,展示了如何调用downloadLanzouFile函数来下载文件,并根据返回结果判断文件是否成功下载。


untosetTimeout__方法异步延迟加载函数nextAIWROK软件多线程协作示例代码解析
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读了
    采集亚马逊正版群发工具有没有?
    Apr.20旅行X心语今天来说说YYPOST新功能的一个灵活用法,采集亚马逊商品信息,并且获得排名的软件,亚马逊现在越来越多客户做,淘宝的水是越来越清了,以前做电商的客户,现在都转战到外国,最赚钱的要数一些客户往亚马逊里堆了吧,拿我这个YYPOST的客户,最多的是采集,分析排名,刷价格,刷数量,改价,刷访问量等等技术

    企业发展B2B网站有什么东东软件可以发呢
    标题企业发展网B2B软件,现在虽然B2B网站收录不错,可愁的是心急的人们,他们太想一口吃撑胖子了,发帖宣传虽然不能像佛系那样淡定,但也不能像跑火车那般急躁对待,自己内容不收录,完全是自己操作内容问题,可以参考一下别人的内容是怎么弄的,然后自己要试着转变,而且收录这个内容,常常会变化的,不是一种规则就吃到老

    搜房天下房聊软件哪一个好呢
    本帖最后由 发帖软件 于 2019-5-22 16:15 编辑 2搜房天下群发房聊信息软件,开始本来打算做58同城的,但发一个就要一次点触验证码,这就让人没有感觉到存在的价值了吧,都是卖二手房和新房的搜房天下倒是可以发即时聊天信息,也没有发现他这个网站有啥子限制,登陆一个搜房天下账号,然后采集回来分类列表的网址,然后就一

    大家坛有没有好用的群发工具下载呢
    当你的笑容给我礼貌的招呼,大家坛全自动发帖软件,宣传推广是一场持久战,总是有一些人把软件用了一天,或是几个小时,就觉得自己付出太多了,那加进来的粉丝,或是流量,应该是和宣传多少成正比的,其实没有这么便宜的事,就像很多阅读量超过一百万的视频,或是电影,真正会在屏幕打赏的人不会超过三千,真正大额打赏给主

    群发正版软件中国塑料网
    中国塑料网群发软件YYPOST脚本下载地址,这个网站会有一个很奇怪的问题就是你在首页登陆无半个验证码,但在登陆网址登陆就会有一个验证码,所以我们灵活一些,在首页登陆就不用输入验证码了哈。网站秒收录比较高,但发的都是五金和建筑行业,先前有很多人都是发土建工程的大公司操作的,现在这个网站专为那个行业诞生的吧。

    OpenStreetMap网站正版2019年发帖工具下载
    本帖最后由 发帖软件 于 2019-5-21 11:13 编辑 OpenStreetMap网站全自动群发,OpenStreetMapOpenStreetMap(简称OSM,中文是公开地图)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图。有的人编辑地图然后等收录,有的人发日志等收录,我们这里也是利用地图日志做为宣传的目标,简单的脚本理

    搜房天下全自动收短信全自动识别验证码注册账号软件
    房天下自动注册机,这个脚本是前几天发房聊的脚本廷伸品种,这个脚本能做到自动注册账号,自动保存账号,自动发房聊的效果,不过今天我们主要说一说怎么注册账号写脚本吧,这个搜房天天下的账号,可以发提问,可以发房聊,发论坛,发博客,还有发个人中心页都是有秒收的效果的,这样就省去了去买号,去乱花钱的效果了吧,而

    企业邮箱安卓端有什么APP软件可以发的呢
    请输入标题企业邮箱安卓发发送邮箱脚本,这个脚本是利用企业邮箱进行群发的,全程是一种模拟手工操作的过程,所以封号是很少的,而且企业邮箱群发到普通QQ邮箱不容易进垃圾箱中的,所以这个脚本也是这样的原理,不过最好是利用一些多开器,登陆多点的QQ邮箱账号会比较流畅一些,然后用软件一个一个的切换APP进行群发邮件会

    头条留评论软件有没有好用的呢?
    今天整一个今日头条留言软件,对于留言YYPOST是优势是比较大的存在,因为他往往专注一些下拉定位的优点,像今日头条这样,还是需要一些特殊下拉定位的,因为他新闻有长有短,有图有视频的,所以综合起来定位是比较难的,如果用POST也不是很轻松可以破解他的加密参数。这个脚本也是有一个不好的地方就是换号会比较麻烦,您电

    单网页生成神器
    最近新技术,网页生成机占领了整个网络的半壁江山,效果很疯狂,虽然不知道能持续多久,作为开发软件的领头者,一直在找收录的方法,一直在努力创新着,一直被人模仿,却从没有被超越过,这个网页生成机,已经出来有一段时间了,一直没有拿出来分享,醉过醉过,它是利用的一些小小收录漏洞整的,您最好用一些老站域名,进行

关闭
快速回复 返回列表 返回顶部
本站自动发贴软件,是现在最流行的做脚本软件,这种发贴工具,不但发贴收录快,而且抢占好的先机,完全自由编辑,实现针对性群发模拟操作,软件可以顶贴,也可以发贴,可以兼容支持Discuz、PHPWind、Dvbbs三大主流论坛,有手机验证码收件,邮件收发的功能,支持验证码识别,注册问题识别,多线程任务,自动上传头像,自动激活注册邮件,兼容防注册插件,本站软件原创正版,更新效率最快的原创软件。 『网络推广软件』『自动发帖软件』『 自动发帖