java爬虫实现自动化操作gitlab私服

news/2024/7/19 8:58:07 标签: java, 爬虫, 自动化

maven依赖

 <!--gitlab API-->
        <!--解决gitlab依赖中的版本冲突        -->

        <dependency>
            <groupId>org.gitlab</groupId>
            <artifactId>java-gitlab-api</artifactId>
            <version>4.1.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>

            </exclusions>
        </dependency>

        <!--   模拟登录gitlab获取token-->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.10.2</version>
        </dependency>

封装工具类

java">package cn.sdu.weblab.util;

import cn.sdu.weblab.entity.User;
import cn.sdu.weblab.entity.pojo.Project;
import org.gitlab.api.GitlabAPI;
import org.gitlab.api.models.CreateUserRequest;
import org.gitlab.api.models.GitlabProject;
import org.gitlab.api.models.GitlabUser;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.IOException;
import java.util.Map;

public class GitlabUtil {

    static String ROOT_TOKEN = null;
    static GitlabAPI gitlab = null;

    static {
        try {
            ROOT_TOKEN = createPrivateToken("http", "XXXXXX", "8929", "XXXXX", "XXXXXXXXX", "weblab", "2022-07-07");
        } catch (Exception e) {
            e.printStackTrace();
        }
        gitlab = GitlabAPI.connect("http://XXXXXXXX/", ROOT_TOKEN);
    }

    /**
     * 爬虫获取私钥
     * @param protocol 请求协议
     * @param host 地址
     * @param port 端口
     * @param username 用户名
     * @param password 密码
     * @param tokenName token名字
     * @param expireDate 过期时间
     * @return
     * @throws Exception
     */
    public static String createPrivateToken(String protocol, String host, String port, String username, String password, String tokenName, String expireDate) throws Exception {
        StringBuffer sb = new StringBuffer();
        sb.append(protocol);
        sb.append("://");
        sb.append(host);
        sb.append(":");
        sb.append(port);
        String baseLocation = sb.toString();
        // 登录页面
        String loginHtml = baseLocation + "/users/sign_in";
        Connection loginHtmlConn = Jsoup.connect(loginHtml);
        Connection.Response loginHtmlRes = loginHtmlConn.execute();
        Document loginHtmlResDoc = Jsoup.parseBodyFragment(loginHtmlRes.body());
        // 从网页中取到authentication
        String auth = loginHtmlResDoc.getElementById("new_user")
                .select("input")
                .get(0)
                .attr("value");
        // 拿到第一个cookie 登录用
        String _gitlab_session = loginHtmlRes.cookie("_gitlab_session");
        // 开始登录
        String loginApi = baseLocation + "/users/sign_in";
        Connection loginApiConn = Jsoup.connect(loginApi);
        // 设计请求参数
        loginApiConn.cookie("_gitlab_session", _gitlab_session);
        loginApiConn.data("user[login]", username);
        loginApiConn.data("user[password]", password);
        loginApiConn.data("user[remember_me]", "0");
        loginApiConn.data("authenticity_token", auth);
        // 使用post请求
        loginApiConn.method(Connection.Method.POST);
        Connection.Response loginApiRes = loginApiConn.execute();
        //得到登录状态的cookie
        Map<String, String> loginStatusCookie = loginApiRes.cookies();
        // 开始获取token
        String accessTokenHtml = baseLocation + "/-/profile/personal_access_tokens";
        Connection tokenHtmlConn = Jsoup.connect(accessTokenHtml);
        //设置登录状态的cookie
        tokenHtmlConn.cookies(loginStatusCookie);
        // 从网页中取出authentication
        Document accessTokenHtmlDoc = tokenHtmlConn.get();
        String authenticity_token = accessTokenHtmlDoc
                .getElementById("new_personal_access_token")
                .select("input")
                .get(0)
                .attr("value");
        //创建token并获取
        String accessTokenCreateApi = baseLocation + "/-/profile/personal_access_tokens";
        Connection accessTokenCreateApiConn = Jsoup.connect(accessTokenCreateApi);
        accessTokenCreateApiConn.cookies(loginStatusCookie);
        //设置token参数
        //token的名字
        accessTokenCreateApiConn.data("personal_access_token[name]", tokenName);
        // token过时间
        accessTokenCreateApiConn.data("personal_access_token[expires_at]", expireDate);
        // token有哪些权限
        accessTokenCreateApiConn.data("personal_access_token[scopes][]", "api");
        accessTokenCreateApiConn.data("personal_access_token[scopes][]", "read_api");
        accessTokenCreateApiConn.data("personal_access_token[scopes][]", "read_user");
        accessTokenCreateApiConn.data("personal_access_token[scopes][]", "read_repository");
        accessTokenCreateApiConn.data("personal_access_token[scopes][]", "write_repository");
        accessTokenCreateApiConn.data("authenticity_token", authenticity_token);
        // 设置请求为post
        accessTokenCreateApiConn.method(Connection.Method.POST);

        Connection.Response accessTokenCreateApiRes = accessTokenCreateApiConn.execute();
        Document accessTokenCreateApiDoc = accessTokenCreateApiRes.parse();
        String token = accessTokenCreateApiDoc
                .getElementById("created-personal-access-token")
                .attr("value");
        System.out.println(token);
        return token;
    }

