首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[python]使用python抓取sonar首页项目指标信息转存Excel并自动发送邮件

[python]使用python抓取sonar首页项目指标信息转存Excel并自动发送邮件

作者头像
master336
发布2026-06-15 19:08:37
发布2026-06-15 19:08:37
600
举报
目录
  • 场景
  • 功能
  • 使用的模块
  • 源代码
  • 使用说明

场景

使用python模拟首页项目及指标(如下图)接口请求,并对数据进行整理 前提:这里使用的是未登录的场景,需要登录可先模拟登录

在这里插入图片描述
在这里插入图片描述

功能

  • 抓取项目信息
  • 抓取指标信息
  • 结果汇总成excel
  • 结果发送邮件 邮件效果:
在这里插入图片描述
在这里插入图片描述

使用的模块

代码语言:javascript
复制
# json数据处理(处理接口返回数据)
import json
# http请求处理
import urllib.request
#excel写入
import xlsxwriter
#时间
import datetime
#邮件发送
import smtplib
from email.mime.text import MIMEText
from email.header import Header

源代码

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
import urllib.request
import xlsxwriter
import datetime
import smtplib
from email.mime.text import MIMEText
from email.header import Header


#获取项目清单接口
url_server_host="http://10.110.164.28:9000"
url_get_projects=url_server_host+"/api/components/search_projects"
# 获取分析结果接口
url_get_analyse=url_server_host+"/api/measures/search?metricKeys=alert_status%2Cbugs%2Creliability_rating%2Cvulnerabilities%2Csecurity_rating%2Csecurity_hotspots_reviewed%2Csecurity_review_rating%2Ccode_smells%2Csqale_rating%2Cduplicated_lines_density%2Ccoverage%2Cncloc%2Cncloc_language_distribution&projectKeys="
# Excel 表头映射
tableheadMapping={'alert_status':'告警状态',
                  'code_smells':'代码异味',
                  'coverage':'覆盖率',
                  'duplicated_lines_density':'重复率',
                  'ncloc':'扫描行数',
                  'ncloc_language_distribution':'扫描行数分布',
                  'reliability_rating':'新代码可靠率',
                  'security_hotspots_reviewed':'复审热点',
                  'security_rating':'安全比率',
                  'security_review_rating':'新代码安全复审率',
                  'sqale_rating':'SQALE评级',
                  'vulnerabilities':'新增漏洞',
                  }
# 发件人
email_sender = 'master336@163.com'
email_login_name = 'master336@163.com'
# smtp登录密码
email_login_pwd = ''
# 收件人
email_receivers = []
# 服务地址
email_smtp_server = "smtp.163.com"
email_smtp_port = 465
context='<h3>今日代码扫描已完成,执行结果如下</h3><br/><table border="1" align="center">'

# 获取所有项目的key
projectKeys={}

res = urllib.request.urlopen(url_get_projects)
res = res.read()
projects=json.loads(res)
for compentvar in projects['components'] :
    if compentvar['key'] not in projectKeys:
        projectKeys[compentvar['key']]=compentvar['name']

reqparams=""
for projectkey in projectKeys:
    reqparams = reqparams + ','+ projectkey
print('projects------>',reqparams)
url_get_analyse =  url_get_analyse + urllib.parse.quote(reqparams[1:])

# 请求分析结果
res = urllib.request.urlopen(url_get_analyse)
res = res.read()
projects_analyse=json.loads(res)
analysedata={}
analysetitle={}
for analy in projects_analyse['measures']:
    projectkey=analy['component']
    if projectkey in analysedata:
        project=analysedata[projectkey]
    else:
        project= {}
    keyparam=analy['metric']
    if keyparam not in analysetitle:
        if keyparam in tableheadMapping:
            analysetitle[keyparam]=tableheadMapping[keyparam];
        else:
            analysetitle[keyparam]=keyparam;
    project[keyparam]=analy['value']
    analysedata[projectkey]=project
workbook = xlsxwriter.Workbook('sonar分析结果(增量'+datetime.datetime.now().strftime('%Y%m%d-%H%M%s')+').xlsx')
worksheet = workbook.add_worksheet(u'分析结果')
# 处理表头
context=context+"<thead><tr>"
worksheet.write(0,0,'projectkey')
worksheet.write(0,1,'项目名称')
context=context+"<td>projectkey</td>"
context=context+"<td>项目名称</td>"
i=2;

for title in analysetitle.items():
    context=context+"<td>"+title[1]+"</td>"
    worksheet.write(0,i,title[1])
    i = i+1
context=context+"</tr></thead>"
# 处理内容
row=1
context=context+"<tbody>"
for keyval in analysedata:
    context=context+"<tr>"
    val = analysedata[keyval]
    worksheet.write(row,0,keyval)
    worksheet.write(row,1,projectKeys[keyval])
    context=context+"<td>"+keyval+"</td>"
    context=context+"<td>"+projectKeys[keyval]+"</td>"
    i=2;
    for title in analysetitle.items():
        titleval=title[0]
        if titleval in val:
            worksheet.write(row,i,val[titleval])
            context=context+"<td>"+val[titleval]+"</td>"
        i = i+1
    row=row+1
    context=context+"</tr>"
context=context+"</tbody>"
workbook.close()
print("开始发送邮件")
# 发送邮件

context=context+'</table><br/><h4>以上邮件来自系统自动发送,请勿回复或转发!</h4>'
message = MIMEText(context, 'html', 'utf-8')
message['From'] = email_sender #Header(email_sender, 'utf-8')     # 发送者
message['To'] =  ",".join(email_receivers) #Header(",".join(email_receivers), 'utf-8')          # 接收者
message['Subject'] = Header('sonar代码扫描日志'+datetime.datetime.now().strftime('%Y-%m-%d'), 'utf-8')

# 非ssl
# smtpObj = smtplib.SMTP()
# smtpObj.connect(email_smtp_server,465)
# ssl
try:
    smtpObj=smtplib.SMTP_SSL(email_smtp_server, email_smtp_port)
    # 括号中对应的是发件人邮箱账号、邮箱密码
    smtpObj.login(email_login_name, email_login_pwd)
    smtpObj.sendmail(email_sender, email_receivers, message.as_string())
    print ("邮件发送成功")
except smtplib.SMTPException as e:
    print(e)

使用说明

参数

含义

示例

url_server_host

sonar服务地址及端口

http://10.110.164.28:9000

email_login_name

邮件服务(smtp)登录账户

zhangsan

email_login_pwd

邮件服务(smtp)登录密码

email_smtp_server

邮件服务(smtp)地址

smtp.163.com

email_smtp_port

邮件服务(smtp)端口

465

email_sender

邮件发件人

xxx@163.com

email_receivers

邮件接收人

[‘zhangsan@163.com’,‘lisi@163.com’]

excel会存储到当前目录(即执行目录)

其他内容建议自行修改

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 场景
  • 功能
  • 使用的模块
  • 源代码
  • 使用说明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档