【Python成长之路】为什么我就拍了张照片,老板就知道我在哪里?

哈喽大家好,我是鹏哥。

 

今天要记录的主题是 —— 用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 photosimport locationlast_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 photosimg = 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,实现表格管理平台

点击下方诗句,可以留言互动喔  

 

神明不诉人间苦,凡人却溺过往事。

 

【关注“鹏哥贼优秀”公众号,回复“python学习材料”,将会有python基础学习、机器学习、数据挖掘、高级编程教程等100G视频资料,及100+份python相关电子书免费赠送!】

 

扫描二维码

    与鹏哥一起

学python吧!

发布了38 篇原创文章 · 获赞 17 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章