前言:当前有个任务是要把几个网站的日志返回状态码进行汇总,用饼图展示,并每天发送邮件。

一、分析问题

画出饼图,这个我用kibana给画出来了,下面不做讲解;

截取饼图,因为kibana是用js展示出来的,而不真的是一张jpg的图片,如何截取你想要的图片;

发送截图,想到利用python发送邮件,但发出来总是以附件形式,而我想直接在邮件里展示截图;

知道问题了,下面讲具体的解决问题过程

二、安装 PhantomJS

PhantomJS介绍:PhantomJS是一个基于 WebKit 的服务器端 JavaScript API。它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。 PhantomJS 可以用于 页面自动化 , 网络监测 , 网页截屏 ,以及 无界面测试 等。

1. 安装依赖包

yum install gcc gcc-c++ make git openssl-devel freetype-devel fontconfig-devel

2. 下载 phantomjs

git clone git://github.com/ariya/phantomjs.git

3. 编译 phantomjs

cd phantomjs

git checkout 1.9

./build.sh

此过程比较耗时,可以先去打个飞机,编译完这个目录大概有700多M

4. 测试

cat baidu.js

var page = require('webpage').create();

page.open('http://www.baidu.com', function () {

page.render('baidu.png');

phantom.exit();

});

运行

./phantomjs/bin/phantomjs baidu.js

可以看到本地生产的baidu.png

baidu

看,它会把整个页面给截下来,下面我们继续进行细致的截图。

三、按要求截图

先看看原网页

kibana

我们只要中间的饼图和它上面的一行状态码数量统计,

1. 改善脚本1

cat kibana.js

var page=require('webpage').create();

var address='http://log.xxx.cn/#/dashboard/file/sla.json'; // 设置url

var output='kiban.png'; // 设置保存文件名

page.viewportSize={width:1024,height:800}; // 设置查看页面的分辨率

page.open(address,function(status){

if(status!=='success'){

console.log('Unabletoloadtheaddress!');

phantom.exit();

}else{

window.setTimeout(function(){

page.clipRect={top:170, left:10, height: 330, width: 980}; // 设置页边距,从而获取想要的图片,需要慢慢调整

page.render(output); // 保存图片

phantom.exit();

},20000);

}

});

运行,可以得到如下图:

Paste_Image.png

你也可以只要中间的饼图,为了方便用同样的方法获得其他网页的统计截图,再次修改下脚本

2. 改善脚本2

cat kibana.js

var page=require('webpage').create();

var address = phantom.args[0];

var output = phantom.args[1];

page.viewportSize={width:1024,height:800}; // 设置查看页面的分辨率

page.open(address,function(status){

if(status!=='success'){

console.log('Unabletoloadtheaddress!');

phantom.exit();

}else{

window.setTimeout(function(){

page.clipRect={top:170, left:10, height: 330, width: 980}; // 设置页边距,从而获取想要的图片,需要慢慢调整

page.render(output); // 保存图片

phantom.exit();

},20000);

}

});

如上,我们把url和文件名改成接收参数

运行:

./phantomjs/bin/phantomjs kibana.js http://log.xxx.cn/#/dashboard/file/sla.json kibana.png

我们只需要变换url和文件名,就可以获得其他统计图,完成后我们把它加到邮件发出去

四、发送邮件

python发邮件没啥好说的,网上有很多脚本,我也是在网上撸的脚本,刚开始邮件是能发,但是发的图片总是以附件形式展示,而不是打开邮件就能看到截图,在网上找了好久终于找到 Python/Perl 如何在HTML邮件正文中嵌入本地图片,原来要先把图片插入html页面,然后以html形式发送邮件,最后脚本如下:

cat send_page.py

#!/usr/bin/env python

#coding:utf8

import smtplib

from email.mime.multipart import MIMEMultipart

from email.mime.base import MIMEBase

from email.mime.text import MIMEText

from email.mime.image import MIMEImage

from email import encoders

import sys

import os

from datetime import *

# 定义函数

def send_mail(to_list, sub):

me = mail_user + ""

msg = MIMEMultipart()

msg['Subject'] = sub

msg['From'] = me

msg['To'] = "".join(to_list)

# 生成不同的url,并通过/root/kibana.js 生成不同的png图片

for i in ('node', 'mapi', 'api', 'yunying-sla'):

os.system("/root/phantomjs/bin/phantomjs /root/kibana.js http://log.xxx.cn/#/dashboard/file/%s.json %s.png" % (i,i))

#二进制模式读取图片,并绑定到邮件头

with open(i+'.png', 'rb') as fp:

img = MIMEImage(fp.read())

img.add_header('Content-ID', i)

msg.attach(img)

# kibana会收集从此刻算起前24小时的数据,我在邮件开头记录时间间隔,

d = datetime.now()

dt = d.strftime('%Y-%m-%d %H:%M:%S')

at = (d - timedelta(1)).strftime('%Y-%m-%d %H:%M:%S')

timezone = at + ' ~ ' + dt

#构造html

html = """\

采集时间: """ + timezone + """

node

[img src="cid:node" alt="node">

mapi

[img src="cid:mapi" alt="mapi" >

api

[img src="cid:api" alt="api" >

yunying

[img src="cid:yunying-sla" alt="yunying-sla" >

"""

# 请把 [img 换成

context = MIMEText(html,_subtype='html',_charset='utf-8') #定义发送的形式和编码格式,这里以html形式发送

msg.attach(context)

try:

send_smtp = smtplib.SMTP()

send_smtp.connect(mail_host)

send_smtp.login(mail_user, mail_pass)

