Java+Selenium+chrome 实现定时自动登录(含验证码解析)

Selenium 自动化测试如何优雅的解决图片验证码问题 说到自动化测试那一定避不开登陆注册页面,而大多数情况下这两个简单的页面都存在一个小困难就是验证码,以前我的解决办法都是在测试环境粗暴的写死一个万能验证码,或者给程序一个10秒钟的线程阻塞,手动输入验证码以跳过这个步骤。这个问题我有跟其他同事简单的讨论过,一种观点是当AI库的识别能力可以达到一个较高的准确程度的前提下,自动化测试就应该包含验证码登陆,毕竟E2E测试就是应该更加贴近真实的用户操作。这两种方法的本质是相同的,都是使用AI的方式,自动识别验证码,完成填入。只不过采用了不同的包和方法完成的。 阅读详情
作为打工人,感觉对于定时自动登录这个功能还是需要会,现将方法分享出来,供大家参考。

1.下载浏览器驱动

说明:以chrome浏览器为例,其他浏览器可以自动查找自己浏览器的驱动,方法相同

进入chrome浏览器设置,左侧菜单最后一栏,找到关于chrome,点开获取浏览器版本号,进入

https://registry.npmmirror.com/binary.html?path=chromedriver/下载距离版本号最近的驱动。

最好将浏览器的自动更新关掉,不然自动升级高版本后得重新下驱动。关于如何关闭chrome浏览器的自动更新,这篇文文章有详细说明-->关闭chrome浏览器自动更新-简单好用

2.定时任务代码

新建SpringBoot工程,新建定时任务,可以用SpringBoot自带的@Scheduled注解,也可以使用quartz实现,这里使用quartz进行实现。

/**
 * 创建Scheduler
 */
@Configuration
@EnableScheduling
public class SchedulerCustomizer implements SchedulerFactoryBeanCustomizer {
    
    @Override
    public void customize(SchedulerFactoryBean schedulerFactoryBean) {
        schedulerFactoryBean.setAutoStartup(true);
        schedulerFactoryBean.setOverwriteExistingJobs(true);
    }
}
/**
 * 创建job
 */
@Component
public class CommonJobFactory extends SpringBeanJobFactory {

    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        //调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        //进行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}
/***
 * @description 定时任务创建
 * @author
 */
@Component
public class QuartzManage implements ApplicationRunner {

    @Autowired
    private CommonJobFactory commonJobFactory;
    @Autowired
    private Scheduler scheduler;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 启动调度器
        scheduler.setJobFactory(commonJobFactory);
        // 1、创建JobDetail实例,UpWorkTimer为业务实现的类
        JobDetail jobDetail = JobBuilder.newJob(UpWorkTimer.class)
                .withIdentity("job1", "group1").build();
        // 2、构建Trigger实例,每隔30s执行一次
        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule("0/30 * * * * ?")).build();


        //3、创建调度器Scheduler并执行
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
        System.out.println("--------scheduler start ! ------------");
    }
}

至此,定时任务创建完成

3.业务逻辑代码

/***
 * 逻辑代码
 */
