python实现提取jira bug列表的方法示例

目录

公司要求内部每日整理jira bug发邮件,手动执行了一段时间,想着用自动化的方式实现,故用了3天的时间做出了此脚本。

第一版基础版

# -*- coding:utf-8 -*-
import requests
import re
from bs4 import BeautifulSoup as bs
import time
import os

jql = "project = SDP and parent = SDP-13330 AND issuetype in (standardIssueTypes(), subTaskIssueTypes(), BUG) AND status in (新建, 解决中, 重新打开) AND priority in (P0, P1, P2) AND reporter in (membersOf(SDP_Tester)) ORDER BY priority DESC"
username = "robin.li"
password = "a12345678"
tempfilepath = r"f:\bug_list.csv"
outbuglist = r"f:\bug_out" + time.strftime("%Y%m%d", time.localtime()) + ".csv"
parentid = "SDP-13330"

bugs_list = []

def findall_data(data,LB="",RB=""):
    '''    关联函数左右边界提取数取    '''
    rule=LB + r"(.+?)" + RB
    datalist=re.findall(rule,data)
    return  datalist

def get_bugs_list():
    '''根据规则提取bug列表'''
    if os.path.exists(outbuglist):  # 如果文件存在
        os.remove(outbuglist)
    with open(r"f:\bug_list.csv", 'r') as f:
        content = str(f.readlines())[1:-1]
        bug = []
        soup = bs(content, features='html.parser')

        for tr in soup.select('tr'):
            for td in tr.select('td'):
                bug.append(str(td.text).strip(r''))
            bugs_list.append(bug)
            bug = []

        for bug in bugs_list:
            clear_list = str(bug[1:-2]).replace("\\n", "").replace("\'", "").replace(" ", "").replace("\,", "").replace("\\xa0", "").replace(parentid, "").replace("[", "").replace("]", "")
            print(clear_list)
            try:
                with open(outbuglist, 'a') as f:
                    f.write(clear_list + "\n")
            except PermissionError:
                print("\033[31m请关闭已经打开的bug列表")
                return 0
        else:
            print("\n \033[31mbug列表输出地址:" + outbuglist + "\n" + "-"*50 + "-----bug内容如上:--------\n")

def login_bugwriter(username, password, jql, tempfilepath):
    """
    login_bugwriter(username='str',password='str', jql='str')
    登录jira提取bug列表写入文件
    username:登录Jira的帐号
    password:密码
    jql:jira过滤的语法
    tempfilepath:过滤的bug文件临时存储目录文件
    """
    ''''''
    data = {'os_username': username, 'os_password': password, 'login': '登录'}
    res = requests.get("https://jira.clouddeep.cn/secure/Dashboard.jspa")

    if res.status_code == 200:
        print("可以访问Jira,开始提取数据")
        jsession = requests.Session()
        cookie_jar = jsession.post("https://jira.clouddeep.cn/login.jsp",data=data).cookies
        login_cookie = requests.utils.dict_from_cookiejar(cookie_jar)
        print("登录成功,整理列表")

        headers={
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36",
            "Sec-Fetch-Dest": "document",
            "Sec-Fetch-Mode": "navigate",
            "Sec-Fetch-Site": "none",
            "Sec-Fetch-User": "?1",
            "Upgrade-Insecure-Requests": "1",
        }

        r=requests.get("https://jira.clouddeep.cn/browse/SDP-13330",headers=headers, cookies=login_cookie)
        #print(r.text)
        jql_url="https://jira.clouddeep.cn/issues/SDP-13330/?jql=" + jql
        print("请确认过滤条件:==>" + jql_url + "\n" + "-"*30)
        bug_list = requests.get(jql_url ,headers=headers, cookies=login_cookie)
        with open(tempfilepath,'w') as f:
            f.write(bug_list.text)
    else:
        print("jira无法访问,请检查网络。")

if __name__ == '__main__':
    login_bugwriter(username, password, jql, tempfilepath)
    get_bugs_list()

第二版基础版添加日期相差功能

# -*- coding:utf-8 -*-
import requests
import re
from bs4 import BeautifulSoup as bs
import time
import os
from datetime import datetime

