禅道api调用(爬虫方式)

news2024/11/20 22:39:49

目录

获取所有进行中的项目信息

url

postman

Java代码

实体类

逻辑处理

根据项目id获取指定项目下所有未关闭的任务id

url

postman

Java代码

总结


获取所有进行中的项目信息

url

http://禅道地址xxx/zentao/project-all-doing-项目ID-order_desc-0.html

postman

Java代码

关于禅道登录的业务实现大家可以参考这篇博客:http://t.csdn.cn/I2uPU

实体类

package com.example.zentaoaibackend.entity;

import lombok.Data;
import java.util.Date;
import java.io.Serializable;

public class ProjectInfoEntity extends BaseAttribute {
    /**
     * 项目ID
     */
    private Integer projectId;

    /**
     * 项目名称
     */
    private String name;
    /**
     * 项目代号
     */
    private String code;
    /**
     * 项目负责人
     */
    private String director;
    /**
     * 项目截止日期
     */
    private Date endtime;
    /**
     * 是否参与消息推送
     */
    private int joinStatus;
    /**
     * 钉钉群id
     */
    private String dingGroupId;
    /**
     * 钉钉群名称
     */
    private String dingGroupName;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getDirector() {
        return director;
    }

    public void setDirector(String director) {
        this.director = director;
    }

    public Date getEndtime() {
        return endtime;
    }

    public void setEndtime(Date endtime) {
        this.endtime = endtime;
    }

    public int getJoinStatus() {
        return joinStatus;
    }

    public void setJoinStatus(int joinStatus) {
        this.joinStatus = joinStatus;
    }

    public String getDingGroupId() {
        return dingGroupId;
    }

    public void setDingGroupId(String dingGroupId) {
        this.dingGroupId = dingGroupId;
    }

    public String getDingGroupName() {
        return dingGroupName;
    }

    public void setDingGroupName(String dingGroupName) {
        this.dingGroupName = dingGroupName;
    }

    public void setProjectId(Integer projectId) {
        this.projectId = projectId;
    }

    public Integer getProjectId() {
        return projectId;
    }

}

逻辑处理

通过爬取返回的html页面格式如下图,我们根据给出的结构进行解析

import com.example.zentaoaibackend.entity.ProjectInfoEntity;
import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;


