新版edusrc用户数据统计脚本【开源&分享】

admin 2021年9月30日23:28:06评论119 views字数 9973阅读33分14秒阅读模式


点击蓝字



关注我们

TRAVEL
新版edusrc用户数据统计脚本【开源&分享】
开源脚本与解释


思路与解释

      本公众号由于种种原因更新比较慢,不过力求少而精,尽可能不水(当然水文也不少新版edusrc用户数据统计脚本【开源&分享】

      打包下载地址在后面,如有不会的地方或者需要配置,可联系作者协助解决。QQ:417230867(仅限空闲时间)
演示如下:

执行脚本

新版edusrc用户数据统计脚本【开源&分享】执行后会在当前目录生成【ID】.html文件

新版edusrc用户数据统计脚本【开源&分享】

打开文件

新版edusrc用户数据统计脚本【开源&分享】

(这个页面模板是自己写的,后面我会发出来)

脚本如下:

新版edusrc用户数据统计脚本【开源&分享】
#Create:2021/03/08#Update:2021/03/09#公众号:墨雪飘影#公众号:F12sec#QQ:417230867from pyecharts.charts import Page,Pie,Barfrom pyecharts import options as optsfrom pyecharts.globals import CurrentConfigCurrentConfig.ONLINE_HOST = "https://cdn.jsdelivr.net/npm/echarts@latest/dist/"import requestsimport re#使用新方法'''import matplotlib.pyplot as pltimport matplotlib.pyplot as plt2'''low=0mid=0high=0critical=0name=''percent=0.0#定义漏洞类型和数量bugsName=['SQL注入漏洞','文件上传漏洞','代码执行漏洞','命令执行漏洞','XSS漏洞','CSRF漏洞','SSRF漏洞','点击劫持漏洞','弱口令','敏感信息泄露','水平权限绕过','垂直权限绕过','其他漏洞']bugsCount=[0,0,0,0,0,0,0,0,0,0,0,0,0]#定义漏洞等级和数量bugsLevel=['低危','中危','高危','严重']print('  __  ____   _________     __')print(' |  \/  \ \ / /  __ \ \   / /')print(' | \  / |\ V /| |__) \ \_/ / ')print(' | |\/| | > < |  ___/ \   /  ')print(' | |  | |/ . \| |      | |   ')print(' |_|  |_/_/ \__|      |_|   ')print()print('本工具仅适用于未登录情况!(当然工具压根就没有登录,这是废话,但是要说)')id=input('请输入用户ID:')for i in range(1,999):#此处设置为999为了不用控制页数,使用try进行中断    userHomeUrl='https://src.sjtu.edu.cn/profile/'+id+'/?page='+str(i)    backInfo=requests.get(userHomeUrl)    #print(backInfo.text)    try:        #终止循环        break_str='?page='+str(i)        #if backInfo.text.find(break_str)==-1:        if backInfo.text.find(break_str)==-1 and i!=1:#完成后修改,防止页数不足一页而跳出循环            print('第'+str(i)+'页,不存在,循环终止!')            break        #正则规则中保留尖括号为了提高准确率,防止匹配到用户昵称和用户签名        r_name=r'<title>.+ 的个人中心'        r_total=r'总提交漏洞数量:.+'        r_valid=r'已审核通过漏洞数量:.+'        r_rank=r'Rank:d+'        r_low=r'>低危<'        r_mid=r'>中危<'        r_high=r'>高危<'        r_critical=r'>严重<'        if name=='':            name=re.search(r_name,backInfo.text).group().replace('<title>','')            name=name.replace(' 的个人中心','')        total=re.search(r_total,backInfo.text).group().replace('总提交漏洞数量:','')        valid=re.search(r_valid,backInfo.text).group().replace('已审核通过漏洞数量:','')#此处采用偷懒式写法,偷懒但有效,注意冒号后有一个空格        rank=re.search(r_rank,backInfo.text).group().replace('Rank:','')        #计算各类型漏洞个数        #print(len(bugsName))        for ii in range(len(bugsName)):            #print(ii)            bugsCount[ii]=len(re.findall(bugsName[ii],backInfo.text))+bugsCount[ii]        low_result=re.findall(r_low,backInfo.text)        mid_result=re.findall(r_mid,backInfo.text)        high_result=re.findall(r_high,backInfo.text)        critical_result=re.findall(r_critical,backInfo.text)        #开始计算总通过率        #print(total)        if percent==0.0:            percent='%.4f'%(float(valid)/float(total))            percent_str='%.2f'%(float(percent)*100.00)+'%'            #percent_str=str(float(percent)*100.00)+'%'            #修改写法,解决输出精度问题-2021-02-19            #percent_str='%.2f'%(float(percent)*100.00)+'%'        #计算完毕        #计算各等级漏洞数        low=low+len(low_result)        mid=mid+len(mid_result)        high=high+len(high_result)        critical=critical+len(critical_result)        #状态报告        print('第'+str(i)+'页,已处理!')        #开始计算等级占比        #开发中途废弃,原因为:各个用户可能存在不同等级漏洞为0的情况。        '''        low_percent='%.4f'%(float(low)/float(total))        low_percent_str=str(float(low_percent)*100.00)+'%'        mid_percent='%.4f'%(float(mid)/float(total))        mid_percent_str=str(float(mid_percent)*100.00)+'%'        high_percent='%.4f'%(float(high)/float(total))        high_percent_str=str(float(high_percent)*100.00)+'%'        critical_percent='%.4f'%(float(critical)/float(total))        critical_percent_str=str(float(critical_percent)*100.00)+'%'        '''        #print(percent_str)    except:        print('出现异常,中断进程')        break#打印空行print('n')for i in range(len(bugsName)):    print(bugsName[i]+':'+str(bugsCount[i]))#打印空行print('')print('计算完毕n用户昵称:'+name+'n总漏洞:'+str(total)+'t总Rank:'+rank+'t已通过:'+str(valid)+'t通过率:'+percent_str+'n低危:'+str(low)+'t中危:'+str(mid)+'t高危:'+str(high)+'t严重:'+str(critical))
#删除0值数据#这里我自己已经看不懂了,但是可以用,测试后无法使用,废弃,2021/03/08'''for j in bugsName: for jj in bugsCount: if jj==0: bugsName.remove(j) bugsCount.remove(jj)''''''经过测试,这个方法行不通,废弃。2021/03/08#获取需要删除的元素的下标delValues=[]for j in range(len(bugsName)): if(bugsCount[j]==0): delValues.append(j)print(bugsName)print(bugsCount)#通过下标删除元素for d in delValues: print(d) del bugsName[d] del bugsCount[d]'''#新办法启动,获取元素值然后删除#首先获取元素的值delName=[]for j in range(len(bugsName)): if(bugsCount[j]==0): delName.append(bugsName[j])#使用数组remove方法删除指定的值,因为漏洞名称是唯一的,可以使用该方法遍历删除for d in delName: bugsName.remove(d)#同样的使用上面的方法删除漏洞数,因为是指定删除0,只需要删除一次即可,放他妈的屁,测试不行,要删除指定次数的0,无法一次删除完for dc in range(len(bugsCount)-len(bugsName)):#这里贼复杂,可以简化,但是没有。 bugsCount.remove(0)#最后修改成功,使用上面的办法
#画出危害等级比例图#首先获取元素的值bugsLevelCount=[low,mid,high,critical]delLevelName=[]for l in range(len(bugsLevel)): if(bugsLevelCount[l]==0): delLevelName.append(bugsLevel[l])#使用数组remove方法删除指定的值,因为漏洞名称是唯一的,可以使用该方法遍历删除for dl in delLevelName: bugsLevel.remove(dl)#同样的使用上面的方法删除漏洞数,因为是指定删除0,只需要删除一次即可,放他妈的屁,测试不行,要删除指定次数的0,无法一次删除完for dlc in range(len(bugsLevelCount)-len(bugsLevel)):#这里贼复杂,可以简化,但是没有。 bugsLevelCount.remove(0)#最后修改成功,使用上面的办法
#2021/03/10使用新表'''#画图#解决中文乱码plt.rcParams['font.family'] = ['sans-serif']plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus']=False #用来正常显示负号#圆饼图colors=['m','r','g','y','c','m','y','b','c','g','c','r','y','c']plt.pie(bugsCount,labels=bugsName,colors=colors,autopct='%3.2f%%')
plt.legend(loc='upper left')plt.title(name+'各类型漏洞比例')plt.axis('equal')plt.show()
#画图#解决中文乱码plt2.rcParams['font.family'] = ['sans-serif']plt2.rcParams['font.sans-serif'] = ['SimHei']plt2.rcParams['axes.unicode_minus']=False #用来正常显示负号#圆饼图colors2=['c','b','y','r']plt2.pie(bugsLevelCount,labels=bugsLevel,colors=colors2,autopct='%3.2f%%')
plt2.legend(loc='upper left')plt2.title(name+'漏洞危害等级比例')plt2.axis('equal')plt2.show()'''
title=name+'n总漏洞:'+str(total)+'t总Rank:'+rank+'t已通过:'+str(valid)+'t通过率:'+percent_strpage=Page(layout=Page.SimplePageLayout)

bar=Bar()bar.__init__(opts.InitOpts(width="800px",height="400px"))bar.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts={"interval":"0","rotate":45}),title_opts=opts.TitleOpts(title=title,subtitle='Data Analysis By MXPY',pos_left='center'),legend_opts=opts.LegendOpts(orient="vertical", pos_left='left'))bar.add_xaxis(bugsName)#错误写法'''for i in range(len(bugsName)): bar.add_yaxis(bugsName[i],bugsCount[i])'''bar.add_yaxis(name+'各类型漏洞数',bugsCount)page.add(bar)
pie=Pie()pie.__init__(opts.InitOpts(width="800px",height="400px"))colors=['#3BB4F2','#0E90D2','#F37B1D','#DD514C']'''低危 #3BB4F2中危 #0E90D2高危 #F37B1D严重 #DD514C'''#pie.add("",[list(z) for z in zip([bugsLevel[0]],[bugsLevelCount[0]])],itemstyle_opts=opts.ItemStyleOpts(color=['red']))#pie.add("",[list(z) for z in zip([bugsLevel[1]],[bugsLevelCount[1]])],itemstyle_opts=opts.ItemStyleOpts(color=['yellow']))pie.add("",[list(z) for z in zip(bugsLevel,bugsLevelCount)])#pie.add("",[list(z) for z in zip(bugsLevel[1],bugsLevelCount[1])])pie.set_colors(colors)pie.set_global_opts(title_opts=opts.TitleOpts(title=name+'漏洞危害比例',pos_left='center'),legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"))pie.set_series_opts(label_opts=opts.LabelOpts(is_show=True,formatter="{b}:{c}"))page.add(pie)page.page_title=namepage.render(str(id)+".html",template_name='mxpy.html')

      这里有个坑,网上都是说的旧版本的用法,pyechart后来有了新版本,我查了很多资料才明白怎么用。

前面基本上之前都解释过,直接搬过来用,这次更新主要是更改了画图库,以前用的不好看,应大家要求,更新了画图,使得更好看。
在获取到数据后,我们调用Page生成一个页面
page=Page(layout=Page.SimplePageLayout)
然后使用Bar来画柱状图
(__init__用来初始化,这里指定了图表的宽高,然后用set_global_opts设置了标题、副标题、图例以及图例位置)
注:set_global_opts为pyechart新版用法,也就是1.0版本,与旧版本不兼容。
使用add_xaxis画出x轴,使用add_yaxis画出y轴,然后使用page的add方法,将图表添加到页面上。
bar=Bar()bar.__init__(opts.InitOpts(width="800px",height="400px"))bar.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts={"interval":"0","rotate":45}),title_opts=opts.TitleOpts(title=title,subtitle='Data Analysis By MXPY',pos_left='center'),legend_opts=opts.LegendOpts(orient="vertical", pos_left='left'))bar.add_xaxis(bugsName)bar.add_yaxis(name+'各类型漏洞数',bugsCount)page.add(bar)
然后使用Pie画饼状图,一样的初始化,不同的是,这里为了和平台颜色一致,所以自定义了各个元素的颜色,使用了zip方法实现一一对应,画出饼状图,设置每份的比例,然后添加到页面。
pie=Pie()pie.__init__(opts.InitOpts(width="800px",height="400px"))colors=['#3BB4F2','#0E90D2','#F37B1D','#DD514C']'''低危  #3BB4F2中危  #0E90D2高危  #F37B1D严重  #DD514C'''#pie.add("",[list(z) for z in zip([bugsLevel[0]],[bugsLevelCount[0]])],itemstyle_opts=opts.ItemStyleOpts(color=['red']))#pie.add("",[list(z) for z in zip([bugsLevel[1]],[bugsLevelCount[1]])],itemstyle_opts=opts.ItemStyleOpts(color=['yellow']))pie.add("",[list(z) for z in zip(bugsLevel,bugsLevelCount)])#pie.add("",[list(z) for z in zip(bugsLevel[1],bugsLevelCount[1])])pie.set_colors(colors)pie.set_global_opts(title_opts=opts.TitleOpts(title=name+'漏洞危害比例',pos_left='center'),legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"))pie.set_series_opts(label_opts=opts.LabelOpts(is_show=True,formatter="{b}:{c}"))page.add(pie)
最后设置标题为用户名,调用render生成页面,render可以使用template_name来指定HTML模板,模板位于pyechart安装目录下的【Libsite-packagespyechartsrendertemplates】
比如我的位于:
【C:UsersiAppDataLocalProgramsPythonPython37Libsite-packagespyechartsrendertemplates】
page.page_title=namepage.render(str(id)+".html",template_name='mxpy.html')
下面放mxpy.html模板源码