jql = "project = SDP and parent = SDP-13330 AND issuetype in (standardIssueTypes(), subTaskIssueTypes(), BUG) AND status in (新建, 解决中, 重新打开) AND priority in (P0, P1, P2) AND reporter in (membersOf(SDP_Tester)) ORDER BY priority DESC"
username = "a.li@rc.cn"
password = "Rc123456"
tempfilepath = r"f:\bug_list.csv"
outbuglist = r"f:\bug_out" + time.strftime("%Y%m%d", time.localtime()) + ".csv"
parentid = "SDP-13330"
bugs_list = []

def trans_month(date):
    ch_date_dict = {'一': '01', '二': '02', '三': '03', '四': '04', '五': '05', '六': '06', '七': '07', '八': '08', '九': '09', '十': '10', '十一': '11', '十二': '12', }
    old_date = date.split('/')
    ch_date = str(old_date[1])[0]
    if ch_date in ch_date_dict:
        old_date[1]=ch_date_dict[ch_date]
        new_date = "/".join(str(i) for i in old_date)
        return new_date
    else:
        print('日期格式错误')

def diff_date(d1, d2):
    d1 = datetime.strptime(d1,'%d/%m/%y').date()
    return (d2 - d1).days

def findall_data(data,LB="",RB=""):
    '''    关联函数左右边界提取数取    '''
    rule=LB + r"(.+?)" + RB
    datalist=re.findall(rule,data)
    return  datalist

def get_bugs_list():
    '''根据规则提取bug列表'''
    if os.path.exists(outbuglist):  # 如果文件存在
        os.remove(outbuglist)
    with open(r"f:\bug_list.csv", 'r') as f:
        content = str(f.readlines())[1:-1]
        bug = []
        soup = bs(content, features='html.parser')

        for tr in soup.select('tr'):
            for td in tr.select('td'):
                if td.text != " \\n":
                    print('2==',len(bug))
                    bug.append(str(td.text).strip(""))
                if "<img" in str(td):  #提取日期
                    get_date = tr.time.text  # 09:30:45'
                    d1 = trans_month(get_date)
                    d2 = datetime.now().date()
                    diff_days = diff_date(d1, d2)

                    s = str(td.img['alt'])
                    print('1==',len(bug))
                    bug.insert(len(bug),str(diff_days))
            bug.append(s)
#print('1',bug) #print('2',bug)  bugs_list.append(bug) #bugs_list = [i for i in bugs_list if i != ''] #print('3',bugs_list) bug = [] for bug in bugs_list: #ps = bug # print(len(bug)) # if len(bug) != 0: clear_list = str(bug[:-2]).replace("\\n", "").replace("\'", "").replace(" ", "").replace("\,", "").replace("\\xa0", "").replace(parentid, "").replace("[", "").replace("]", "") #print(clear_list) #clear_list = clear_list.split(",") #clear_list = [i for i in clear_list if i !=''] print(clear_list) try: with open(outbuglist, 'a') as f: f.write(str(clear_list) + "\n") except PermissionError: print("\033[31m请关闭已经打开的bug列表") return 0 else: print("\n \033[31mbug列表输出地址:" + outbuglist + "\n" + "-"*50 + "-----bug内容如上:--------\n") def login_bugwriter(username, password, jql, tempfilepath): """ login_bugwriter(username='str',password='str', jql='str') 登录jira提取bug列表写入文件 username:登录Jira的帐号 password:密码 jql:jira过滤的语法 tempfilepath:过滤的bug文件临时存储目录文件 """ '''''' data = {'os_username': username, 'os_password': password, 'login': '登录'} res = requests.get("https://jira.clouddeep.cn/secure/Dashboard.jspa") if res.status_code == 200: print("可以访问Jira,开始提取数据") jsession = requests.Session() cookie_jar = jsession.post("https://jira.clouddeep.cn/login.jsp",data=data).cookies login_cookie = requests.utils.dict_from_cookiejar(cookie_jar) print("登录成功,整理列表") headers={ "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", "Sec-Fetch-User": "?1", "Upgrade-Insecure-Requests": "1", } r=requests.get("https://jira.clouddeep.cn/browse/SDP-13330",headers=headers, cookies=login_cookie) #print(r.text) jql_url="https://jira.clouddeep.cn/issues/SDP-13330/?jql=" + jql print("请确认过滤条件:==>" + jql_url + "\n" + "-"*30) bug_list = requests.get(jql_url ,headers=headers, cookies=login_cookie) with open(tempfilepath,'w') as f: f.write(bug_list.text) else: print("jira无法访问,请检查网络。") if __name__ == '__main__': #login_bugwriter(username, password, jql, tempfilepath) get_bugs_list()

