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

[24小时收录超级好的网站] AIWROK软件安卓脚本FTP上传下载例子

[复制链接]

2546

主题

2594

帖子

1万

积分

积分
15450
跳转到指定楼层
楼主
AIWROK软件安卓脚本FTP上传下载例子
AIWROK软件安卓脚本FTP上传下载例子 群发软件发帖工具

  1. /**
  2. * AIWROK 简易FTP工具 - 纯Java Socket实现
  3. * 交流QQ群: 711841924 (群一) / 528816639 (苹果脚本内测群)s
  4. */

  5. // ==================== FTP配置 ====================
  6. // 配置FTP服务器连接信息
  7. var FTPConfig = {
  8.     host: "38.67.75.157",      // FTP服务器地址
  9.     port: 21,                   // FTP端口(默认21)
  10.     username: "fghgdfhfdh",           // 登录用户名
  11.     password: "aH6CEtK6X77J",   // 登录密码
  12.     timeout: 60000,             // 连接超时时间(毫秒)
  13.     encoding: "UTF-8"           // 字符编码
  14. };

  15. // ==================== FTP客户端 ====================
  16. // 使用IIFE(立即执行函数)创建FTPClient对象
  17. // 封装所有FTP操作,保持全局命名空间清洁
  18. var FTPClient = (function() {
  19.     // 私有变量 - FTP连接状态
  20.     var controlSocket = null;   // 控制通道Socket(发送命令)
  21.     var dataSocket = null;      // 数据通道Socket(传输文件)
  22.     var reader = null;          // 控制通道读取器
  23.     var writer = null;          // 控制通道写入器
  24.     var isConnected = false;    // 连接状态标志

  25.     /**
  26.      * 读取FTP服务器响应
  27.      * 从控制通道读取一行文本
  28.      * @returns {string|null} 服务器响应的文本,失败返回null
  29.      */
  30.     function readResponse() {
  31.         try {
  32.             var line = reader.readLine();
  33.             if (line) console.log("FTP: " + line);
  34.             return line;
  35.         } catch (e) {
  36.             return null;
  37.         }
  38.     }

  39.     /**
  40.      * 发送FTP命令并等待响应
  41.      * @param {string} cmd - FTP命令(如 USER, PASS, PASV等)
  42.      * @returns {string|null} 服务器响应,失败返回null
  43.      */
  44.     function sendCommand(cmd) {
  45.         try {
  46.             writer.write(cmd + "\r\n");  // FTP命令以\r\n结尾
  47.             writer.flush();              // 立即发送
  48.             sleep.second(0.5);           // 等待服务器响应
  49.             return readResponse();       // 读取响应
  50.         } catch (e) {
  51.             return null;
  52.         }
  53.     }

  54.     /**
  55.      * 连接FTP服务器并登录
  56.      * 建立控制通道,完成用户认证
  57.      * @param {Object} config - FTP配置对象(host, port, username, password等)
  58.      * @returns {boolean} 连接成功返回true,失败返回false
  59.      */
  60.     function connect(config) {
  61.         try {
  62.             console.log("连接FTP: " + config.host);
  63.             
  64.             // 1. 创建控制通道Socket连接
  65.             controlSocket = new java.net.Socket(config.host, config.port);
  66.             controlSocket.setSoTimeout(config.timeout);  // 设置超时
  67.             
  68.             // 2. 创建输入输出流(使用指定编码)
  69.             var InputStreamReader = java.io.InputStreamReader;
  70.             var OutputStreamWriter = java.io.OutputStreamWriter;
  71.             var BufferedReader = java.io.BufferedReader;
  72.             var BufferedWriter = java.io.BufferedWriter;
  73.             
  74.             reader = new BufferedReader(new InputStreamReader(controlSocket.getInputStream(), config.encoding));
  75.             writer = new BufferedWriter(new OutputStreamWriter(controlSocket.getOutputStream(), config.encoding));
  76.             
  77.             // 3. 读取服务器欢迎消息(220开头)
  78.             var welcome = readResponse();
  79.             if (!welcome || !welcome.startsWith("220")) {
  80.                 disconnect();
  81.                 return false;
  82.             }
  83.             
  84.             // 4. 读取所有多行欢迎消息(Pure-FTPd会发送多条220-开头的消息)
  85.             sleep.second(0.3);
  86.             var line;
  87.             while ((line = reader.readLine()) !== null) {
  88.                 if (!line.startsWith("220-")) break;  // 遇到非220-的行就停止
  89.             }
  90.             
  91.             // 5. 发送用户名(USER命令)
  92.             var resp = sendCommand("USER " + config.username);
  93.             if (!resp || !resp.startsWith("331")) {  // 331表示需要密码
  94.                 disconnect();
  95.                 return false;
  96.             }
  97.             
  98.             // 6. 发送密码(PASS命令)
  99.             resp = sendCommand("PASS " + config.password);
  100.             if (!resp || !resp.startsWith("230")) {  // 230表示登录成功
  101.                 disconnect();
  102.                 return false;
  103.             }
  104.             
  105.             console.log("✓ 登录成功");
  106.             isConnected = true;
  107.             return true;
  108.             
  109.         } catch (e) {
  110.             console.log("连接失败: " + e.message);
  111.             disconnect();
  112.             return false;
  113.         }
  114.     }

  115.     /**
  116.      * 设置被动模式(PASV)
  117.      * FTP被动模式:服务器开启数据端口,客户端连接
  118.      * 自动处理内网IP映射(将10.x.x.x替换为公网IP)
  119.      * @returns {boolean} 设置成功返回true,失败返回false
  120.      */
  121.     function setupPassiveMode() {
  122.         try {
  123.             // 关闭旧的数据通道
  124.             if (dataSocket) {
  125.                 try { dataSocket.close(); } catch(e) {}
  126.                 dataSocket = null;
  127.             }
  128.             
  129.             // 发送PASV命令,获取服务器数据端口
  130.             var resp = sendCommand("PASV");
  131.             if (!resp || !resp.startsWith("227")) return false;  // 227表示进入被动模式
  132.             
  133.             // 解析PASV响应: 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2)
  134.             var match = resp.match(/\(([^)]+)\)/);
  135.             if (!match) return false;
  136.             
  137.             var parts = match[1].split(",");
  138.             var port = parseInt(parts[4]) * 256 + parseInt(parts[5]);  // 计算端口号
  139.             var ip = parts[0] + "." + parts[1] + "." + parts[2] + "." + parts[3];
  140.             
  141.             // 重要:如果服务器返回内网IP,替换为配置的公网IP
  142.             // 这是因为FTP服务器在NAT后面,会返回内网地址
  143.             if (ip.startsWith("10.") || ip.startsWith("192.168.")) {
  144.                 console.log("检测到内网IP: " + ip + ",使用服务器地址: " + FTPConfig.host);
  145.                 ip = FTPConfig.host;
  146.             }
  147.             
  148.             // 创建数据通道Socket连接
  149.             dataSocket = new java.net.Socket(ip, port);
  150.             dataSocket.setSoTimeout(60000);  // 数据传输超时60秒
  151.             return true;
  152.         } catch (e) {
  153.             console.log("被动模式设置失败: " + e.message);
  154.             return false;
  155.         }
  156.     }

  157.     /**
  158.      * 上传文件到FTP服务器
  159.      * 使用被动模式传输,支持二进制文件
  160.      * @param {string} localPath - 本地文件路径(如 /sdcard/test.txt)
  161.      * @param {string} remotePath - 远程文件路径(如 /test.txt)
  162.      * @returns {boolean} 上传成功返回true,失败返回false
  163.      */
  164.     function upload(localPath, remotePath) {
  165.         if (!isConnected) return false;
  166.         
  167.         console.log("上传: " + localPath + " -> " + remotePath);
  168.         
  169.         // 检查本地文件是否存在
  170.         var file = new java.io.File(localPath);
  171.         if (!file.exists()) {
  172.             console.log("文件不存在: " + localPath);
  173.             return false;
  174.         }
  175.         
  176.         // 设置被动模式,建立数据通道
  177.         if (!setupPassiveMode()) return false;
  178.         
  179.         // 发送STOR命令,准备接收文件
  180.         var resp = sendCommand("STOR " + remotePath);
  181.         if (!resp || !resp.startsWith("150")) return false;  // 150表示准备接收
  182.         
  183.         // 读取本地文件并发送到数据通道
  184.         var fis = new java.io.BufferedInputStream(new java.io.FileInputStream(file));
  185.         var out = dataSocket.getOutputStream();
  186.         var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 4096);  // 4KB缓冲区
  187.         var len;
  188.         
  189.         while ((len = fis.read(buffer)) !== -1) {
  190.             out.write(buffer, 0, len);  // 写入数据通道
  191.         }
  192.         
  193.         // 关闭流和Socket
  194.         fis.close();
  195.         out.close();
  196.         dataSocket.close();
  197.         dataSocket = null;
  198.         
  199.         // 读取最终响应(226表示传输完成)
  200.         sleep.second(0.5);
  201.         var finalResp;
  202.         while ((finalResp = readResponse()) !== null) {
  203.             if (finalResp.startsWith("226 ")) {  // 226表示文件传输成功
  204.                 console.log("✓ 上传成功");
  205.                 return true;
  206.             }
  207.         }
  208.         
  209.         return false;
  210.     }

  211.     /**
  212.      * 从FTP服务器下载文件
  213.      * 使用被动模式传输,支持二进制文件
  214.      * @param {string} remotePath - 远程文件路径(如 /test.txt)
  215.      * @param {string} localPath - 本地保存路径(如 /sdcard/test.txt)
  216.      * @returns {boolean} 下载成功返回true,失败返回false
  217.      */
  218.     function download(remotePath, localPath) {
  219.         if (!isConnected) return false;
  220.         
  221.         console.log("下载: " + remotePath + " -> " + localPath);
  222.         
  223.         // 设置被动模式,建立数据通道
  224.         if (!setupPassiveMode()) return false;
  225.         
  226.         // 发送RETR命令,请求下载文件
  227.         var resp = sendCommand("RETR " + remotePath);
  228.         if (!resp || !resp.startsWith("150")) return false;  // 150表示准备发送
  229.         
  230.         // 从数据通道接收数据并保存到本地文件
  231.         var fos = new java.io.BufferedOutputStream(new java.io.FileOutputStream(new java.io.File(localPath)));
  232.         var input = dataSocket.getInputStream();
  233.         var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 4096);  // 4KB缓冲区
  234.         var len;
  235.         var total = 0;
  236.         
  237.         console.log("开始接收...");
  238.         try {
  239.             var startTime = new Date().getTime();
  240.             var timeout = 30000;  // 30秒超时保护
  241.             
  242.             while ((len = input.read(buffer)) !== -1) {
  243.                 fos.write(buffer, 0, len);  // 写入本地文件
  244.                 total += len;
  245.                
  246.                 // 检查是否超时
  247.                 var elapsed = new Date().getTime() - startTime;
  248.                 if (elapsed > timeout) {
  249.                     console.log("超时: 已接收 " + total + " 字节");
  250.                     break;
  251.                 }
  252.             }
  253.             console.log("接收完成: " + total + " 字节");
  254.         } catch (e) {
  255.             console.log("接收出错: " + e.message);
  256.         }
  257.         
  258.         // 关闭流和Socket
  259.         fos.close();
  260.         input.close();
  261.         dataSocket.close();
  262.         dataSocket = null;
  263.         
  264.         // 读取最终响应(226表示传输完成)
  265.         sleep.second(0.5);
  266.         var finalResp;
  267.         while ((finalResp = readResponse()) !== null) {
  268.             if (finalResp.startsWith("226 ")) {  // 226表示文件传输成功
  269.                 console.log("✓ 下载成功");
  270.                 return true;
  271.             }
  272.         }
  273.         
  274.         return false;
  275.     }

  276.     /**
  277.      * 获取FTP目录列表
  278.      * 使用LIST命令获取指定目录的文件列表
  279.      * @param {string} remotePath - 远程目录路径(如 /)
  280.      * @returns {Array} 文件列表数组,每个元素是一行LIST输出
  281.      */
  282.     function listDir(remotePath) {
  283.         if (!isConnected) return [];
  284.         
  285.         console.log("列出目录: " + remotePath);
  286.         
  287.         // 设置被动模式
  288.         if (!setupPassiveMode()) return [];
  289.         
  290.         // 发送LIST命令
  291.         var resp = sendCommand("LIST " + remotePath);
  292.         if (!resp || !resp.startsWith("150")) return [];  // 150表示准备发送数据
  293.         
  294.         // 从数据通道读取目录列表
  295.         var dirReader = new java.io.BufferedReader(
  296.             new java.io.InputStreamReader(dataSocket.getInputStream(), "UTF-8")
  297.         );
  298.         
  299.         var files = [];
  300.         var line;
  301.         while ((line = dirReader.readLine()) !== null) {
  302.             if (line.trim()) files.push(line);  // 跳过空行
  303.         }
  304.         
  305.         // 关闭读取器和Socket
  306.         dirReader.close();
  307.         dataSocket.close();
  308.         dataSocket = null;
  309.         
  310.         // 读取最终响应(226表示传输完成)
  311.         sleep.second(0.5);
  312.         var finalResp;
  313.         while ((finalResp = readResponse()) !== null) {
  314.             if (finalResp.startsWith("226 ")) break;  // 找到最终的226响应
  315.         }
  316.         
  317.         console.log("找到 " + files.length + " 个条目");
  318.         return files;
  319.     }

  320.     /**
  321.      * 断开FTP连接
  322.      * 关闭所有Socket和流,释放资源
  323.      */
  324.     function disconnect() {
  325.         try {
  326.             // 关闭数据通道
  327.             if (dataSocket) {
  328.                 try { dataSocket.close(); } catch(e) {}
  329.                 dataSocket = null;
  330.             }
  331.             
  332.             // 关闭控制通道
  333.             if (controlSocket) {
  334.                 try {
  335.                     writer.write("QUIT\r\n");  // 发送QUIT命令
  336.                     writer.flush();
  337.                 } catch(e) {}
  338.                 try { controlSocket.close(); } catch(e) {}
  339.                 controlSocket = null;
  340.             }
  341.             
  342.             // 关闭流
  343.             if (reader) { try { reader.close(); } catch(e) {} reader = null; }
  344.             if (writer) { try { writer.close(); } catch(e) {} writer = null; }
  345.             
  346.             isConnected = false;
  347.             console.log("已断开");
  348.         } catch (e) {
  349.             // 忽略断开时的错误
  350.         }
  351.     }

  352.     // 公开API - 只暴露这5个方法
  353.     return {
  354.         connect: connect,       // 连接FTP服务器
  355.         disconnect: disconnect, // 断开连接
  356.         upload: upload,         // 上传文件
  357.         download: download,     // 下载文件
  358.         listDir: listDir        // 获取目录列表
  359.     };
  360. })();

  361. // ==================== 测试代码 ====================
  362. /**
  363. * 主函数 - 演示FTP工具的三个核心功能
  364. * 1. 连接FTP服务器
  365. * 2. 查看目录列表
  366. * 3. 上传文件
  367. * 4. 下载文件
  368. * 5. 断开连接
  369. */
  370. function main() {
  371.     console.log("========== FTP简易工具 ==========\n");
  372.    
  373.     // 1. 连接FTP服务器
  374.     if (!FTPClient.connect(FTPConfig)) {
  375.         console.log("连接失败");
  376.         return;
  377.     }
  378.    
  379.     sleep.second(1);  // 等待1秒
  380.    
  381.     // 2. 查看根目录文件列表
  382.     console.log("\n--- 查看根目录 ---");
  383.     var files = FTPClient.listDir("/");
  384.     for (var i = 0; i < files.length; i++) {
  385.         console.log("  " + files[i]);
  386.     }
  387.    
  388.     sleep.second(1);  // 等待1秒
  389.    
  390.     // 3. 上传文件测试
  391.     console.log("\n--- 上传测试 ---");
  392.     FTPClient.upload("/sdcard/test.txt", "/test_upload.txt");
  393.    
  394.     sleep.second(1);  // 等待1秒
  395.    
  396.     // 4. 下载文件测试
  397.     console.log("\n--- 下载测试 ---");
  398.     FTPClient.download("/2.txt", "/sdcard/2_downloaded.txt");
  399.    
  400.     sleep.second(1);  // 等待1秒
  401.    
  402.     // 5. 断开连接
  403.     FTPClient.disconnect();
  404.    
  405.     console.log("\n========== 完成 ==========");
  406. }

  407. // 执行主函数
  408. main();
复制代码




untoAIWROK软件脚本JSON转换示例nextnocontent
回复

使用道具 举报

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

本版积分规则

相关导读了
    采集亚马逊正版群发工具有没有?
    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三大主流论坛,有手机验证码收件,邮件收发的功能,支持验证码识别,注册问题识别,多线程任务,自动上传头像,自动激活注册邮件,兼容防注册插件,本站软件原创正版,更新效率最快的原创软件。 『网络推广软件』『自动发帖软件』『 自动发帖