    public static String getRootToken() {
        return ROOT_TOKEN;
    }

    /**
     * 创建一个gitlab用户
     * @param user
     * @return
     * @throws IOException
     */
    public static GitlabUser createGitlabUser(User user) throws IOException {
        CreateUserRequest info = new CreateUserRequest(user.getUsername(), user.getUsername(), user.getEmail());
        // 设置密码
        info.setPassword(user.getPassword());
        // 跳过邮箱验证
        info.setSkipConfirmation(true);
        GitlabUser gitlabUser = gitlab.createUser(info);
        return gitlabUser;
    }

    /**
     * 创建一个gitlab项目仓库
     * @param project
     * @return
     * @throws IOException
     */
    public static GitlabProject createGitlabProject(Project project) throws IOException {
        GitlabProject userProject = gitlab.createUserProject(project.getGitlabUserId(), project.getName(), project.getDescription(), "master", null, null, null, null, null, null, null);
        return userProject;
    }

    /**
     * 删除一个gitlab项目
     * @param projectId
     * @throws IOException
     */
    public static void deleteGitlabProject(Integer projectId) throws IOException {
        gitlab.deleteProject(projectId);
    }
}


http://www.niftyadmin.cn/n/599402.html

相关文章

Java 怎样快速执行SQL 文件_用java执行SQL文件?

List sqlFileList new ArrayList();//从文件读放内容到按分号放到sqlFileListpublic List readSqlFiles(List fileNameList) {List sqlList new ArrayList();for (String fileName : fileNameList) {File myFile new File(fileName);if (!myFile.exists()) {System.err.prin…

答复Kinsinsega同学

<iframe align"top" marginwidth"0" marginheight"0" src"http://www.zealware.com/46860.html" frameborder"0" width"468" scrolling"no" height"60"></iframe>Kinsinsega同学…

Lind.DDD.RedisClient~对StackExchange.Redis调用者的封装及多路复用技术

回到目录 两雄争霸 使用StackExchange.Redis的原因是因为它开源&#xff0c;免费&#xff0c;而对于商业化的ServiceStack.Redis&#xff0c;它将一步步被前者取代&#xff0c;开源将是一种趋势&#xff0c;商业化也值得被我们尊重&#xff0c;毕竟人家研究代码也不容易&#x…

2007-08-24 日志:真正如里程碑般的日志

<iframe align"top" marginwidth"0" marginheight"0" src"http://www.zealware.com/46860.html" frameborder"0" width"468" scrolling"no" height"60"></iframe>心里彻底乱了……

idea插件开发——启动侦听事件

在项目打开时自动执行一些代码实现初始化操作 package cn.weblab.plugin.listener;import cn.weblab.plugin.config.Global; import cn.weblab.plugin.util.JGitUtil; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.project.Project; impor…

java开发是否用数字表示是_Java 判断是否为数字

开发工具与关键技术&#xff1a;Java&#xff0c;MyEclipse 10作者&#xff1a;吴永旗撰写时间&#xff1a;2019年6月3日在开发网站中填写表单信息是,有些字段信息必须是数字格式的&#xff0c;如用户年龄&#xff0c;工资收入&#xff0c;手机号码等&#xff0c;都必须是数字的…

java用回溯法解决子集和问题_子集和问题(回溯法)

一、问题简介描述子集和问题的一个实例为〈S,t〉。其中&#xff0c;S{ x1 &#xff0c; x2 &#xff0c;…&#xff0c;xn }是一个正整数的集合&#xff0c;c是一个正整数。子集和问题判定是否存在S的一个子集S1&#xff0c;使得&#xff1a;SUM(S1) c。试设计一个解子集和问题…

多语言构建工具Gradle发布3.0版本

Gradle 发布了该多语言构建工具的3.0里程碑版本。这个新发布版本的特性包括&#xff1a;\\Gradle云服务\\ 增强的Gradle Daemons:\ 默认启用 \\ 查看Gradle Daemons的状态 \\ 在Gradle云服务上查看Daemon信息\ \\ 更好的IDE支持&#xff1a;\ IntelliJ IDEA\\ Eclipse\\ Netbea…