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

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

一、分析问题

画出饼图,这个我用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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nikita popov php,PHP中对performance的考虑点

Nikita Popov 在他的演讲中谈了几个PHP 程序中和performance相关的point。1.PHP使用shared memory, preload的方式事先分配,而只有在所有的处理结束之后,share memory 才会断开和所有进程或者thread之间的联系。光是opcode,FPM的设定还不足以…

python建模仿真 matlab_清华大学出版社-图书详情-《仿真建模与MATLAB实用教程》

MATLAB语言是目前世界上最为流行的科学计算语言之一,它的特点是能够快速地完成诸如矩阵运算、微分、寻优等计算任务。由于它配备了很多应用领域的专业工具箱,诸如金融、信号处理、图像处理、神经网络、嵌入式系统、仿真建模等,而且每个工具箱都包含了该应…

java web使用jquery,JAVA_Web_JQuery

简介:jquery 全称 javaScript Query.是js的一个框架。本质上仍然是js。特点:支持各种主流的浏览器、使用特别简单、拥有便捷的插件扩展机制和丰富的插件。一、JQuery内部封装原理介绍:匿名闭包。下面这两行代码是jquery包下的已经封装的代码&…

python语法学习_Python学习1——语法

Python语法包括了行、缩进、注释、标识符、保留关键字等方面。打印语句:>>> print(hello,world!)hello,world!输入语句:>>> input(请输入你的名字:)请输入你的名字:哈哈#”哈哈”是你自己输入的名字哈哈 #打印出…

java 两个页面传递数据,请问Cookie怎么在两个页面间传递数据?

参考代码如下://如果请求的Cookie对象为空if (Request.Cookies["userCookie"] null){//创建一个Cookie对象HttpCookie userCookie new HttpCookie("userCookie");//给对象赋值userCookie.Values["userName"] userInfo.UserName.ToS…

优化matlab作业,现代设计优化算法MATLAB实现

开篇语前阵子做现代设计方法的时候,发现网上很是缺乏这种作业形式的简易算法实现,所以特地来简书写一篇。有两份,一份是我的(说来惭愧,我的大部分都是在网上找的代码,然后在自己的电脑上跑一次,跑出来了就行…

怎样用python画玫瑰花的简笔画_玫瑰花简笔画素描作品图片

玫瑰原产是中国。在古时的汉语,“玫瑰”一词原意是指红色美玉。玫瑰花这么漂亮,素描怎么画得好看呢?你知道玫瑰花的简笔画素描是怎样的吗?今天先和学习啦小编一起欣赏这些玫瑰花简笔画素描图片,希望你会有所收获的。玫瑰花简笔画素描图片欣…

多因子选选股MATLAB代码,金工研报:利用卷积神经网络进行多因子选股

首先,我们先来看一下通过卷积神经网络选股模型的整体流程,然后再根据每一步流程进行介绍,具体如下图所示:1、数据获取用于历史回测数据来自所有A股股票,其中剔除了ST股以及上市3个月的股票,另外&#xff0c…

python list tuple 打包 解包_python的打包与解包

python的*与**,在函数的定义与调用过程中,有着不同的作用打包参数:一、函数定义时,形参前加*号(如:*args):收集实参中所有的位置参数,打包成新元组并将该元组赋值给args变量实参位置参数&#x…

python 成员函数 泛型函数_【一点资讯】白学这么多年 Python?连泛型函数都不会写? www.yidianzixun.com...

泛型,如果你尝过java,应该对他不陌生吧。但你可能不知道在 Python 中(3.4 ),也可以实现 简单的泛型函数。在Python中只能实现基于单个(第一个)参数的数据类型来选择具体的实现方式,官方名称 是single-dispatch。你或许听不懂&…

matlab bad apple,【bad apple】matlab制作矩阵苹果~

有屏幕的地方就有bad apple那么作为一名工科生,熟练的操♂作马桶萝卜(matlab)是一项基本技能下面开始讲解如何用matlab制作别具一格的“矩阵苹果”~实验环境matlab R2018a原版bad apple视频技术要求可以即时演算图形可以将处理后的每帧图形合并成新的视频先上代码%t…

服务器ip直接访问php怎么写,php - 如何实现用公网ip访问到服务器上的网页?

服务器系统是Windows Server 2012 R2,已经部署了IIS、PHP和MySQL,能够在云服务器上通过localhost打开php网页,(放在服务器wwwroot上的index.php)已在ISS管理器中添加网站,但编辑网站绑定时,在ip地址中填入了服务器的公…

vb6 打印选项对话框_图纸打印次数太多,不知道哪次才是最新的?用打印戳记区分效果好...

原创:就说我在开发区使用AutoCAD从事设计工作的朋友们不知道有没遇到过这种情况:图纸在反复修改打印的过程中,由于图纸内容高度相似,往往搞不清究竟哪个才是最新版本的图纸了。这种情况下,细致入微地去核对非常麻烦&am…

安卓文本编辑器php cpp,用安卓原生控件封装一个简易的富文本编辑器

最近接到项目需求:移动端原生写一个富文本编辑器。 ( ⊙ o ⊙ )从没遇到过富文本要用原生写的,然后就查阅各种资料。然后结合自己的思路:其实安卓的富文本编辑器就是一个 “容器”。那么接下来我就带给大家说一说我自定义这个富文本编…

python和nltk自然语言处理书评_Python和NLTK自然语言处理

模块1 NLTK基础知识第 1章 自然语言处理简介 31.1 为什么要学习NLP 41.2 从Python的基本知识开始 71.2.1 列表 71.2.2 自助 81.2.3 正则表达式 91.2.4 词典 111.2.5 编写函数 111.3 NLTK 131.4 试一试 181.5 本章小结 18第 2章 文本的整理和清洗 192.…

vue tab切换_iviewUITabs选项卡切换组件

概述 选项卡切换组件,常用于平级区域大块内容的的收纳和展现。源码地址:https://github.com/iview/iview/tree/2.0/src/components/tabs使用: 标签一的内容标签二的内容标签三的内容标签二的内容在源码的tabs文件下有三个文件:ind…

java biginteger 比较大小,java – 打印非常大的BigIntegers

我试图找出与Java 7 x64中的BigIntegers相关的以下问题.我试图计算一个极高功率的数字.代码如下,然后是问题描述.import java.math.BigInteger;public class main {public static void main(String[] args) {// Demo calculation; Desired calculation: BigInteger("4096&…

paypal创建订单后怎么获得id_5步创建Facebook商店(最新版教程)学习如何在Facebook上卖货...

请按照以下步骤设置Facebook商店:步骤1:转到您的Facebook页面并配置Shop页面。步骤2:设置您的商店详细信息。步骤3:配置付款。步骤4:将产品添加到您的Facebook商店。步骤5:管理您的订单。步骤6:…

php 网络图片 转本地,PHP将Base64图片转换为本地图片并保存

PHP将Base64图片转换为本地图片并保存/*** [将Base64图片转换为本地图片并保存]* param [Base64] $base64_image_content [要保存的Base64]* param [目录] $path [要保存的路径]*/function base64_image_content($base64_image_content,$path){//匹配出图片的格式if (preg_matc…

创建索引名称已由现有对象使用_Excel编程周末速成班第3课:Excel对象模型

学习Excel技术,关注微信公众号:excelperfect导语:为了帮助想要快速学会Excel VBA的朋友,特以《Excel Programming Weekend Crash Course》这本书为基础,开始整理一系列资料,在完美Excel社群上分享。一共有3…