@Service
public class UpWorkTimer implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) {
        //设置chrome的安装路径,
        //webDriverLocation 为第一步下载的驱动位置例如D:\\a\\chromedriver.exe
        System.setProperty("webdriver.chrome.driver", webDriverLocation);
        //初始化浏览器实例,并打开浏览器
        ChromeDriver driver = new ChromeDriver();
        try {
            //最大化窗口
            driver.manage().window().maximize();
            Thread.sleep(500);
            //打开一个网址,为自己需要打卡的网址
            driver.get("www.baidu.com");
            Thread.sleep(500);

            //获取用户名框并输入用户名
            driver.findElement(By.id("用户名")).sendKeys(“xxx”);

            //获取密码框并输入密码
            driver.findElement(By.id("密码")).sendKeys(“xxx”);

            //这部分为获取验证码并解析,下部分讲到
            WebElement ele = driver.findElement(By.id("img"));
            String src = ele.getAttribute("src");
            YdmVerify ydmVerify = new YdmVerify();
            String s = ydmVerify.commonVerify(src, token);

            JSONObject jsonObject = JSONObject.parseObject(s);
            if (10000 == (Integer) jsonObject.get("code")) {
                Map<String, Object> jsonDate = (Map<String, Object>) jsonObject.get("data");
                System.out.println("验证码获取成功,获取结果为:" + jsonDate.get("data"));

                //获取验证码框并输入验证码
                driver.findElements(By.id("验证码")).sendKeys((String) jsonDate.get("data"));

                //获取登录按钮并点击
                driver.findElements(By.id("登录"))).click();
                Thread.sleep(500);

                //获取签到按钮并点击
                driver.findElements(By.id("签到"))).click();
                Thread.sleep(500);
            } else {
                System.out.println("验证码获取失败,获取结果为:" + jsonObject.get("msg"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
           //关闭浏览器驱动
            driver.quit();
        }
    }
}

到这里业务代码写完了,其中的页面内筒根据每个人的不同自己修改。接下来讲验证码如何生成,逻辑代码中28-35行的内容。

4.验证码图片解析

验证码的生成思路为拿到验证码图片,将图片解析为 base64 的加密串,然后调用云码平台的api生成验证码。上代码

/**
 * @author 无名
 */
public class YdmVerify {

    private static final String CustomUrl = "https://www.jfbym.com/api/YmServer/customApi";
    Map headers = new HashMap<>();


    public YdmVerify() {
        headers.put("Content-Type", "application/json");
    }
    //imageContent 为图片加密后的base64密文
    //token 为云码平台提供,获取方法见代码后的说明
    public String commonVerify(String imageContent,String token) {
        // # 数英汉字类型
        // # 通用数英1-4位 10110
        // # 通用数英5-8位 10111
        // # 通用数英9~11位 10112
        // # 通用数英12位及以上 10113
        // # 通用数英1~6位plus 10103
        // # 定制-数英5位~qcs 9001
        // # 定制-纯数字4位 193
        // # 中文类型
        // # 通用中文字符1~2位 10114
        // # 通用中文字符 3~5位 10115
        // # 通用中文字符6~8位 10116
        //# 通用中文字符9位及以上 10117
        //# 定制-XX西游苦行中文字符 10107
        // # 计算类型
        //# 通用数字计算题 50100
        // # 通用中文计算题 50101
        // # 定制-计算题 cni 452
        String verify_type;
        verify_type = "10110";
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("image", imageContent);
        jsonObject.put("type", verify_type);
        jsonObject.put("token", token);
        String resp = Requests.post(CustomUrl).headers(headers).jsonBody(jsonObject).send().readToText();
        return resp;
    }

    /**
     * 获取本地图片并 base64  加密
    public static String ImageToBase64ByOnline(String imgURL) {
        //将图片文件转化为字节数组字符串,并对其进行Base64编码处理
        InputStream in = null;
        byte[] data = null;
        //读取图片字节数组
        try {
            in = new FileInputStream(imgURL);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        String s = Base64.encodeBase64String(data);
        System.out.println(s);
        return s;

    }*/

}

若可以直接获取到加密后的密文直接传入,若不是则将验证码图片 下载至本地并调用ImageToBase64ByOnline方法生成base64 密文。接下来对云码平台使用进行讲解:

5.云码平台使用

云码平台地址:https://zhuce.jfbym.com/login/ ,注册后按照步骤提示领取新人500积分,每次验证成功需要消耗2积分,用完500积分后,1元=1000积分,足够用了。

  • 注册完成领取积分后点击右上角头像进入个人中心,找到token点击复制

这样就获取到了token,在代码中使用。还有非常重要的一点是,云码平台使用要jdk11,jdk8用不了,还需要一些平台特有的jar包,链接如下,自行下载后导入。

链接:https://pan.baidu.com/s/13_wbywV2nYDNCGdPHCtjaA

提取码:sugj

