admin管理员组

文章数量:1639930

开源地址:https://github/1015770492/autoLoginQQWithAnyWeb

注意:如果你下载了源码,想在自己的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} name是在枚举对象中定义WebLoginEnum,两个参数的构造方法 第一个参数就是name,第二个参数就是登录页面的url
QQ音乐登录在线地址格式:
http://yumbo.top:7000/login/qq/music?username=qq号&password=qq密码&format=2
网易云音乐登录在线地址格式:
http://yumbo.top:7000/login/qq/netease?username=qq号&password=qq密码&format=2
csdn
QQ音乐登录在线地址格式(post/get都可以,也支持json字符串):
http://yumbo.top:7000/login/qq/csdn?username=qq号&password=qq密码&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自动登录并获取cookie

完整的环境搭建过程

github显示不了图片的到csdn看我博客:实现所有网站的qq登录返回登录后的cookie信息

原理和实现

第一步给Linux服务器安装google-chrome(谷歌浏览器)

Centos操作系统的使用下面这个

下载rpm包

wget https://dl.google/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: Download is performed unsandboxed as root as file ‘/root/google-chrome-stable_current_amd64.deb’ couldn’t be accessed by user ‘_apt’. - pkgAcquire::Run (13: Permission denied)


下载deb包

wget https://dl.google/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浏览器,也就是通过它来对谷歌浏览器操作的

下载地址:https://npm.taobao/mirrors/chromedriver/

随便选一个吧,我选的是这个版本的:https://npm.taobao/mirrors/chromedriver/86.0.4240.22/


将它上传到linux服务器上,通过FTP工具
ftp工具 例如:FileZila下载页面选择适合自己的
或者xftp
ftp 工具 和 chromedriver也可以通过下面的csdn进行下载,我将它打包成了一个zip包。也可以选择前面发的链接自行下载接口
https://download.csdn/download/qq_41813208/14503894

将他上传到一个目录下,例如/root

授予执行权限

执行完后就会是绿色的提示。

chmod 777 chromedriver

第三步、下载jar包,或者去github自行打成jar包

jar包下载地址:https://github/1015770492/autoLoginQQWithAnyWeb/releases/tag/1.0

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是指定驱动的位置,请更改为正确的位置


如果是默认的root目录下操作更改对应得路径即可

java -jar -Dwebdriver.chrome.driver=/root/chromedriver \
-Dserver.port=7000 autoLoginQQWithAnyWeb-1.0.jar

第四步发送请求得到cookie信息

get/post都支持,接收json/传参数
如下
接口地址:http://yumbo.top:7000/login/{name}
qq音乐在线地址:http://yumbo.top:7000/login/music
网易云音乐在线地址:http://yumbo.top:7000/login/netease
csdn在线地址:http://yumbo.top:7000/login/csdn

下面是qq音乐的登录地址(qq音乐它不会跳转到后面的那个界面,需要通过抓包分析)
替换下面的username和password即可完成登录获取登录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对象的方式返回{"cookie":"cookie字符串或原生数组"}

处理请求的Controller源码
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<Cookie> 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("=======等待登录成功后跳转到页面<<<<<<<<<<<");
            chromeDriver.navigate().refresh();// 刷新页面获取cookie,不然会导致cookie数据有问题
            //获得cookie
            Set<Cookie> coo = manage.getCookies();// 得到所有cookie
            //打印cookie
            System.out.println(coo);

            if (format.equals("2")) {
                final String cookie = parseCookieSet(coo);
                cookieJson.put("cookie", cookie);// 解析cookie并添加
            } else {
                cookieJson.put("cookie", coo);
            }
            manage.deleteAllCookies();// 每次登录完就清除cookie
        } catch (Exception e) {
            System.out.println("抛异常了");
            e.printStackTrace();
        }
        return cookieJson;
    }


    /**
     * @param jsonObject 可选,目的是兼容json数据,可能客户端两种都传
     * @param url        可选,目的是兼容json数据,可能客户端两种都传
     * @param username   qq账号
     * @param password   qq密码
     * @param format     默认1返回的cookie为json,传入的不是1则返回精简版的cookie
     * @return cookie类型的json数据,cookie咋json的cookie字段中
     */
    @Deprecated
    @RequestMapping(value = "/login/qq", method = {RequestMethod.GET, RequestMethod.POST})
    public JSONObject loginQQBackCookie(@RequestBody(required = false) JSONObject jsonObject,
                                        @RequestParam(value = "url", required = false) String url,
                                        @RequestParam(value = "username", required = false) String username,
                                        @RequestParam(value = "password") String password,
                                        @RequestParam(value = "format", required = false, defaultValue = "1") String format
    ) {

        if (StringUtils.hasText(url) && StringUtils.hasText(username) && StringUtils.hasText(password)) {
            // 什么也不做
        } else if (jsonObject != null && StringUtils.hasText(jsonObject.getString("url")) &&
                StringUtils.hasText(jsonObject.getString("username")) &&
                StringUtils.hasText(jsonObject.getString("password"))
        ) {
            url = jsonObject.getString("url");
            username = jsonObject.getString("username");
            password = jsonObject.getString("password");
            format = jsonObject.getString("format");
        } 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);
                info.put("url", url);
                info.put("format", format);
                error.put("输入了错误的信息", info);
            }
            return error;
        }

        return LoginAndGetCookie(username, password, url, format);
    }

}

本文标签: 网站信息qqcookie