第三版优化了提取器,实现一键提取bug

实现的代码

# -*- coding:utf-8 -*-
import requests
import re
from bs4 import BeautifulSoup as bs
import time
import os
from datetime import datetime

parentid = "SDP-15642"   #bug汇总 jira号

#查询条件
jql = "project = SDP and parent = " + parentid +" AND issuetype in (standardIssueTypes(), subTaskIssueTypes(), BUG) AND status in (新建, 解决中, 重新打开,解决中) AND priority in (P0, P1, P2) AND reporter in (membersOf(SDP_Tester)) ORDER BY priority DESC"

tr_title = "JIRA链接,详细描述,BUG等级,经办人,报告人,JIRA状态,JIRA创建时间,bug持续时间"#["JIRA链接","详细描述","BUG等级","经办人","报告人","JIRA状态","JIRA创建时间","bug持续时间"]
username = "aa.li@ss.cn"
password = "ss2018()"
tempfilepath = r"./bug_list.csv"
outbuglist = r"./bug_out" + time.strftime("%Y%m%d", time.localtime()) + ".csv"
# orderbuglist = r"./order_bug_out" + time.strftime("%Y%m%d", time.localtime()) + ".csv"

bugs_list = []

def trans_month(date):
    ch_date_dict = {'一': '01', '二': '02', '三': '03', '四': '04', '五': '05', '六': '06', '七': '07', '八': '08', '九': '09', '十': '10', '十一': '11', '十二': '12', }
    old_date = date.split('/')
    ch_date = str(old_date[1])[0]
    if ch_date in ch_date_dict:
        old_date[1]=ch_date_dict[ch_date]
        new_date = "/".join(str(i) for i in old_date)
        return new_date
    else:
        print('日期格式错误')

def diff_date(d1, d2):
    d1 = datetime.strptime(d1,'%d/%m/%y').date()
    return (d2 - d1).days

def findall_data(data,LB="",RB=""):
    '''    关联函数左右边界提取数取    '''
    rule=LB + r"(.+?)" + RB
    datalist=re.findall(rule,data)
    return  datalist

def get_bugs_list():
    '''根据规则提取bug列表'''
    # if os.path.exists(outbuglist):  # 如果文件存在
    #     os.remove(outbuglist)
    with open(r"f:\bug_list.csv", 'r') as f:
        content = str(f.readlines())[1:-1]
        bug = []
        soup = bs(content, features='html.parser')

        for tr in soup.select('tr'):
            for td in tr.select('td'):
                str1 =  re.sub(r"[\\n'\s]","",str(td.text))
                str2 = re.sub("[\s ,\r\n]{1,99}", ",", str1)
                if str2 != "":
                    bug.append(str(str2).strip(""))
                if "<img" in str(td):  #提取日期
                    get_date = tr.time.text  # 09:30:45'
                    d1 = trans_month(get_date)
                    d2 = datetime.now().date()
                    diff_days = diff_date(d1, d2)
                    s = str(td.img['alt'])
                    bug.insert(len(bug),str(diff_days))
                    bug.append(s)

            bugs_list.append(bug)
            bug = []

        else:
            print("\n \033[31mbug列表输出地址:" +  "\n" + "-"*50 + "-----bug内容如上:--------\n")
    return bugs_list