{% import 'macro' as macro %}<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>{{ chart.page_title }}</title>    {{ macro.render_chart_dependencies(chart) }}    {{ macro.render_chart_css(chart) }}</head><body>    <style>.box { {{ chart.layout }} margin-top:50px;};  a{    text-decoration: none;  }   /*这里是伪类选择器*/  a:link {color:#FF0000;} /* 未访问的链接 */  a:visited {color:#00FF00;} /* 已访问的链接 */  a:hover {color:#FF00FF;} /* 鼠标划过链接 */  a:active {color:#0000FF;} /* 已选中的链接 */</style>    {% if chart.download_button %}        <button onclick="downloadCfg()">Save Config</button>    {% endif %}    <div class="box">  <br />        {% for c in chart %}            {% if c._component_type in ("table", "image") %}                {{ macro.gen_components_content(c) }}            {% else %}                {{ macro.render_chart_content(c) }}            {% endif %}            {% for _ in range(chart.page_interval) %}<br/>{% endfor %}        {% endfor %}    </div>    <script>        {% for js in chart.js_functions.items %}            {{ js }}        {% endfor %}</script>  <div style="text-align:center;">  <a href="https://data.shikangsi.com" target="_blank" />墨雪飘影</a><br />QQ:417230867<br />公众号:墨雪飘影<br /><!--  作者:墨雪飘影  时间:2021-04-17  描述:修改为查询页二维码--><img src="https://p6-tt.byteimg.com/origin/pgc-image/0870757c026d46e7a49de671897b651a.png" width="160px" height="160px" alt="墨雪飘影"/><br /><a href="https://data.shikangsi.com" target="_blank" />长按扫码查询或点我查询</a></div></body></html>
都是可以自定义修改的
打包下载地址:
https://down-video.shikangsi.com/newedusrcuserdetail.zip
注:mxpy.html模板文件务必放置于pyechart模板目录!
TRAVEL
新版edusrc用户数据统计脚本【开源&分享】
历史文章

                 8种搜索引擎高级用法在5种搜索引擎中的表现               

Python写网页速成【已开源】 我也是现学的

获取edusrc用户主页与改良后的厂商脚本【均已开源】

实战 | 某大学综合漏洞挖掘

实战 | 0day挖掘之js接口分析

TRAVEL

欢迎关注(不分先后)



END




新版edusrc用户数据统计脚本【开源&分享】

扫码关注我们
我更新慢
墨雪飘影&&F12sec



本文始发于微信公众号(F12sec):新版edusrc用户数据统计脚本【开源&分享】

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年9月30日23:28:06
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   新版edusrc用户数据统计脚本【开源&分享】https://cn-sec.com/archives/374637.html

发表评论

匿名网友 填写信息