Selenium QQ自动化登录

本文介绍了如何利用Selenium进行QQ登录,通过模拟真实用户行为,包括打开登录页、切换至密码登录、输入账号密码、点击登录并获取cookie,确保在无验证码场景下的高效稳定。重点讲解了获取p_skey cookie的方法和后续操作应用。
摘要由CSDN通过智能技术生成

系列文章目录

第一篇:Java实现QQ登录



前言

本文内容仅供学习参考,禁止商业用途

上篇文章中主要介绍如何利用java,通过模拟http的形式登录QQ,但是这种方式会因为tx更新密码加密算法而失效,所以本篇文章中会介绍如何通过Selenium来实现QQ的自动化登录


经过本人分析,因为浏览器在发送login之后,response body中并没有返回,而是将一系列登录信息都存放在cookie里了,那么就带来了另外一种登录方式。

登录

selenium登录

selenium可以实现自动的操作,就像人在浏览器中操作一样,而且通过配置,可以得到当前网页中的cookie和操作日志。

登录流程

详细登录流程见https://blog.csdn.net/majixiang1996/article/details/112651478

同样本文以登录https://lol.qq.com为例

在本文描述的登录方式中,只需要

  • 打开登录页
  • 点击切换到密码登录
  • 输入账号密码
  • 点击登录按钮
  • 获取cookie

这五个步骤,简单快捷稳定,只需要qq登录页没有大的改动的话,就不需要做改动。

selenium操作

  • 打开登录页
  // 登录主页
  driver.get("https://lol.qq.com/space/index.shtml");
  // 最大化
  driver.manage().window().maximize();
  // tx登录按钮在一个子iframe里,所以要把driver转向这个iframe
  WebDriver sd = driver.switchTo().frame(driver.findElement(By.id("loginIframe")));
  • 切换到密码登录
// 打开主页面的时候,是弹出二维码登录,所以需要找到切换按钮,切换成账号密码登录
WebElement sw = sd.findElement(By.id("switcher_plogin"));
// 登录按钮点击
sw.click();
  • 输入账号密码
driver.findElement(By.id("u")).sendKeys("your qq number");
driver.findElement(By.id("p")).sendKeys("your password");
  • 点击登录
driver.findElement(By.id("login_button")).click();
  • 获取cookie
// 将cookie全部打出到控制台
driver.manage().getCookies().stream().forEach(c -> System.out.println(c.toString()));

获取登录数据

在登录后的一堆数据中,我们需要拿到p_skey这个参数,但是p_skey这个cookie的domain是game.qq.com,而当前的url为lol.qq.com,直接输出cookie是拿不到这个值的,需要先重定向到game.qq.com
mark

  driver.get("https://game.qq.com");

不能通过执行js打开另外一个window,因为如果这样原window的cookie就拿不到了。

然后在cookie中就会发现p_skey这个参数
mark
后续的操作只需要拿着这个p_skey即可访问各种接口

完整代码

		System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");

        ChromeDriverProxy driver = null;

        ChromeOptions options = new ChromeOptions();
        options.addArguments("--disable-popup-blocking"); // 禁用阻止弹出窗口
        options.addArguments("no-sandbox"); // 启动无沙盒模式运行
        options.addArguments("disable-extensions"); // 禁用扩展
        options.addArguments("no-default-browser-check"); // 默认浏览器检查
        Map<String, Object> prefs = new HashMap();
        prefs.put("credentials_enable_service", false);
        prefs.put("profile.password_manager_enabled", false);// 禁用保存密码提示框
        options.setExperimentalOption("prefs", prefs);

        // set performance logger
        // this sends Network.enable to chromedriver
        LoggingPreferences logPrefs = new LoggingPreferences();
        logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
        logPrefs.enable(LogType.BROWSER, Level.ALL);
        options.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
        options.setExperimentalOption("w3c", false);
        // if your wantn't open the chrome head, you can set it true.
		// options.setHeadless(true);

        driver = new ChromeDriverProxy(options);
        driver.get("https://lol.qq.com/space/index.shtml");
		// login.
        driver.manage().window().maximize();
        WebDriver sd = driver.switchTo().frame(driver.findElement(By.id("loginIframe")));
        WebElement sw = sd.findElement(By.id("switcher_plogin"));
        sw.click();
        driver.findElement(By.id("u")).sendKeys("your qq number");
        driver.findElement(By.id("p")).sendKeys("your qq password");
        driver.findElement(By.id("login_button")).click();
        System.out.println(driver.getCurrentUrl());

		// select the lol area.
        Thread.sleep(2000);
        WebElement area = driver.findElement(By.id("areaContentId_lol"));
        Select select = new Select(area);
        select.selectByValue("19");
        driver.findElement(By.id("roleselecterlol")).click();
        Thread.sleep(2000);
        area.click();
        driver.findElement(By.id("confirmButtonId_lol")).click();
        Thread.sleep(1500);
        
        // get cookie.
        String newWindowUrl = "https://game.qq.com/";
        driver.get(newWindowUrl);
        driver.manage().getCookies().stream().forEach(c -> System.out.println(c.toString()));
        driver.manage().getCookies().stream().forEach(c -> System.out.println(c.getName() + "\t" + c.getValue()));
        pSkey = driver.manage().getCookieNamed("p_skey").getValue();
        System.out.println(pSkey);
        System.out.println(driver.manage().getCookieNamed("skey").getValue());

总结

通过selenium的方式登录无验证的QQ 方便快捷,而且稳定性比较高。所以本人是比较推荐使用这种方法去登录的。

最终的效果图如下:
在这里插入图片描述

下篇文章中将介绍有验证码的情况下的登录方式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值