python自动截图发送邮件_PhantomJS按尺寸截取页面,并用python发送邮件
前言:當(dāng)前有個(gè)任務(wù)是要把幾個(gè)網(wǎng)站的日志返回狀態(tài)碼進(jìn)行匯總,用餅圖展示,并每天發(fā)送郵件。
一、分析問(wèn)題
畫出餅圖,這個(gè)我用kibana給畫出來(lái)了,下面不做講解;
截取餅圖,因?yàn)閗ibana是用js展示出來(lái)的,而不真的是一張jpg的圖片,如何截取你想要的圖片;
發(fā)送截圖,想到利用python發(fā)送郵件,但發(fā)出來(lái)總是以附件形式,而我想直接在郵件里展示截圖;
知道問(wèn)題了,下面講具體的解決問(wèn)題過(guò)程
二、安裝 PhantomJS
PhantomJS介紹:PhantomJS是一個(gè)基于 WebKit 的服務(wù)器端 JavaScript API。它全面支持web而不需瀏覽器支持,其快速,原生支持各種Web標(biāo)準(zhǔn): DOM 處理, CSS 選擇器, JSON, Canvas, 和 SVG。 PhantomJS 可以用于 頁(yè)面自動(dòng)化 , 網(wǎng)絡(luò)監(jiān)測(cè) , 網(wǎng)頁(yè)截屏 ,以及 無(wú)界面測(cè)試 等。
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
此過(guò)程比較耗時(shí),可以先去打個(gè)飛機(jī),編譯完這個(gè)目錄大概有700多M
4. 測(cè)試
cat baidu.js
var page = require('webpage').create();
page.open('http://www.baidu.com', function () {
page.render('baidu.png');
phantom.exit();
});
運(yùn)行
./phantomjs/bin/phantomjs baidu.js
可以看到本地生產(chǎn)的baidu.png
baidu
看,它會(huì)把整個(gè)頁(yè)面給截下來(lái),下面我們繼續(xù)進(jìn)行細(xì)致的截圖。
三、按要求截圖
先看看原網(wǎng)頁(yè)
kibana
我們只要中間的餅圖和它上面的一行狀態(tài)碼數(shù)量統(tǒng)計(jì),
1. 改善腳本1
cat kibana.js
var page=require('webpage').create();
var address='http://log.xxx.cn/#/dashboard/file/sla.json'; // 設(shè)置url
var output='kiban.png'; // 設(shè)置保存文件名
page.viewportSize={width:1024,height:800}; // 設(shè)置查看頁(yè)面的分辨率
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}; // 設(shè)置頁(yè)邊距,從而獲取想要的圖片,需要慢慢調(diào)整
page.render(output); // 保存圖片
phantom.exit();
},20000);
}
});
運(yùn)行,可以得到如下圖:
Paste_Image.png
你也可以只要中間的餅圖,為了方便用同樣的方法獲得其他網(wǎng)頁(yè)的統(tǒng)計(jì)截圖,再次修改下腳本
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}; // 設(shè)置查看頁(yè)面的分辨率
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}; // 設(shè)置頁(yè)邊距,從而獲取想要的圖片,需要慢慢調(diào)整
page.render(output); // 保存圖片
phantom.exit();
},20000);
}
});
如上,我們把url和文件名改成接收參數(shù)
運(yùn)行:
./phantomjs/bin/phantomjs kibana.js http://log.xxx.cn/#/dashboard/file/sla.json kibana.png
我們只需要變換url和文件名,就可以獲得其他統(tǒng)計(jì)圖,完成后我們把它加到郵件發(fā)出去
四、發(fā)送郵件
python發(fā)郵件沒(méi)啥好說(shuō)的,網(wǎng)上有很多腳本,我也是在網(wǎng)上擼的腳本,剛開(kāi)始郵件是能發(fā),但是發(fā)的圖片總是以附件形式展示,而不是打開(kāi)郵件就能看到截圖,在網(wǎng)上找了好久終于找到 Python/Perl 如何在HTML郵件正文中嵌入本地圖片,原來(lái)要先把圖片插入html頁(yè)面,然后以html形式發(fā)送郵件,最后腳本如下:
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 *
# 定義函數(shù)
def send_mail(to_list, sub):
me = mail_user + ""
msg = MIMEMultipart()
msg['Subject'] = sub
msg['From'] = me
msg['To'] = "".join(to_list)
# 生成不同的url,并通過(guò)/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))
#二進(jìn)制模式讀取圖片,并綁定到郵件頭
with open(i+'.png', 'rb') as fp:
img = MIMEImage(fp.read())
img.add_header('Content-ID', i)
msg.attach(img)
# kibana會(huì)收集從此刻算起前24小時(shí)的數(shù)據(jù),我在郵件開(kāi)頭記錄時(shí)間間隔,
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
#構(gòu)造html
html = """\
采集時(shí)間: """ + 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" >
"""
# 請(qǐng)把 [img 換成
context = MIMEText(html,_subtype='html',_charset='utf-8') #定義發(fā)送的形式和編碼格式,這里以html形式發(fā)送
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
# 設(shè)置服務(wù)器名稱、用戶名、密碼以及郵件后綴
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(',') #發(fā)送多人
sub= sys.argv[2]
# send_mail
if send_mail(mailto_list, sub):
print "Send mail succed!"
else:
print "Send mail failed!"
運(yùn)行:
python send_sla.py jianwen.lu@xxx.com "網(wǎng)站服務(wù)狀態(tài)sla"
由于es查詢?nèi)罩?#xff0c;并給kibana展示需要花點(diǎn)時(shí)間,所以你最好去打個(gè)飛機(jī)再來(lái)
我們收下郵件:
點(diǎn)擊藍(lán)色字體,還可以直接去頁(yè)面看
好了,至此,做好計(jì)劃任務(wù),等著每天發(fā)圖了,啦啦啦。
總結(jié)
以上是生活随笔為你收集整理的python自动截图发送邮件_PhantomJS按尺寸截取页面,并用python发送邮件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用什么方法可以有效去除新装修的房子甲醛
- 下一篇: 在武汉抗衰除皱面部提升方面做的好的医生?