哈喽大家好,我是鹏哥。
今天要记录的主题是 —— 用python获取个人隐私:个人历史足迹。
~~~上课铃~~~
莫问归期蒋雪儿 - 莫问归期
1
写在前面
周三的时候我转了篇翔哥的博客,很有意思。看完文章,我突然产生了一些问题和自己的猜想。
(1)为什么我就拍了一张照片,老板就能乐呵呵、得意地告诉我,我去了哪里?
(2)为什么抖音能知道我在哪个城市,进行广告的精准投放?
(3)为什么百度网盘知道我几年前去过的国外城市,并“友善”地提示我“青春的回忆”?
………
类似的场景有很多,我们常说要保护个人隐私,可是为什么这些app却能这么清楚地知道我们的过去?
下面我就用简单的10行python代码,告诉大家原因!
2
示例代码
# coding=utf-8 # @公众号 : "鹏哥贼优秀" # @Date : 2020/1/10 # @Software : Pythonista 3(iphone终端) # @Python version: Python 3.7.2 import photos import location last_asset = photos.pick_asset() print(last_asset.location) lat = last_asset.location['latitude'] lon = last_asset.location['longitude'] coordinates = {'latitude': lat, 'longitude': lon} results = location.reverse_geocode(coordinates) print (results) 结果: {'longitude': 120.202295, 'latitude': 30.18742833, 'altitude': 12.8} [{'Street': '滨安路704号', 'SubLocality': '滨江区', 'State': '浙江省', 'SubThoroughfare': '704号', 'CountryCode': 'CN', 'Thoroughfare': '滨安路', 'Country': '中国', 'Name': '滨安路704号', 'City': '杭州市'}]
这里我在公司里拍了张照片
然后用以上示例代码即可准确得到我所在地的经纬度,从而获取到详细地址。
是不是很简单?
3
知识串讲(敲黑板啦)
下面开始我就为大家大致介绍下以上代码。
1、以上代码是基于pythonista 3 手机app实现的,所以如果是PC端你会识别不了photos库,因为这个库是pythonista3作者自己开发的。
如何安装pythonista3,可以参考我之前的博客。
【Python成长之路】如何用python开发自己的iphone应用程序,并添加至siri指令
2、photos.pick_asset() 方法是挑选你手机照片库里的照片,当然前提是要你同意授权该app获取你的摄像机权限。
当然如果你只是想获取图片实际内容,pick_assete()方法是 不行的,你需要用pick_image(),如以下代码即可选择图片并进行展示
import photos img = photos.pick_image() img.show()
另外如photos.get_assets方法还 可以获取video的相关信息。
photos.get_assets(media_type='video',include_hidden=False)
当然photos库还有其他方法,如 :
photos.get_screenshots_albm():可以获取所有截屏的图片 photos.batch_delete():批量删除图片 photos.create_image_assert():将图片的一些信息重新修改,如可以修改经纬度等 photos.capture_image():获取标准摄像机 拍摄的所有图片
3、从last_asset对象获取图片的所有信息。因为我是为了演示获取地理位置,所以用的是location字段。
这 里你可能会问,那到底一张图片里有多少信息呢?我这就给你显示出图片背后的所有信息。
{'Make': 'Apple', 'Model': 'iPhone 6s Plus', 'Orientation': 1, 'XResolution': (72, 1), 'YResolution': (72, 1), 'ResolutionUnit': 2, 'Software': '13.3', 'DateTime': '2020:01:10 21:01:00', 'YCbCrPositioning': 1, 'ExifOffset': 210, 'GPSInfo': {1: 'N', 2: ((30, 1), (11, 1), (1116, 100)), 3: 'E', 4: ((120, 1), (12, 1), (595, 100)), 5: 0, 6: (112692, 9161), 12: 'K', 13: (0, 1), 16: 'T', 17: (326268, 3881), 23: 'T', 24: (326268, 3881), 29: '2020:01:10', 31: (825167, 8892)}, 'ExposureTime': (1, 17), 'FNumber': (11, 5), 'ExposureProgram': 2, 'ISOSpeedRatings': 50, 'ExifVersion': b'0231', 'DateTimeOriginal': '2020:01:10 21:01:00', 'DateTimeDigitized': '2020:01:10 21:01:00', 36880: '+08:00', 36881: '+08:00', 36882: '+08:00', 'ComponentsConfiguration': b'\x01\x02\x03\x00', 'ApertureValue': (193685, 85136), 'MeteringMode': 5, 'Flash': 24, 'FocalLength': (83, 20), 'SubjectLocation': (2015, 1511, 2217, 1330), 'MakerNote': b'Apple iOS\x00\x00\x01MM\x00\x19\x00\x01\x00\t\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x02\x00\x07\x00\x00\x02.\x00\x00\x01@\x00\x03\x00\x07\x00\x00\x00h\x00\x00\x03n\x00\x04\x00\t\x00\x00\x00\x01\x00\x00\x00\x01\x00\x05\x00\t\x00\x00\x00\x01\x00\x00\x00\x80\x00\x06\x00\t\x00\x00\x00\x01\x00\x00\x00z\x00\x07\x00\t\x00\x00\x00\x01\x00\x00\x00\x01\x00\x08\x00\n\x00\x00\x00\x03\x00\x00\x03\xd6\x00\t\x00\t\x00\x00\x00\x01\x00\x00\x12\x13\x00\x0c\x00\n\x00\x00\x00\x02\x00\x00\x03\xee\x00\r\x00\t\x00\x00\x00\x01\x00\x00\x00\x1c\x00\x0e\x00\t\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0f\x00\t\x00\x00\x00\x01\x00\x00\x00\x02\x00\x10\x00\t\x00\x00\x00\x01\x00\x00\x00\x01\x00\x11\x00\x02\x00\x00\x00%\x00\x00\x03\xfe\x00\x14\x00\t\x00\x00\x00\x01\x00\x00\x00\x05\x00\x17\x00\t\x00\x00\x00\x01\x00\x00\x00\x00\x00\x19\x00\t\x00\x00\x00\x01\x00\x00\x00\x00\x00\x1c\x00\t\x00\x00\x00\x01\x00\x00\x00\x03\x00\x1f\x00\t\x00\x00\x00\x01\x00\x00\x00\x00\x00 \x00\x02\x00\x00\x00%\x00\x00\x04$\x00%\x00\t\x00\x00\x00\x01\x00\x00\x00\x00\x00&\x00\t\x00\x00\x00\x01\x00\x00\x00\x00\x00\'\x00\n\x00\x00\x00\x01\x00\x00\x04J\x00+\x00\x02\x00\x00\x00%\x00\x00\x04R\x00\x00\x00\x00bplist00O\x11\x02\x00\x1b\x00?\x00j\x00e\x00\x92\x00\x99\x00\x99\x00\x82\x00\x99\x00\x85\x00g\x00i\x00E\x00!\x00\x0f\x00\x11\x00\x1a\x00B\x00a\x00\x81\x00\x88\x00\xa2\x00\xb3\x00\x97\x00\xac\x00\x90\x00t\x00n\x006\x00\x17\x00\x16\x00\x18\x00\x18\x00K\x00\xbe\x00\xb4\x00\xc3\x00\xab\x00\xc2\x00\xa7\x00\xb2\x00\x89\x00w\x00k\x009\x00\x15\x00\x13\x00\x1a\x00\x16\x00K\x00\xbe\x00\xdc\x00\xda\x00\xc5\x00\xb4\x00\xbf\x00\xa6\x00\x89\x00y\x00H\x00;\x00\x18\x00\x17\x00 \x00\x14\x00:\x00\\\x00\x91\x00\xab\x00\x9b\x00\x87\x00\x81\x00p\x00\x19\x00K\x00:\x00@\x00\x1a\x00\x1b\x00\x1c\x00\x13\x00)\x00!\x00+\x00m\x00M\x00.\x00+\x00$\x00 \x006\x003\x003\x00\x10\x00\x1a\x00\x1a\x00\x13\x00(\x00I\x00\x7f\x00\x85\x00T\x006\x00/\x00(\x00"\x00 \x00&\x002\x00\x13\x00#\x00(\x00\x15\x00+\x00V\x00V\x00O\x00R\x00]\x00m\x00i\x00F\x00J\x00A\x006\x00\x19\x00\x1a\x00\x1b\x00\x19\x00#\x00,\x00L\x002\x00"\x00:\x00v\x00v\x001\x00+\x00%\x00(\x00%\x00\x1b\x00\x17\x00-\x00,\x00+\x00/\x00*\x005\x00N\x00r\x00t\x00\\\x00Z\x00O\x00K\x00C\x00>\x004\x00\x19\x00,\x001\x006\x00L\x00;\x00A\x00`\x00o\x00i\x00g\x00j\x00\\\x00S\x00O\x00K\x00\x1e\x00$\x00-\x00;\x007\x008\x00@\x00W\x00b\x00c\x00\\\x00W\x00F\x00?\x00:\x00(\x00 \x00$\x00-\x00>\x00L\x00T\x00X\x00Z\x00[\x00Z\x00X\x00V\x00P\x00H\x00=\x003\x00"\x00.\x00{\x007\x01q\x01\x8a\x01\x89\x01w\x01}\x01z\x01f\x01w\x01l\x01N\x01\x1b\x01\x9c\x00)\x00?\x00\xa1\x01d\x03\x90\x03\xa1\x03\x9a\x03x\x03\x86\x03\x98\x03\x8c\x03\x85\x03\x88\x03\x7f\x03:\x031\x02>\x00R\x00S\x02\xc0\x03\xc4\x03\xca\x03\xc9\x03\xc7\x03\xc4\x03\xbe\x03\xb4\x03\xaf\x03\x9d\x03\x82\x037\x03\xc8\x02\x00\x08\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x0cbplist00\xd4\x01\x02\x03\x04\x05\x06\x07\x08UflagsUvalueYtimescaleUepoch\x10\x01\x13\x00\x00^^\x8b\xb0Ak\x12;\x9a\xca\x00\x10\x00\x08\x11\x17\x1d\'-/8=\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xff\xb8\x8c\x00\x00G\xcf\x00\x00\ta\x00\x01\xa5\x92\xff\xff\xed\x96\x00\x01\x1f}\x00\x00\x00%\x00\x00\x00\x80\x00\x00\x00\x0f\x00\x00\x00 69A7E0C4-69FA-4080-A66A-FBE1760827BD\x00\x0098DA0B2A-5D2A-401B-91E2-71E208312A2F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0120F6EC96-0078-456F-B00B-D9EBAB17C61F\x00\x00', 'SubsecTimeOriginal': '316', 'SubsecTimeDigitized': '316', 'FlashPixVersion': b'0100', 'ColorSpace': 1, 'ExifImageWidth': 4032, 'ExifImageHeight': 3024, 'SensingMethod': 2, 'SceneType': 1, 'ExposureMode': 0, 'WhiteBalance': 0, 'FocalLengthIn35mmFilm': 29, 'SceneCaptureType': 0, 'LensSpecification': ((83, 20), (83, 20), (11, 5), (11, 5)), 'LensMake': 'Apple', 'LensModel': 'iPhone 6s Plus back camera 4.15mm f/2.2'} Latitude/Longitude: 30.186433, 120.201653 (copied to the clipboard -- you can paste this in the search field of Maps to go to the location where the photo was taken)
由于这 些信息太多,我大致罗列几个信息:手机品牌/型号、ios版本、拍摄时间、GPS信息、摄像头焦距等。
到这里,大家应该已经明白了我开篇的那些问题了吧。当我们授权手机应用程序获取我们摄像头权限后,app后台代码可以轻松获取到我们手机上所有的图片,从而获取我们设备信息、照片时间、拍摄地点等一系列隐私信息!
4、调用location库解码我们经纬度信息,即可获取地理信息,可以精确到街道几号,这就是location.reverse_geocode(coordinates)方法的使用。
4
总结
这篇博客是在翔哥的博客基础上,我做了自己全新的尝试,也算知道了为什么我拒绝了公司软件获取我地理信息,老板却仍然能知道我在哪里的原因。(以上老板纯属虚构,要是老板真能这么关心我,其实我也是乐意的,哈哈。)
~~~下课铃~~~
【往期热门文章】:
【Python成长之路】10行代码教你免费观看无广告版的《庆余年》腾讯视频
【Python成长之路】如何用python开发自己的iphone应用程序,并添加至siri指令
【Python成长之路】从 零做网站开发 -- 基于Flask和JQuery,实现表格管理平台
点击下方诗句,可以留言互动喔