当然,云码平台还提供了开发文档,里面有滑块验证,九宫格的等等,我们以数字验证码为例,有兴趣的可以研究其他。

至此,定时自动登录就完成了。

说明:此文档仅用于学术交流。

Selenium自动化淘宝秒杀实战:从原理到反检测策略 Web自动化测试是软件工程中确保Web应用质量的关键技术,其核心原理是通过程序模拟用户操作浏览器,实现页面导航、元素交互与数据验证。Selenium WebDriver作为该领域的经典框架,凭借其跨平台、多语言支持及真实浏览器驱动能力,为自动化测试与数据采集提供了稳定基础。在电商、金融等高频交互场景中,自动化技术能显著提升操作效率与一致性,例如在抢购活动中实现精准定时触发。本文以淘宝秒杀为具体案例,深入探讨如何利用Selenium进行元素定位、Cookie管理及反检测策略设计,其中反爬虫机制与自动化测试的对 阅读详情

相关推荐

Playwright MCP 接入 Chrome 登录态:实现自动化脚本的身份继承

浏览器自动化是现代Web开发和测试中的关键技术,它通过模拟用户操作实现流程自动化。其核心原理在于控制浏览器实例执行点击、输入、导航等行为。这项技术的价值在于能够替代大量重复性人工操作,提升效率与准确性。在众多应用场景中,如企业内部系统操作、社交媒体管理、电商运营等,往往需要处理复杂的登录状态(Session),这是传统自动化脚本的痛点。本文聚焦于结合 Playwright 这一现代浏览器自动化框架与 MCP(Model Context Protocol)协议,深入探讨如何安全、高效地复用 Chrome 浏览

weixin_34185320的博客 404

Java 使用Selenium调用浏览器(chrome)下载动态网页源代码爬虫爬取页面

selenium 是一套 web 自动化测试的软件。他能够通过编程的方式调用系统的浏览器,并驱动浏览器模拟人的方式进行操作。例如点击、输入信息、滚动屏幕等。通过这样的方式,我们就可以在程序中自动运行我们的 web 页面。同时,对于爬虫程序来说,也可以驱动浏览器访问我们要的目标页面,并且因为是在浏览器中访问的网页,所以浏览器会自动渲染动态的内容。这样就可以解决上次发生的用 OkHttp 下载网页无法获取到动态内容的问题。

細水、長流√的专栏 2239

Python Selenium自动化实战:雨课堂智能签到脚本开发指南

浏览器自动化是Web开发和测试领域的基础技术,其核心原理是通过程序模拟用户在浏览器中的操作行为,实现对网页元素的定位、交互与状态监控。这项技术的核心价值在于将重复、耗时的线上操作流程化、自动化,从而显著提升工作效率与准确性。在工程实践中,Python与Selenium的组合因其生态成熟、学习曲线平缓而成为实现自动化的首选方案,广泛应用于数据抓取、表单自动填写、功能测试及日常任务自动化等场景。本文聚焦于一个具体的应用实例——针对智慧教学平台“雨课堂”的签到环节,详细解析如何利用Selenium进行元素定位、用

shirlly 835

Java Web——使用Filter实现用户登录

(1)了解什么是Filter。(2)熟悉Filter的拦截过程和接口中的方法。(3)掌握第一个Filter程序的编写方法。(4)能够使用Filter实现用户自动登录通过前面的学习,我们已经了解到,使用Cookie可以实现用户自动登录的功能。但是使用Cookie实现用户自动登录后,当客户端访问服务器的Servlet时,所有的Servlet都需要对用户的Cookie信息进行校验,这样势必会导致在Servlet程序中书写大量重复的代码。为了解决这种问题,可以在Filter。

Liwo4418的博客 2881

Python Selenium自动化填表:从环境搭建到批量处理实战