def login_bugwriter(username, password, jql, tempfilepath):
    """
    login_bugwriter(username='str',password='str', jql='str')
    登录jira提取bug列表写入文件
    username:登录Jira的帐号
    password:密码
    jql:jira过滤的语法
    tempfilepath:过滤的bug文件临时存储目录文件
    """
    ''''''
    data = {'os_username': username, 'os_password': password, 'login': '登录'}
    res = requests.get("https://jira.clouddeep.cn/secure/Dashboard.jspa")

    if res.status_code == 200:
        print("可以访问Jira,开始提取数据")
        jsession = requests.Session()
        cookie_jar = jsession.post("https://jira.clouddeep.cn/login.jsp",data=data).cookies
        login_cookie = requests.utils.dict_from_cookiejar(cookie_jar)
        print("登录成功,整理列表")

        headers={
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36",
            "Sec-Fetch-Dest": "document",
            "Sec-Fetch-Mode": "navigate",
            "Sec-Fetch-Site": "none",
            "Sec-Fetch-User": "?1",
            "Upgrade-Insecure-Requests": "1",
        }

        r=requests.get("https://jira.clouddeep.cn/browse/" + parentid,headers=headers, cookies=login_cookie)
        jql_url="https://jira.clouddeep.cn/issues/" + parentid + "/?jql=" + jql
        print("请确认过滤条件:==>" + jql_url + "\n" + "-"*30)
        bug_list = requests.get(jql_url ,headers=headers, cookies=login_cookie)
        with open(tempfilepath,'w') as f:
            f.write(bug_list.text)
    else:
        print("jira无法访问,请检查网络。")

def order_buglist(buglist):
    with open(outbuglist,'w') as f:
        f.write(tr_title + '\n')
        print(tr_title)
        for l in buglist:
            if len(l) <= 1:
                print("列表长度小于1")
            else:
                s = l[3:4] + str(l[4:5]).split(",")[2:3] +l[2:3] + l[9:11] + l[5:6] + l[8:9] + l[1:2]
                s2 = re.sub(r"'","",str(s)[3:-1])
                s3 = re.sub(r"[, ]{1,8}",",",s2)
                f.write("https://jira.clouddeep.cn/browse/" + str(s3) + '\n')
                print('out>>',s3)
    print("bug列表输出地址:\n",outbuglist)
  if os.path.exists(tempfilepath):
      os.remove(tempfilepath)
  else:
      print("no such file: %s" %tempfilepath)
if __name__ == '__main__': login_bugwriter(username, password, jql, tempfilepath) bug = get_bugs_list() order_buglist(bug)

实现一键提取:

编写2个bat文件:

init_env.bat #初始化环境,安装所需的库

pip install requests
pip install  bs4 

get_jira_bugs.bat #调用主程序实现bug列表生成一个csv文件。

@ECHO OFF
python ./jiraCollection.py
echo  run success!
pause

