网页qq抓取什么原理(Java+selenium-java实现qq自动登录并获取cookie路径 )
优采云 发布时间: 2021-10-31 13:14网页qq抓取什么原理(Java+selenium-java实现qq自动登录并获取cookie路径
)
开源地址:
注意:如果下载了源码,想在自己的windows环境下测试,把源码添加到top.yumbo.music.test.configuration.ChromeAutoConfigration
打开指定chromedriver路径的注释,指向正确的chromedriver路径,(chromedriver是驱动,电脑上也需要chrome浏览器)
// 打开注释并且将值设置为正确的路径
System.setProperty("webdriver.chrome.driver", "D:/Program Files (x86)/chromedriver/chromedriver.exe");
Windows和Linux类似,只要环境设置好,然后就可以快速执行程序登录
全局参数说明
项目中暴露了两种类型的接口:(可以使用post/get,也支持json字符串请求)
返回数据的格式:如果没有填写format,则默认返回Cookie对象
一种是已经写好的登录,比如qq音乐,网易云音乐,csdn网站可以直接在请求路径中处理
一种是通过传入登录页面的URL来登录
如何使用第一类接口:
请求路径:/login/qq/{name} 在枚举对象WebLoginEnum中定义name,两个参数的构造方法,第一个参数是name,第二个参数是登录页面的url
QQ音乐登录在线地址格式:
:7000/login/qq/music?username=number&password=password&format=2
网易云音乐登录在线地址格式:
:7000/login/qq/netease?username=number&password=password&format=2
csdn
QQ音乐登录在线地址格式(post/get都可以,也支持json字符串):
:7000/login/qq/csdn?username=number&password=password&format=2
如何使用第二个界面
请求路径:/login/qq
在线地址格式:
注意:注意url编码问题,传入的url可以直接从浏览器地址栏复制过来,如果是自己抓取解析的,注意编码
http://yumbo.top:7000/login/qq?username=qq号&password=qq密码&format=2&url=登录页面的url
如果想看效果,看这篇博客,有gif演示效果:
java+selenium-java实现QQ自动登录并获取cookies
完整的环境搭建流程
如果github不能显示图片,去csdn看我的博客:实现网站的所有QQ登录都返回登录后的cookie信息
原理与实现 第一步在Linux服务器上安装google-chrome(谷歌浏览器)
Centos操作系统的使用如下
下载rpm包
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
安装依赖
sudo yum install -y lsb
安装
sudo yum localinstall google-chrome-stable_current_x86_64.rpm
对于 Ubuntu 用户,请使用以下命令
以下命令不建议以root身份下载
因为可能会报告权限问题:
N: 下载是作为 root 作为文件'/root/google-chrome-stable_current_amd64.deb' 无法被用户'_apt'访问执行的。-pkgAcquire::Run (13: Permission denied)
下载 deb 包
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
安装 deb 包
sudo apt install -y ./google-chrome-stable_current_amd64.deb
完成后,Centos 和 Ubuntu 将多了一个命令
google-chrome
第二步是下载chromedriver。它的功能是操作google-chrome浏览器,也就是通过它来操作谷歌浏览器
下载链接:
随便选一个,我选的是这个版本:
通过FTP工具上传到linux服务器
ftp 工具如:FileZila 下载页面选择适合你的
或者 xftp
ftp工具和chromedriver也可以通过下面的csdn下载,我是打包成zip包的。您也可以通过选择之前发布的链接自行下载界面
把他上传到一个目录,比如/root
授予执行权限
执行后会出现绿色提示。
chmod 777 chromedriver
第三步,下载jar包,或者自己去github制作一个jar包
jar包下载地址:
需要先修复java环境
对于 Ubuntu: apt install -y openjdk-14-jre-headless 进行安装
Centos: yum install -y java-11-openjdk-devel.x86_64 即可安装(如需配置环境变量可自行配置)
是springboot项目,端口为:7000,可以通过运行参数-Dserver.port修改启动端口
提醒
-Dwebdriver.chrome.driver 是指定驱动器的位置,请改成正确的位置
如果是默认的根目录,可以更改对应的路径
java -jar -Dwebdriver.chrome.driver=/root/chromedriver \
-Dserver.port=7000 autoLoginQQWithAnyWeb-1.0.jar
第四步,发送获取cookie信息的请求
都支持get/post,接收json/pass参数
如下
接口地址:7000/login/{name}
QQ音乐在线地址:7000/登录/音乐
网易云音乐在线地址:7000/登录/网易
csdn在线地址:7000/login/csdn
以下是qq音乐的登录地址(qq音乐不会跳转到后台界面,需要通过抓包来分析)
替换下面的用户名和密码完成登录QQ音乐后获取cookie
复制方便:以下模板只适用于qq音乐,其他网站可以直接复制url代替这个参数的url,根据页面补充如下参数
http://yumbo.top:7000/login/qq/music?username=qq号&password=qq密码&format=2
参数补充说明
以CSDN的登录页面为例,请求地址如下
上面地址之后会跳转到下面的页面(上面的地址会自动跳转到请求授权的页面)
这里有一个过程。该地址的服务器会自动向腾讯的oauth2.0服务器发送请求,然后返回这个统一授权页面。因为这个页面是统一的,所以写了脚本。它会自动点击账号和密码登录===>输入账号和密码==>QQ登录成功后会自动跳转到回调地址,然后在登录后获取cookie成功的
然后我抓住了机会。一般来说,如果我通过上述方式获取url,应该不是拖放验证的步骤。
枚举网站的登录页面地址,然后访问地址,输入用户名和密码登录,登录成功后会自动跳转到登录页面,刷新一次页面,然后得到cookie,并将cookie传输到json Object return {"cookie":"cookie string or native array"}
处理请求的控制器源代码
<p>package top.yumbo.music.test.controller;
import com.alibaba.fastjson.JSONObject;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import top.yumbo.music.test.web.WebLoginEnum;
import javax.annotation.Resource;
import java.util.Set;
@RestController
public class LoginController {
@Resource
ChromeDriver chromeDriver;
@Resource
WebDriver.Options manage;
/**
* cookie数据的处理
*
* @param cookies 传入cookie的集合
* @return k1=v1;k2=v2; 这种形式的cookie字符串
*/
private String parseCookieSet(Set cookies) {
if (cookies == null) {
return "";
}
System.out.println("\n解析前cookie是" + cookies.toString());
String cookieString = "";
for (Cookie cookie : cookies) {
if (StringUtils.hasText(cookie.getValue())) {// 为空的cookie则去除
cookieString += (cookie.getName() + "=" + cookie.getValue() + ";");
}
}
System.out.println("解析后:\n" + cookieString);
return cookieString;
}
@GetMapping({"/login/qq/{name}"})
public JSONObject commonLogin(@RequestBody(required = false) JSONObject jsonObject,
@PathVariable(value = "name") String name,
@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "password") String password,
@RequestParam(value = "format", required = false, defaultValue = "1") String format) {
if (StringUtils.hasText(username) && StringUtils.hasText(password)) {
// 什么也不做
} else if (jsonObject != null
&& StringUtils.hasText(jsonObject.getString("username"))
&& StringUtils.hasText(jsonObject.getString("password"))) {
username = jsonObject.getString("username");
password = jsonObject.getString("password");
} else {
final JSONObject error = new JSONObject();
if (jsonObject != null) {
error.put("输入了错误的信息", jsonObject);
} else {
final JSONObject info = new JSONObject();
info.put("username", username);
info.put("password", password);
error.put("输入了错误的信息", info);
}
return error;
}
return LoginAndGetCookie(username, password, name, format);
}
/**
* 登录已知类型的网站
*
* @param username qq账号
* @param password qq密码
* @param name 枚举登录页面的封装类,如果hashMap中没有则这个name就是登录页面的地址
* @param format 返回的cookie类型,1表示原cookie数据,2表示处理后的cookie
* @return json类型的cookie封装类
*/
public JSONObject LoginAndGetCookie(String username, String password, String name, String format) {
final JSONObject cookieJson = new JSONObject();
try {
// 登录前先清除cookie
final String url = WebLoginEnum.getUrl(name);
if (!StringUtils.hasText(url)) {
cookieJson.put("msg", "网站没有引入项目,请使用另外一个接口进行登录");
return cookieJson;
}
manage.deleteAllCookies();// 清除cookie
chromeDriver.get(url);// 访问登录页面
final WebDriver ptlogin_iframe = chromeDriver.switchTo().frame("ptlogin_iframe");
ptlogin_iframe.findElement(By.id("switcher_plogin")).click();
final WebElement u = ptlogin_iframe.findElement(By.className("inputstyle"));
u.clear();// 清空输入的用户名
u.sendKeys(username + "\n");// 输入账号
final WebElement p = ptlogin_iframe.findElement(By.id("p"));
p.clear();// 清空输入的密码数据
p.sendKeys(password + "\n");// 输入密码,回车就提交了下面的这个点击登录不需要
final String beforeUrl = chromeDriver.getCurrentUrl();
while (chromeDriver.getCurrentUrl().equals(beforeUrl)) {
// 页面没有跳转就让他等待,等待自己重定向到登录后的页面,然后再获取cookie时就是正确的cookie
}
System.out.println("=======等待登录成功后跳转到页面