浏览器自动化是提升Web操作效率的核心技术,其原理是通过程序指令模拟真实用户对浏览器的交互行为。这项技术的核心价值在于将重复、耗时的网页操作(如数据录入、功能测试)转化为可编程、可复用的自动化流程,从而解放人力,减少错误。在数据采集、系统测试、RPA(机器人流程自动化)及日常办公自动化等场景中,浏览器自动化扮演着关键角色。本文聚焦于利用Python和Selenium这一经典组合,深入讲解如何实现网页表单的自动化填写,特别是针对包含下拉框、单选框、复选框及文件上传等复杂元素的表单,提供从环境配置、元素定位到批

weixin_34375251的博客 466

Python Selenium自动化网页浏览实战:从环境搭建到数据采集

网页自动化技术是现代软件工程和数据分析领域的基础能力,它通过程序模拟真实用户操作浏览器,实现任务的自动化执行。其核心原理基于浏览器控制协议,允许外部程序发送指令来驱动浏览器进行导航、点击、输入等交互。这项技术的价值在于将重复性的人工操作转化为可编程、可调度、可复用的数字流程,显著提升工作效率和准确性。在应用场景上,它广泛覆盖了自动化测试、数据采集、业务流程自动化等多个领域。本文聚焦于Python Selenium这一经典组合,深入解析其工具链构成,并通过实战项目演示如何构建健壮的自动化数据采集任务,其中涉及

weixin_30635053的博客 368

Selenium自动化登录实战:从原理到避坑的完整指南

Web自动化是提升测试效率和业务流程自动化的关键技术,其核心在于模拟真实用户与浏览器的交互。Selenium作为主流的浏览器自动化工具,通过WebDriver协议驱动真实浏览器,能够执行点击、输入、导航等操作,有效处理JavaScript渲染和动态内容。这项技术的核心价值在于将重复、手动的Web操作转化为稳定、可编程的流程,大幅提升执行一致性并支持无人值守任务。在自动化测试、数据抓取、日常办公流程自动化等场景中,自动化登录往往是关键的第一步。本文聚焦于使用Selenium构建健壮的自动化登录模块,深入探讨了

weixin_34302561的博客 354

Java Selenium Web自动化实战:从环境搭建到框架构建

Web自动化测试是现代软件开发中提升效率与质量的关键技术,其核心原理是通过程序模拟用户与浏览器的交互行为。Selenium作为主流的浏览器自动化框架,通过WebDriver API提供了一套标准化的跨语言接口,允许开发者用代码驱动浏览器执行点击、输入、导航等操作。这项技术的核心价值在于能够处理JavaScript动态渲染的复杂页面,模拟真实用户操作流,从而广泛应用于功能回归测试、数据采集(爬虫)、RPA流程自动化等场景。对于Java开发者而言,集成Selenium意味着能利用熟悉的Maven/Gradle生

cuizhu0832的博客 329

Playwright连接已登录Chrome实现自动化:绕过复杂登录的实战指南

浏览器自动化是现代数据采集和系统集成中的关键技术,其核心在于模拟用户操作以完成重复性任务。传统方案常因登录环节的验证码、动态令牌等复杂验证而受阻,导致脚本稳定性差、维护成本高。通过复用已有浏览器会话的身份状态,可以巧妙绕过登录难题,大幅提升自动化成功率与效率。Chrome DevTools Protocol (CDP) 为此提供了底层支持,允许外部工具通过调试端口远程控制浏览器实例。Playwright 作为新一代自动化框架,其 `connect_over_cdp` API 封装了连接细节,使得连接已登录的

weixin_33704591的博客 392

Web自动化测试Cookie复用实战:原理、Selenium/Playwright实现与避坑指南

在Web自动化测试与开发中,Cookie作为HTTP协议的核心组件,是维持用户会话状态的关键技术。其本质是服务器发送到浏览器并存储的文本数据,用于在后续请求中标识用户身份。理解Cookie的工作原理,有助于解决自动化测试中反复登录导致的效率低下、资源消耗和风控触发等问题。通过复用Cookie,测试脚本可以跳过登录流程,直接进入业务测试,从而显著提升测试执行效率、降低环境依赖,并实现跨脚本的状态共享。这一技术对于UI自动化回归测试、数据驱动测试以及需要登录状态的API接口测试等场景具有重要价值。本文以Sele