到此这篇关于python实现提取jira bug列表的方法示例的文章就介绍到这了,更多相关python提取jira bug列表内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python 统计Jira的bug 并发送邮件功能

    1.首先在pycharm上使用pip安装 pip install html-table pip install jira 2.初始化发件人邮箱,账号,密码 # 发件人邮箱账号 my_sender = 'username@xxx.com.cn' # user登录邮箱的用户名,password登录邮箱的密码(授权码,即客户端密码,非网页版登录密码),但用腾讯邮箱的登录密码也能登录成功 my_pass = 'xxxxx' # 收件人邮箱账号 my_users=['username@xxx.com.cn

  • Python用Jira库来操作Jira

    Jira简介 Jira是一款功能非常强大的管理工具,广泛的用来 缺陷跟踪.用例管理.需求收集.任务跟踪.工时管理.项目计划管理等工作领域.所以使用这款产品的公司很多,这篇博客讲述在执行自动化测试用例过程中,将失败的用例自动在jira系统记录bug. 提供了完善的RESTful API,如果不想直接请求API接口可以使用Python的Jira库来操作Jira. 官方文档 一.安装 # 安装第三方jira库 pip install jira 二.认证 官网提供了4种认证方式: Cookie Base

  • Python操作Jira库常用方法解析

    Jira提供了完善的RESTful API,如果不想直接请求API接口可以使用Python的Jira库来操作Jira Jira Python文档 安装方法 pip install jira 认证 Jira的访问是有权限的,在访问Jira项目时首先要进行认证,Jira Python库提供了3种认证方式: 通过Cookis方式认证(用户名,密码) 通过Basic Auth方式认证(用户名,密码) 通过OAuth方式认证 认证方式只需要选择一种即可,以下代码为使用Cookies方式认证. form j

  • python实现提取jira bug列表的方法示例

    目录 公司要求内部每日整理jira bug发邮件,手动执行了一段时间,想着用自动化的方式实现,故用了3天的时间做出了此脚本. 第一版基础版 # -*- coding:utf-8 -*- import requests import re from bs4 import BeautifulSoup as bs import time import os jql = "project = SDP and parent = SDP-13330 AND issuetype in (standardIss

  • python提取字典key列表的方法

    本文实例讲述了python提取字典key列表的方法.分享给大家供大家参考.具体如下: 这段代码可以把字典的所有key输出为一个数组 d2 = {'spam': 2, 'ham': 1, 'eggs': 3} # make a dictionary print d2 # order is scrambled print d2.keys() # create a new list of my keys 希望本文所述对大家的Python程序设计有所帮助.

  • python实现提取百度搜索结果的方法

    本文实例讲述了python实现提取百度搜索结果的方法.分享给大家供大家参考.具体实现方法如下: # coding=utf8 import urllib2 import string import urllib import re import random #设置多个user_agents,防止百度限制IP user_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0', \ 'M

  • python通过加号运算符操作列表的方法

    本文实例讲述了python通过加号运算符操作列表的方法.分享给大家供大家参考.具体如下: li = ['a', 'b', 'mpilgrim'] li = li + ['example', 'new'] print li li += ['two'] print li 运行结果如下: ['a', 'b', 'mpilgrim', 'example', 'new'] ['a', 'b', 'mpilgrim', 'example', 'new', 'two'] 希望本文所述对大家的Python程序设

  • Python实现合并两个列表的方法分析

    本文实例讲述了Python实现合并两个列表的方法.分享给大家供大家参考,具体如下: 浏览博客看到一个问题:如何合并两个列表,今天就来探讨一下. 方法一 最原始,最笨的方法,分别从两个列表中取出所有的元素,再放入新列表中就OK了.示例代码如下: list1 = [1,2,3] list2 = [4,5,6] list_new = [] for item in list1: list_new.append(item) for item in list2: list_new.append(item)

  • Python 中的range(),以及列表切片方法

    range()函数配合循环一块使用很方便,今天来整理一下这个函数的主要用法,以及几个小例子 首先来看一下函数原型,非常简单: range(start,end [,step]) 或者连start都省略掉: range(end) 其中,start表示开始点,end表示结束点,真正结束的位置是end的前一个值,step表示步长. 例如: print(list(range(1,5))) #list函数是将range的值列表化,这时候的输出为 1,2,3,4 (没有5!即不包括最后一个end的值) pri

  • python判断变量是否为列表的方法

    python的数据类型有:数字(int).浮点(float).字符串(str),列表(list).元组(tuple).字典(dict).集合(set). 一般通过以下方法进行判断: 1.isinstance(参数1,参数2) 描述:该函数用来判断一个变量(参数1)是否是已知的变量类型(参数2) 类似于type() 参数1:变量 参数2:可以是直接或间接类名.基本类型或者由它们组成的元组. 返回值:如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False. 例子

  • Python实现检测文件MD5值的方法示例

    本文实例讲述了Python实现检测文件MD5值的方法.分享给大家供大家参考,具体如下: 前面介绍过Python计算文件md5值的方法,这里分析一下Python检测文件MD5值的另一种实现方法. 概述: MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. 实现代码: #python 检测文件MD5值 #python version 2.6 import hashlib im

  • Python简单计算文件MD5值的方法示例

    本文实例讲述了Python简单计算文件MD5值的方法.分享给大家供大家参考,具体如下: 一 代码 import sys import hashlib import os.path filename = sys.argv[1] if os.path.isfile(filename): fp=open(filename,'rb') contents=fp.read() fp.close() print(hashlib.md5(contents).hexdigest()) else: print('f

  • 纯python进行矩阵的相乘运算的方法示例

    本文介绍了纯python进行矩阵的相乘运算的方法示例,分享给大家,具体如下: def matrixMultiply(A, B): # 获取A的行数和列数 A_row, A_col = shape(A) # 获取B的行数和列数 B_row, B_col = shape(B) # 不能运算情况的判断 if(A_col != B_row): raise ValueError # 最终的矩阵 result = [] # zip 解包后是转置后的元组,强转成list, 存入result中 BT = [li

随机推荐