公司BUG管理系统用的是百度效率云,上面的图表绘制功能有问题,遂手写了从接口查询的脚本。
需要用到的库:
import os
import json
import time
import parsel
#用于进行接口返回数据分析的库
import requests
from openpyxl import load_workbook, Workbook
from openpyxl.chart.label import DataLabelList
#添加图表数据标签
from openpyxl.chart import PieChart, Reference, Series, BarChart3D
#进行图表绘制用到的库
# -*- coding: gbk -*-
import os
import json
import time
import parsel
import requests
from openpyxl import load_workbook, Workbook
from openpyxl.chart.label import DataLabelList
from openpyxl.chart import PieChart, Reference, Series, BarChart3D
class GetBugInfo:
def __init__(self, project, plan_name):
self.test = requests.session()
url = 'https://login.bce.baidu.com/login'
data = {
"accountId": "xxxxxxx",
# 企业在百度效率云的id
"username": "xxxxxx",
# 自己的账号名称
"password": "xxxxxx",
# 自己的登录密码
"redirect": "https://console.bce.baidu.com"
# 效率云登录成功的跳转链接
}
self.test.post(url=url, data=data)
cookies = requests.utils.dict_from_cookiejar(self.test.cookies)
# 将登陆获取到的csrftoken存放到headers中
self.test.headers["csrftoken"] = cookies["bce-user-info"]
self.project = project
self.project_uuid = None
self.plan_name = plan_name
self.plan_dict = {
}
self.status_dict = {
}
self.severity_dict = {
}
self.priority_dict = {
}
self.tester_dict = {
}
self.front_dict = {
}
self.back_dict = {
}
self.status_count_dict = {
}
self.severity_count_dict = {
}
self.priority_count_dict = {
}
self.tester_count_dict = {
}
self.front_count_dict = {
}
self.back_count_dict = {
}
self.front_all_bug_count = 0
self.back_all_bug_count = 0
self.all_plan_bug_count_dict = {
}
def get_project_uuid(self):
# 获取项目对应的UUID
get_uuid_url = 'https://xly.bce.baidu.com/api/facade/hrpackage/rest/v1/companies/hrpackage/projects?name=&tags=&_limit=49&_offset=0'
resp = self.test.get(get_uuid_url)
for project in json.loads(resp.content):
if project["name"] == self.project:
self.project_uuid = project["uuid"]
if not self.project_uuid:
raise ValueError(f"不存在此项目:【{
self.project}】")
# 获取计划列表
def get_plan_list(self):
# 获取项目下计划列表
get_plan_list_url = f'https://xly.bce.baidu.com/hrpackage/{
self.project_uuid}/icafe//planAndTrack/{
self.project_uuid}/getPlanBoxData'
get_plan_list_data = {
"scope": "all"}
resp = self.test.post(url=get_plan_list_url, data=get_plan_list_data)
plan_list = json.loads(resp.content.decode())
for plan in plan_list:
self.plan_dict[plan["name"]]= plan["id"]
if "未计划" == plan["name"]:
del self.plan_dict["未计划"]
if "需求" in plan["name"]:
del self.plan_dict[plan["name"]]
if self.plan_name not in self.plan_dict.keys():
raise ValueError(f"当前没有【{
self.plan_name}】的计划!")
def get_bug_count_func(self, data):
# 基础方法
url = f'https://xly.bce.baidu.com/hrpackage/{
self.project_uuid}/icafe/planAndTrack/content/{
self.project_uuid}/hierarchy'
resp = self.test.post(url=url, data=data)
select = parsel.Selector(resp.text.encode('utf-8').decode())
bug_count = int(select.css('div.hierarchy-tool-bar-fromPlan div b::text').get().strip())
return bug_count
def get_plan_all_bug_count(self, plan_name):
# 获取单个迭代的bug总数
data = {
"planBoxId": self.plan_dict[f"{
plan_name}"],
"containSubBox": True,
"q": "[issueTypeId][in][5009]"
# 获取计划下面的BUG数
}
bug_count = self.get_bug_count_func(data)
return bug_count
def get_status_bug_count(self):
# 获取各流程状态的bug数量
# 流程状态映射:新建:726 挂起:6035 验证中:2 已完成:3
# 公司内部自己创建的流程字段,各公司可能不一样
self.status_dict = {
"新建": 726, "挂起": 6035, &#