信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索
查看: 1|回复: 0
打印 上一主题 下一主题

[宣传软件网站动态] AIWROK软件安卓脚本FTP上传下载例子

[复制链接]

1919

主题

1929

帖子

1万

积分

积分
11236

资讯缩略图:

资讯发布日期:2026-05-18

资讯发布简介:AIWROK软件安卓脚本FTP上传下载例子

资讯关键词:AIWROK软件安卓脚本FTP上传下载例子

资讯所属分类:IT资讯 

联系:

① 本信息收集于网络,如有不对的地方欢迎联系我纠正!
② 本信息免费收录,不存在价格的问题!
③ 如果您的网站也想这样出现在这里,请您加好友情链接,我当天会审核通过!

④友情链接关键字:软件网站分类目录 网址:http://www.postbbs.com/

资讯详细描述
AIWROK软件安卓脚本FTP上传下载例子
AIWROK软件安卓脚本FTP上传下载例子 b2b软件

AIWROK软件安卓脚本FTP上传下载例子 b2b软件

  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
回复

使用道具 举报

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

本版积分规则

相关导读
群发软件AIWROK软件安卓脚本FTP上传下载例子
AIWROK软件安卓脚本FTP上传下载例子
群发软件AIWROK软件脚本JSON转换示例
AIWROK软件脚本JSON转换示例
群发软件AIWROK软件运算符高级应用实例
AIWROK软件运算符高级应用实例
群发软件JavaScript语法小示例
JavaScript语法小示例
群发软件展示JavaScript各种语句标识符的实际应用
展示JavaScript各种语句标识符的实际应用
群发软件AIWROK条件语句实用示例智能活动推荐系统
AIWROK条件语句实用示例智能活动推荐系统
群发软件AIWROK软件示例数组方法实战应用
AIWROK软件示例数组方法实战应用
群发软件示例JavaScript的 try-catch-finally-throw用法
示例JavaScript的 try-catch-finally-throw用法
群发软件JavaScript 高级错误处理实战示例
JavaScript 高级错误处理实战示例
群发软件安卓脚本AIWROK软件示例JS函数高级用法
安卓脚本AIWROK软件示例JS函数高级用法
群发软件AIWROK环境JavaScript编码规范完整示例
AIWROK环境JavaScript编码规范完整示例
群发软件安卓脚本示例实时截图判断页面变化
安卓脚本示例实时截图判断页面变化
群发软件苹果脚本7种不同的OCR识别
苹果脚本7种不同的OCR识别
群发软件安卓脚本多变的function用法
安卓脚本多变的function用法
群发软件苹果脚本示例Config配置H5集成
苹果脚本示例Config配置H5集成
群发软件安卓脚本类型判断与Boolean对象综合示例
安卓脚本类型判断与Boolean对象综合示例
群发软件线程全局变量H5可视化控制台
线程全局变量H5可视化控制台
群发软件秒吐司快速显示和关闭的UI提示窗口
秒吐司快速显示和关闭的UI提示窗口
群发软件苹果脚本里H5 里的 window.at.callFun 示例
苹果脚本里H5 里的 window.at.callFun 示例
群发软件H5日志打印运行过程例子
H5日志打印运行过程例子
群发软件AIWROK软件字符串方法实用案例
AIWROK软件字符串方法实用案例
群发软件HID贝塞尔曲线运动控制器
HID贝塞尔曲线运动控制器
群发软件AIWROK苹果脚本sleep方法综合实战示例
AIWROK苹果脚本sleep方法综合实战示例
群发软件苹果脚本Line控件的多种创意用法和实际应用场景
苹果脚本Line控件的多种创意用法和实际应用场景
群发软件苹果脚本toast高级应用综合示例
苹果脚本toast高级应用综合示例
群发软件苹果智能OCR自动化助手
苹果智能OCR自动化助手
群发软件苹果脚本UI超快速点击示例
苹果脚本UI超快速点击示例
群发软件展示时间戳的各种复杂处理方法
展示时间戳的各种复杂处理方法
群发软件苹果脚本随机数实用示例
苹果脚本随机数实用示例
群发软件安卓手机脚本多种倒计时显示方式
安卓手机脚本多种倒计时显示方式
群发软件苹果脚本屏幕事件EVENT示例
苹果脚本屏幕事件EVENT示例
群发软件苹果脚本屏幕类screen例子
苹果脚本屏幕类screen例子
群发软件安卓手机config配置演示实列
安卓手机config配置演示实列
群发软件苹果脚本配置config小实例
苹果脚本配置config小实例 https://www.yuque.com/aiwork/dcvhmb/qolobpysdg0hvi2e
群发软件苹果脚本矩形类rect小实例
苹果脚本矩形类rect小实例
群发软件AIWROK安卓苹果平台设计的实用工具库
AIWROK安卓苹果平台设计的实用工具库
群发软件AIWROK软件Function导入方法实例演示
AIWROK软件Function导入方法实例演示
群发软件苹果脚本实例1项目project应用示例
苹果脚本实例1项目project应用示例
群发软件苹果脚本实例1剪贴板功能集成
苹果脚本实例1剪贴板功能集成
群发软件苹果iOS脚本Detect类系统性使用示例
苹果iOS脚本Detect类系统性使用示例
群发软件AIWROK苹果系统打印H5界面日志输出
AIWROK苹果系统打印H5界面日志输出
群发软件H5案例自动化看广告撸金币系统
H5案例自动化看广告撸金币系统
群发软件AIWROK苹果脚本H5任务执行小例子
AIWROK苹果脚本H5任务执行小例子
群发软件AIWROK软件苹果水平容器[Horizontal]小实例
AIWROK软件苹果水平容器[Horizontal]小实例
群发软件AIWROK苹果脚本实例1界面UI输入框类[Input]
AIWROK苹果脚本实例1界面UI输入框类
群发软件AIWROK软件苹果脚本案例1空白站位[Space]方法
AIWROK软件苹果脚本案例1空白站位[Space]方法
群发软件AIWROK软件苹查系统复选框用法
AIWROK软件苹查系统复选框用法
群发软件苹果AIWROK实例单选按钮组类[RadioButtonGroup]完整综合示例
苹果AIWROK实例单选按钮组类[RadioButtonGroup]完整综合示例
群发软件AIWROK软件苹果实例UI-垂直容器[Vertical]高级综合示例
AIWROK软件苹果实例UI-垂直容器[Vertical]高级综合示例
群发软件IOS苹果脚本View的完整功能实例
IOS苹果脚本View的完整功能实例
群发软件AIWROK苹果系统实例演示1标签类[Label]方法
AIWROK苹果系统实例演示1标签类[Label]方法
信息发布软件AIWROK软件苹果UI按钮Button方法示例
AIWROK软件苹果UI按钮Button方法示例
信息发布软件AIWROK软件苹果TAB界面视图示例
AIWROK软件苹果TAB界面视图示例
信息发布软件AIWROK苹果系统自带view视图简洁UI界面示例
AIWROK苹果系统自带view视图简洁UI界面示例
信息发布软件汇集HID安卓输入文字的方法和复制粘贴示例
汇集HID安卓输入文字的方法和复制粘贴示例
信息发布软件AIWROK软件找字与OCR方法汇总示例
AIWROK软件找字与OCR方法汇总示例
信息发布软件AIWROK软件找图方法汇总示例
AIWROK软件找图方法汇总示例
信息发布软件AIWROK软件滑动方法集合示例
AIWROK软件滑动方法集合示例
信息发布软件AIWROK软件安卓AIWROK汇集软件点击
AIWROK软件安卓AIWROK汇集软件点击
信息发布软件苹果系统点击方法综合示例
苹果系统点击方法综合示例
信息发布软件AIWROK苹果系统找图方法完整示例集合
AIWROK苹果系统找图方法完整示例集合
信息发布软件苹果系统找图方法完整示例集合
苹果系统找图方法完整示例集合
信息发布软件苹果IOS系统找字OCR方法例子
苹果IOS系统找字OCR方法例子
信息发布软件AIWORK软件数组高级示例
AIWORK软件数组高级示例
信息发布软件AIWROK软件运算符封装库示例
AIWROK软件运算符封装库示例

QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2026-5-18 10:40 , Processed in 0.631344 second(s), 51 queries .

宣传软件--信息发布软件--b2b软件广告发布软件

快速回复 返回顶部 返回列表