weixin_34379433的博客 405

Web自动化测试:验证码与Cookie处理策略与实战

验证码与Cookie是Web自动化测试中的核心挑战。验证码作为人机识别机制,旨在防止自动化脚本模拟人类操作,其类型包括图片字符、滑动拼图、点选文字及智能行为验证码等。Cookie则是HTTP无状态协议下维持会话状态的关键技术,通过存储服务器下发的会话标识,实现用户身份的持续认证。在自动化测试中,有效处理验证码和Cookie能极大提升脚本的稳定性和执行效率,避免因登录环节中断或状态丢失导致测试失败。例如,通过Cookie复用技术,可以绕过验证码直接恢复登录状态,适用于功能回归、数据驱动及性能测试等场景。本文结

weixin_34068198的博客 346

Python自动化实战:从Selenium到Jenkins,构建高效工作流

自动化技术旨在通过脚本或程序替代重复性人工操作,其核心原理是模拟用户行为或调用系统接口。在技术实现层面,Python凭借其简洁语法和丰富的生态库,成为自动化领域的首选语言。从Web自动化、桌面GUI操作到办公文档处理,Python提供了Selenium、Playwright、PyAutoGUI、openpyxl等一系列成熟工具链,能够显著提升工作效率并减少人为错误。特别是在Web自动化场景中,Selenium通过WebDriver控制浏览器,结合显式等待和Page Object Model设计模式,可以构建

weixin_34417200的博客 371

Java selenium设置chrome浏览器保持登录方法

org.seleniumhq.selenium 是 Selenium 的 Java 客户端库,用于自动化测试 Web 应用程序。Selenium 是一套用于浏览器自动化的工具集,能够模拟用户在网页上的操作,进行功能测试和界面测试等。通过 org.seleniumhq.selenium 库,开发者可以编写自动化测试脚本来验证 Web 应用程序的正确性和可靠性。下面对 org.seleniumhq.selenium 的主要功能进行详细解释。

洛阳泰山的博客 3637

Python Selenium自动化抢票脚本开发:从原理到实战避坑指南

浏览器自动化是模拟用户操作、实现Web端任务自动执行的核心技术,其原理在于通过程序控制浏览器驱动,精确执行页面导航、元素定位与交互等操作。这项技术的核心价值在于将重复、高强度的手动流程转化为高效、稳定的自动化任务,极大地提升了在特定场景下的执行效率与成功率。在电商抢购、数据采集、自动化测试及RPA(机器人流程自动化)等应用场景中,它发挥着关键作用。本文聚焦于利用Python的Selenium库,深入探讨如何构建一个健壮的自动化抢票脚本,其中涉及对抗平台反爬策略、优化执行速度以及设计模块化架构等工程实践。通过

weixin_34224941的博客 561

Selenium实战【滑动验证码破解】【JAVA爬虫】

本文主要讲解,利用之前所学到的java selenium如何实战操作,浏览器控制鼠标,模拟人工操作滑动验证码。这里需要用javacv 的代码知识,用于计算图像中滑块需要移动的距离。

洛阳泰山的博客 3482

Visual Studio 2015 插件开发 从入门到放弃(一)

必需知识:C#和Visual Studio (1)安装 Visual Studio 2015 的时候选择 Visual Studio 扩展性工具(Visual Studio Extensibility Tools)。对于已经安装好 Visual Studio 2015 的小伙伴,可以找VS2015的安装包,或者在程序与功能中找VS2015双击,在VS2015界面中选择 修改,再选择

AncientPeople的博客 2万+

基于Selenium与Playwright的自动化简历投递工具设计与实现

浏览器自动化是现代软件工程中提升效率的关键技术,其核心原理是通过程序模拟用户操作,控制浏览器执行页面导航、元素交互和数据提交等任务。在Web自动化领域,Selenium以其成熟的生态和广泛的兼容性成为经典选择,而Playwright则凭借其现代化架构和强大的内置等待、网络拦截能力,为处理动态页面提供了更优解。两者的结合能有效应对不同场景下的稳定性与效率需求,技术价值在于将人力从重复、机械的Web操作中解放出来,实现流程的标准化与无人值守。这一技术广泛应用于自动化测试、数据采集和业务流程自动化等场景。本文聚焦

