登录QQ之后,能干的事情很多。这里只讲述如何自动登录,至于自动登录之后干啥,根据自己需求自由发挥。
授人以鱼不如授人以渔,我把思路分享出来。
其实也有很多不可控的因素,比方说QQ自己的服务器不行,我就碰到过几次,访问QQ,贼慢,结果导致脚本异常。
现在的处理方法就是,捕获所有异常,只要捕获到异常,脚本终止,通知管理员。这应该是我目前觉得稍微好点的处理方法了。
一、登录
下载selenium相应的jar包。加载ChromeDriver驱动,下载地址
加载驱动之后,就可以考虑开始登录了。
- 切换账号密码登录
- 输入账号
- 输入密码
- 登录
注意,这期间是需要有时间间隔的,因为可能会有网速的影响,所以我在切换账号密码登录和登录这两步中,分别设定了间隔1秒和5秒。
如果页面还没加载完成,就开始执行程序,那会报错。因为没有找到指定的元素。
二、自动解锁滑块验证码
也可以到这里进行滑块测试,代码需要进行修改
本来是想通过识别图像像素或者对比度的方法,来找出滑块缺失的位置。后来发现,腾讯并没有做得那么牛逼。
经过多次测试,发现,QQ的滑块验证,并不是随机产生的,而是固定的。不管怎么弄,都会有三个固定位置。190px,205px,215px.
换句话说,我们顶多尝试进行三次登录,肯定是能登录成功的。
2020年7月10日更新
今天答辩,正好早上4点多我在床上躺着翻来覆去睡不着,想答辩的事。结果到点了,我的签到通知没发给我,我就意识到,坏了,出bug。
然后睡意全无,由于我答辩的报告还没写,所以还是写报告为重,整到上午12点,我的答辩报告和程序优化得差不多了。下午答辩完之后,上传开源内容到github,打了一个多小时游戏,不好玩,就去睡了两个小时觉。醒来已经七点半了。
仔细分析一波,原来是正确输入账号密码后,登录验证没了,导致脚本还在按有验证码的时候处理,所以只需要判断一下当前页面是否是验证码页面
若是,则解锁
若否,则已经成功了
为了让发生错误能够及时提醒我,我把所有的异常都捕获,只要捕获到异常,立即终止程序,并邮件通知我
放上完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
| public class AutoLogin { private static ChromeDriver driver; private static String oldUrl; private static String newUrl;
public static void quitDriver(Exception e) { e.printStackTrace(); driver.quit(); String[] mail = { "QQ自动登录异常", "登录失败,原因:"+e.getClass().getName()+"\n引起该异常的原因\n1.网络超时\n2.需要输入手机验证码" }; SendMail.send(mail); System.exit(0); }
public static void getDriver() {
System.setProperty("webdriver.chrome.driver", "chromedriver.exe"); System.setProperty("webdriver.chrome.silentOutput", "true"); java.util.logging.Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.addArguments("--headless"); driver = new ChromeDriver(chromeOptions); }
public static String getSkey(String u, String p) { String skey = null; if (login(u, p)) { skey = driver.manage().getCookieNamed("skey").toString().split(";")[0].substring(5); } else { String[] mail = { "QQ自动登录异常", "获取skey失败\n请检查网络是否超时,或者腾讯是否已更新验证码" }; SendMail.send(mail); driver.quit(); System.exit(0); } driver.quit(); return skey; }
public static boolean login(String u, String p) { Date date=new Date(); System.out.println(date.toLocaleString()+" 开始登录..."); getDriver(); boolean flag = false; driver.get( "https://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=https%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=https%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone%26specifyurl%3Dhttp%253A%252F%252Fuser.qzone.qq.com%252F252252252&pt_qr_app=%E6%89%8B%E6%9C%BAQQ%E7%A9%BA%E9%97%B4&pt_qr_link=http%3A//z.qzone.com/download.html&self_regurl=https%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http%3A//z.qzone.com/download.html&pt_no_auth=1"); try { Thread.sleep(1000); driver.findElement(By.id("switcher_plogin")).click(); Thread.sleep(500); driver.findElement(By.id("u")).clear(); driver.findElement(By.id("u")).sendKeys(u); driver.findElement(By.id("p")).clear(); driver.findElement(By.id("p")).sendKeys(p); driver.findElement(By.id("login_button")).click();
Thread.sleep(5000); int[][] arr = { { 10, 20, 30, 40, 50, 18 }, { 10, 20, 30, 40, 50, 18, 30 }, { 10, 20, 30, 40, 50, 18, 15 },
}; oldUrl = driver.getCurrentUrl();
if(oldUrl.contains("https://user.qzone.qq.com/")) { flag=true; }else { for (int i = 0; i < arr.length; i++) { System.out.print("正在尝试第" + (i + 1) + "次登录:"); if (unlock(arr[i])) { System.out.println("登录成功"); flag = true; break; } else { System.out.println("登录失败"); flag = false; } Thread.sleep(2000); } } } catch (Exception e) { quitDriver(e); } return flag;
}
public static boolean unlock(int[] arr) { boolean flag = false; Actions actions = new Actions(driver); try { driver.switchTo().frame("tcaptcha_iframe"); WebElement slideBtn = driver.findElement(By.id("tcaptcha_drag_button")); actions.clickAndHold(slideBtn).perform(); for (int i : arr) { actions.moveByOffset(i, 0).perform(); } actions.release(slideBtn).perform(); Thread.sleep(3000); newUrl = driver.getCurrentUrl(); if (oldUrl.equals(newUrl)) { driver.switchTo().defaultContent(); flag = false; } else { flag = true; } Thread.sleep(500); } catch (Exception e) { quitDriver(e); } return flag; } }
|
三、总结
3.1 感谢大佬
java selenium破解腾讯滑动验证码
java Selenium 滑块验证破解
java opencv 计算滑块横移距离
QQ空间访客爬虫
QQ空间模拟登录
3.2 个人收获以及最近的状况
刚开始学习编程时的大大小小的愿望都已经实现了。原来以为,我只要能做到这些,就很牛逼了。
现在发现,自己还是很菜。离牛逼,很远很远。
实现功能很容易。代码量也不多。这是因为已经有伟人把我们该做的,做完了。
站在巨人的肩膀上,应该保持谦逊的姿态。
身为开发者,应该也要有这样的追求。Make IT Easy and Better。为开源做出贡献!
最近情绪很低落,要考研,却又没有什么大的进步,不会的东西很多很多。导致心烦意乱。
有想做的事,也有不得不做的事,这就导致了我的迷茫和焦虑。我也不知道如何处理。半夜了,写得很乱,就这样吧。睡觉去了。