【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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章