308

RV1126上YOLOv8部署实战:从模型转换到板端推理的完整避坑指南

本文提供了在瑞芯微RV1126芯片上部署YOLOv8目标识别算法的完整实战指南。内容涵盖从模型转换、环境搭建到板端推理代码编写的全流程,重点解析了RKNN-Toolkit使用、量化配置、内存优化及后处理实现等关键环节的常见问题与解决方案,旨在帮助开发者高效避坑,实现边缘AI应用的稳定落地。

pz89012345的博客 568

Selenium自动化实战:动态网页数据抓取与学堂在线作业处理

Web自动化是提升数据处理效率的关键技术,其核心原理是通过程序模拟用户操作,实现对网页的交互与内容获取。在动态网页技术广泛应用的今天,传统的静态爬虫难以应对JavaScript渲染的内容,而Selenium等浏览器自动化工具则能驱动真实浏览器,完整执行页面逻辑,从而稳定获取渲染后的DOM结构。这一技术价值在于能够处理复杂交互场景,如登录验证、异步加载和动态元素操作,广泛应用于数据采集、测试自动化和流程集成等领域。以学堂在线这类现代教育平台为例,其作业系统常采用动态加载,Selenium结合Python生态,

weixin_30321449的博客 455

国密USB Key开发实战:SKF库调用全流程解析(附代码示例)

本文详细解析了国密USB Key开发中SKF库的调用全流程,涵盖从设备枚举、应用容器遍历到数字签名与验证的核心步骤。通过实战代码示例,深入探讨了SKF库的层次化模型、SM2签名实现细节以及纯软件验签方案,为开发电子签章、安全登录等合规应用提供了一套完整的调用开发指南。

oo7890的博客 527

RiscV运行zephyr和Linux的方法

riscv基金会搞了一个网站,用于介绍如何使用riscv指令集进行开发。 对于运行zephyr和linux以及Qemu有非常大的帮助。 可以作为riscv开发的相关参考。 RISC-V - Getting Started Guide — RISC-V - Getting Started Guidehttps://risc-v-getting-started-guide.readthedocs.io/en/latest/index.html RISC-V - Getting Started Gu.

闲人的专栏 737

Selenium自动化免登录:彻底搞懂Chrome user-data-dir配置与实战

浏览器配置文件目录是Chrome存储Cookie、LocalStorage、扩展程序及登录态的核心位置,它决定了浏览器能否“记住”用户状态。在自动化测试中,WebDriver默认会为每次会话创建临时目录,导致Selenium启动的浏览器始终像全新安装一样,登录态丢失、验证码频发、扩展消失。通过显式指定user-data-dir参数,可以让自动化浏览器复用固定的用户数据目录,从而保留会话信息,实现免登录操作。这一技术既能解决登录态持久化问题,也能支持多账号环境隔离和扩展程序自动加载,广泛适用于定时报表下载、爬

weixin_27734811的博客 212

基于STM32设计的物联网疫苗冷链物流监测系统

本设计基于物联网技术,开发了一套疫苗冷链物流环境监测系统。系统采用STM32F103C8T6作为主控芯片,集成SHT30温湿度传感器、震动传感器、GPS定位模块和4G通信模块,实现对运输环境的温度、湿度及震动状况的实时监测与控制。通过继电器驱动半导体制冷模块和加湿器,系统能够自动调节环境温湿度,保障疫苗运输的安全性。采集的环境数据通过MQTT协议上传至华为云物联网平台,配套开发的Android手机APP和Windows上位机软件基于Qt平台设计,支持远程实时查看环境数据和车辆定位,提升了疫苗冷链运输的智能化

865
上一篇: Chrome浏览器关闭自动更新(带安装包)
梅子、酒~
博客等级 码龄7年 2粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值