send_smtp.sendmail(me, to_list, msg.as_string())

send_smtp.close()

return True

except Exception, e:

print str(e)[1]

return False

# 设置服务器名称、用户名、密码以及邮件后缀

mail_host = 'smtp.xxx.com'

mail_user = 'jianwen.lu@xxx.com'

mail_pass = '8888888888'

mail_postfix = "xxx.com"

#mailto_list = ["763836801@qq.com","jianwen.lu@weimob.com"]

mailto_lists = sys.argv[1]

mailto_list = mailto_lists.split(',') #发送多人

sub= sys.argv[2]

# send_mail

if send_mail(mailto_list, sub):

print "Send mail succed!"

else:

print "Send mail failed!"

运行:

python send_sla.py jianwen.lu@xxx.com "网站服务状态sla"

由于es查询日志,并给kibana展示需要花点时间,所以你最好去打个飞机再来

我们收下邮件:

mail

点击蓝色字体,还可以直接去页面看

好了,至此,做好计划任务,等着每天发图了,啦啦啦。

python自动截图发送邮件_PhantomJS按尺寸截取页面,并用python发送邮件相关推荐

  1. Python自动截图PPT浏览视图

    问题描述 临近年终,又是忙着写总结作PPT汇报的时间,如果能用上精美应景的PPT模板,也能为汇报工作增色不少.网络上提供的成套PPT模板压缩文件,通常是文字介绍,如果借助于缩略图,那么会让我们有选择性 ...

  2. python自动截图保存(网课利器)

    最近线上报告太多,老师要求我对会议ppt进行截图.手动截图很耗时,保存命名也比较麻烦.有时候刚打开截图,那一页就跳过去了--所以想到用python编写一个自动截图保存的程序,这样就能安心听报告啦. 库 ...

  3. python 自动点击上传以后上传文件,python使用selenium模拟点击网页实现自动导入上传文件功能...

    一.环境准备 Python版本:3.4 编辑器:Pycharm excel文件:导入的excel模板 二.python代码 由于工作需要,需要每天定时导入相关excel文件进入后台数据库,由于导入的逻 ...

  4. Python自动化二--jmeter分布式测试,抓包,python语法基本介绍

    内容: 1.jmeter分布式测试 2.Jmeter在linux上运行 3.抓包 4.python 1.jmemter分布式测试-连接其它负载机 1)其它压力机上启动Jmeter.bat文件 2)在主 ...

  5. windows下python 自动截图功能

    python的自动截取特别简单(注:python的版本为2.7...,因为3.0以上版本和3.0以下的版本功能差异比较大所以 许注明) 首先安装 PIL模块,这个模块去这里(http://www.py ...

  6. python自动发邮件报554错误_python smtplib使用163发送邮件 报错 554 DT:SPM

    最近想弄个发送邮件的脚本,代码一切正常,执行发送邮件就会报 "554 DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件.请检查是否有用户发送病毒或者垃圾邮件:&quo ...

  7. python自动截图网页_Python 实现网页自动截图

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  8. python实现截图范围框跟随_教你用Python实现截图和文字识别,就是这么简单

    @Author: By Runsen keyboard是一个监控键盘输入的库 安装:pip install keyborad import keyboardimport timefrom PIL im ...

  9. python自动抽奖_「懒人必备」用Python自动抽奖

    不知道你们有没有玩过无码科技的小程序抽奖助手,没有玩过的可以在微信小程序入门搜索抽奖助手,首页有很多奖品进行抽奖的,我前几天发现了之后就把那里的所有奖品都点了一次,就突发萌想,能不能用python来实 ...

最新文章

  1. 《Python machine learning and practice》—— 良\恶性乳腺癌肿瘤预测
  2. cms的 php代码,KingCMS/PHP可执行代码
  3. 从身份证管理系统思考企业CMDB的建设
  4. 使用carbon_东华大学《Carbon》多孔碳纳米纤维复合膜,优异电磁波吸收性能!
  5. 计算机组成i1-i8,2016年软考程序员例题分析之计算机组成原理
  6. The Future of Compass ElasticSearch
  7. NYOJ469(动态规划)
  8. AT指令:AT+CPMS
  9. 工作量统计系统 python_软件测试工作量统计新方法
  10. 【渝粤教育】电大中专消费者行为学_1作业 题库
  11. 数据结构实验报告——线性表
  12. windows10补丁包离线更新
  13. 360 se html document 广告,360浏览器广告过滤规则
  14. 力扣刷题 DAY_71 回溯
  15. 【WAX云钱包】Cloudflare反爬虫突破(SSL指纹识别)
  16. 【学习日志】2023.04.24 C++ 调整黑点、白点和中值以增加、平衡或降低对比度
  17. Python爬虫尝试-爬取指定股票的财务报表(东方财富网)
  18. 51nod lyk与gcd
  19. 详谈京东的商品搜索系统架构设计
  20. [从头读历史] 第275节 诗经 秦风

热门文章

  1. springboot整合activiti报错[processes/]不存在解决方案
  2. Spring Boot下使用JPA报错:'hibernate.dialect' not set的解决办法
  3. rocketmq原理_彻底看懂RocketMQ事务实现原理
  4. linux xguest用户,在/etc/passwd中得到普通用户列表
  5. C语言 while 循环 - C语言零基础入门教程
  6. jq(jquery)之点击隐藏段落
  7. BugkuCTF-WEB题eval
  8. java比赛用多重for_关于 Java 中 for的多重循环
  9. java 注解与反射_Java注解与反射直接上手
  10. linux内存分配器类型,内核早期内存分配器:memblock