网页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("=======等待登录成功后跳转到页面

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线