public List<ProjectInfoEntity> GetDoingProjectInfo() {
        List<ProjectInfoEntity> doingProjectList = new ArrayList<>();
        try {
            //登录禅道
            zentaoLogin();

            //url地址
            String url = "http://127.0.0.1/zentao/project-all-doing-422-order_desc-0.html";
            //执行url,并传入cookie
            Document doc = Jsoup.connect(url).cookie("zentaosid", Constant.ZENTAOID).get();
            //解析html页面,获取tr标签
            Elements tfElements = doc.select("table").select("tbody").select("tr");

            //遍历tr标签,根据任务状态获取对应的任务id,并放入到集合中
            for (Element element : tfElements) {
                //获取td标签
                Elements tdElements = element.select("td");
                //用于解析后的数据信息存储
                ProjectInfoEntity projectInfo = new ProjectInfoEntity();

                //遍历td标签
                for (Element tdElement : tdElements) {
                    //判断当前遍历的标签中class元素是否包含text-left
                    //包含:获取项目id
                    //不包含:继续下一次遍历
                    if (tdElement.attr("class").equals("text-left")) {
                        //获取项目ID
                        String attr = element.attr("data-id");
                        //将项目ID传入到实体中
                        projectInfo.setProjectId(Integer.valueOf(attr));

                        //因为返回的有多个td标签中都包含了class='text-left'的元素,我们不能直接获取项目信息,需要进行判断
                        //包含title元素:为项目代码;否则:为项目名称
                        if (tdElement.attr("title").equals("")) {
                            //项目代号
                            projectInfo.setCode(tdElement.text());
                        } else {
                            //项目名称
                            projectInfo.setName(tdElement.attr("title"));
                        }
                    }
                }
                doingProjectList.add(projectInfo);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        return doingProjectList;
    }


根据项目id获取指定项目下所有未关闭的任务id

url

http://禅道地址xxx/zentao/project-task-439-unclosed.html

postman

Java代码

package com.example.zentaoaibackend.utils.zentaoAPI;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import static com.example.zentaoaibackend.utils.zentaoAPI.DoGet.doGet;
import static com.example.zentaoaibackend.utils.zentaoAPI.login.ZentaoLogin.zentaoLogin;


/**
 * @BelongsProject: zentaoai-backend
 * @BelongsPackage: com.example.zentaoaibackend.utils.zentaoAPI
 * @Author: author
 * @CreateTime: 2022-11-26  11:14
 * @Description: 根据项目id获取指定项目下所有任务
 * @Version: 1.0
 */
@Component
public class GetProjectTask extends IJobHandler {
    public List<String> GetTaskByProjectId(String projectId) throws IOException {
        List<String> unClosedList = new ArrayList<>();
        try {
            zentaoLogin();
            //url地址
            String url = "http://127.0.0.1/zentao/project-task-" + projectId + "-unclosed.html";
            //执行接口调用,并传入cookie
            Document doc = Jsoup.connect(url).cookie("zentaosid", Constant.ZENTAOID).get();
            //解析html页面,获取tr标签
            Elements select = doc.select("table").select("tbody").select("tr");
            //遍历tr标签,根据任务状态获取对应的任务id,并放入到集合中
            for (Element element : select) {
                unClosedList.add(element.attr("data-id"));
            }

        } catch (Exception e) {
            System.out.println(e);
        }
        return unClosedList;
    }

    @Override
    public ReturnT<String> execute(String s) throws Exception {
        return null;
    }
}

总结

注意:个别信息比较私密模糊展示不便于公开,请见谅!!

如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞、收藏脚印支持一下博主哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux-系统随你玩之--用户及用户组管理

一、用户基本介绍 Linux 系统是一个多用户多任务的操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统 管理员申请一个账号&#xff0c;然后才可以以这个用户登陆系统。 二、Linux中用户和组 2.1、用户和组介绍 用户&#xff1a; 每一个用户都…

独立开发变现周刊(第85期):一个会员服务的SaaS,月收入2万美金

分享独立开发、产品变现相关内容&#xff0c;每周五发布。目录1、Obsidian Canvas&#xff1a;一个无限的空间来构建你的想法2、message-pusher: 搭建专属于你的消息推送服务3、Careerflow LinkedIn: 40倍提升你的工作机会4、vue-pure-admin: 一款开源后台管理系统5、一个提供会…

CAD简单制作风向(风速)玫瑰图

背景: 风向玫瑰图(简称风玫瑰图)也叫风向频率玫瑰图,它是根据某一地区多年平均统计的各个风向的百分数值,并按一定比例绘制,一般多用8个或16个罗盘方位表示,由于形状酷似玫瑰花朵而得名。 玫瑰图上所表示风的吹向,是指从外部吹向地区中心的方向,各方向上按统计数值画…

雷军主导小米管理层变革:创业派隐退 职业经理人上位

雷递网 雷建平 12月23日岁末之际&#xff0c;在京东零售大幅调整后&#xff0c;小米也进行了一轮大调整。小米集团内部邮件所示&#xff0c;小米总裁王翔将在月底卸任集团总裁职务退休&#xff0c;同时&#xff0c;继续作为高级顾问为公司服务。小米集团总裁一职将由2019年加入…

基于K-means聚类算法进行客户人群分析

摘要&#xff1a;在本案例中&#xff0c;我们使用人工智能技术的聚类算法去分析超市购物中心客户的一些基本数据&#xff0c;把客户分成不同的群体&#xff0c;供营销团队参考并相应地制定营销策略。本文分享自华为云社区《基于K-means聚类算法进行客户人群分析》&#xff0c;作…

做跨境电商,如何从同类产品中脱颖而出?

随便打开一个跨境电商平台&#xff0c;你会发现自己售卖的产品有那么多类似的选择&#xff0c;如何确保你的产品能被客户选择&#xff1f;怎样在一系列产品中脱颖而出&#xff1f; 不少卖家提到了&#xff0c;搞差异化竞争&#xff0c;这是跨境电商卖家常挂在嘴边的一个词&…

绝对肝货,超全的 MyBatis 动态代理原理讲解。

1.MyBatis简介 MyBatis是一个ORM工具&#xff0c;封装了JDBC的操作&#xff0c;简化业务编程&#xff1b; Mybatis在web工程中&#xff0c;与Spring集成&#xff0c;提供业务读写数据库的能力。 2.使用步骤 1.引入依赖 采用Maven包依赖管理&#xff0c;mybatis-3.5.5版本&…

MyBatis学习 | 动态SQL

文章目录一、简介二、if标签2.1 if标签的简单使用2.2 where标签2.3 trim标签&#xff08;了解&#xff09;三、choose标签 & set标签3.1 choose标签3.2 set标签四、foreach标签4.1 foreach标签的简单使用4.2 批量插入五、内置参数六、bind标签七、sql标签 & include标签…

2163. 删除元素后和的最小差值 堆解法解析

2163. 删除元素后和的最小差值 给你一个下标从 0 开始的整数数组 nums &#xff0c;它包含 3 * n 个元素。 你可以从 nums 中删除 恰好 n 个元素&#xff0c;剩下的 2 * n 个元素将会被分成两个相同大小的部分。 前面 n 个元素属于第一部分&#xff0c;它们的和记为 sumfirs…

Fabric.js 保存自定义属性

本文简介 点赞 关注 收藏 学会了 之前有些工友留言&#xff1a;在 fabric.js 中怎么保存元素的自定义属性&#xff1f; 比如&#xff0c;创建一个矩形&#xff0c;这个矩形有自己的 ID 属性&#xff0c;在执行序列化操作出来的结果却看不到 ID 属性了。 如何在序列化时输出…

项目实战之旅游网(三)后台用户管理(下)

目录 一.查询用户角色 二.修改用户角色 三.修改用户状态 一.查询用户角色 一个用户可以有多个角色&#xff0c;我们也可以给某个用户分配某些角色&#xff0c;所以我们还需要新建一个实体类&#xff08;这个实体类需要放到bean下&#xff0c;因为这个实体类和数据据库不是对…

【Effective_Objective-C_3接口与API设计】

文章目录前言15.用前缀避免命名空间冲突要点总结16.提供全能初始化方法全能初始化要点17.实现description方法description以字典形式输出descriptiondebugDescription要点18.尽量使用不可变对象要点19.使用清晰协调的命名方式方法命名类与协议命名要点20.为私有方法名加前缀21.…

人-机器人交互导论

【编者按&#xff1a;变主体性才是智能的真正厉害之处&#xff0c;能够设身处地地转换角色、角度、视角看待交互对象中的不确定性&#xff0c;并使用相应的同理同情共主观性机制机理进行处理&#xff0c;例如梅西过人中的真假变化。在个体/群体智能中的变主体性控制也是人机环境…

【圣诞节】飘雪圣诞树

一、前言 马上2023年的圣诞节&#x1f384;要到了&#xff0c;作为一个程序员&#xff0c;没什么可以送给大家的&#xff0c;就给大家画一个圣诞树&#x1f384;&#xff0c;作为礼物来送给大家吧。 二、创意名 明月当空飘雪圣诞树 三、效果展示 四、实现步骤 主要是利用three.…

详细设计说明书(GB8567——88)基于协同的在线表格forture-sheet

详细设计说明书 1引言 1.1编写目的 该文档在概要设计的基础上&#xff0c;进一步的细化系统结构&#xff0c;展示了软件结构的图标&#xff0c;物理设计、数据结构设计、及算法设计、详细的介绍了系统各个模块是如何实现的&#xff0c;包括涉及到的算法&#xff0c;逻辑流程…

【LeetCode每日一题:1754. 构造字典序最大的合并字符串~~~双指针+贪心算法】

题目描述 给你两个字符串 word1 和 word2 。你需要按下述方式构造一个新字符串 merge &#xff1a;如果 word1 或 word2 非空&#xff0c;选择 下面选项之一 继续操作&#xff1a; 如果 word1 非空&#xff0c;将 word1 中的第一个字符附加到 merge 的末尾&#xff0c;并将其…

《Unified Structure Generation for Universal Information Extraction》论文阅读

文章目录文章介绍文章方案用于统一结构编码的结构化抽取语言&#xff08;SEL&#xff09;用于可控IE结构生成的结构模式指导使用UIE生成预训练任务微调任务总结参考文章地址&#xff1a; https://arxiv.org/abs/2203.12277文章介绍 目前对于自然语言处理中的信息抽取任务如关系…

业聚医疗港交所上市:市值76亿港元 为钱永勋家族企业

雷递网 雷建平 12月23日血管介入器械公司――业聚医疗集团有限公司&#xff08;OrbusNeich Medical Group Limited&#xff09;&#xff08;简称“业聚医疗”&#xff0c;股票代码为&#xff1a;6929 &#xff09;今日在港交所上市。业聚医疗发行价为8.8港元&#xff0c;募资净…

SpringCloudGateway源码(四)限流组件

前言 如果不使用Alibaba Sentinel的网关流控规则&#xff0c; 是否可以选择使用SpringCloudGateway基于Redis的限流组件&#xff1f; 基于这个问题&#xff0c;笔者想了解一下scg自带限流组件的实现原理。 一、使用案例 1、pom 注意要加入redis-reactive依赖。 <depe…

OA系统遇到的问题

目录 一、开始时间与结束时间之差 二、弹出层的大小以及位置设置 2.1、高度设置body-style 2.2、位置设置dialogStyle 三、vue2安装引入Ant Design Vue 四、按钮控制盒子的显示与隐藏 五、表单生成器思想 5.1、点击左侧控件库生成中间的控件元素 5.2、点击中间的控件&…