言成言成啊 | Kit Chen's Blog

自动滑块验证登录QQ

发布于2020-05-27 01:51:01,更新于2020-07-20 07:47:19,标签:java open  转载随意,文章会持续修订,请注明来源地址:https://meethigher.top/blog

登录QQ之后,能干的事情很多。这里只讲述如何自动登录,至于自动登录之后干啥,根据自己需求自由发挥。

授人以鱼不如授人以渔,我把思路分享出来。

其实也有很多不可控的因素,比方说QQ自己的服务器不行,我就碰到过几次,访问QQ,贼慢,结果导致脚本异常。

现在的处理方法就是,捕获所有异常,只要捕获到异常,脚本终止,通知管理员。这应该是我目前觉得稍微好点的处理方法了。

一、登录

下载selenium相应的jar包。加载ChromeDriver驱动,下载地址

加载驱动之后,就可以考虑开始登录了。

  1. 切换账号密码登录
  2. 输入账号
  3. 输入密码
  4. 登录

注意,这期间是需要有时间间隔的,因为可能会有网速的影响,所以我在切换账号密码登录登录这两步中,分别设定了间隔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", "C:\\Users\\kitchen\\Desktop\\chromedriver.exe");
// 打包
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
// 下面两行代码关闭无用的log
System.setProperty("webdriver.chrome.silentOutput", "true");
java.util.logging.Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF);
ChromeOptions chromeOptions = new ChromeOptions();
// 这是指不打开GUI模式
chromeOptions.addArguments("--headless");
driver = new ChromeDriver(chromeOptions);
}

/**
* 获取登录的skey
* @param u
* @param p
* @return
*/
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;
}

/**
* 登录
*
* @param u
* @param p
* @return true表示登录成功
*/
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();

/*
* 此处2020年7月10号更新,我已经使用该脚本实现连续自动登录90天。
* 今天突然出问题了。
* 由于今天还要准备考试,我就拖到了晚上才整
* 分析了一波,是因为固定ip地址登录90天,腾讯认为我的账号不具备威胁性了,
* 所以没了验证码,而脚本还是按有验证码执行肯定会报错。
* 加个逻辑判断即可
*/
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;

}

/**
* 自动进行滑块解锁
*
* @return true表示解锁成功
*/
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。为开源做出贡献!

最近情绪很低落,要考研,却又没有什么大的进步,不会的东西很多很多。导致心烦意乱。

有想做的事,也有不得不做的事,这就导致了我的迷茫和焦虑。我也不知道如何处理。半夜了,写得很乱,就这样吧。睡觉去了。

发布:2020-05-27 01:51:01
修改:2020-07-20 07:47:19
链接:https://meethigher.top/blog/2020/qq-autologin/
标签:java open 
付款码 打赏 分享
若无法评论请科学上网
shift+ctrl+1可控制目录显示