最近在作一個項目,有一個很重要的點是須要獲取使用用戶的手機信息,這裏我選擇從照片中獲取信息。有人會問爲何不從手機裏面直接獲取設備信息。因爲如今android系統的權限設置作的愈來愈好,直接獲取信息極可能被認定爲非法獲取用戶隱私,因此不打算使用這個思路。python
個人思路是,獲取用戶上傳的圖片中的信息,這樣就能夠儘可能減小用戶手機上的權限申請數量,讓咱們的應用更加受歡迎,(試想一個APP一裝上來就請求十幾二十個一大堆權限列表,你會開心的去安裝嗎)。正好應用的一個功能須要用戶上傳圖片,正好順帶這個功能把一些數據獲取功能作了,豈不是一箭雙鵰,一石二鳥。下面簡單介紹下這個技術。android
在現代的數碼相機保存的圖片中,有一個分區叫作 EXIF
, 正是它的存在保證了能夠經過圖片獲取手機的一些參數。下面是維基百科關於EXIF
的介紹:編程
可交換圖像文件格式(英語:Exchangeable image file format,官方簡稱Exif),是專門爲數碼相機的照片設定的,能夠記錄數碼照片的屬性信息和拍攝數據。後端
Exif能夠附加於JPEG、TIFF、RIFF等文件之中,爲其增長有關數碼相機拍攝信息的內容和索引圖或圖像處理軟件的版本信息。*編程語言
wiki上的內容至少告訴咱們兩點:設計
一是這個 EXIF 是專門設計來爲數碼相機保存照片屬性設計的。code
二是這個 EXIF 是能夠附加在常見的各類圖片格式中的orm
正是這些特性讓咱們能夠從圖片中提取手機設備的信息。索引
只要掌握了其格式, 理論上能夠經過各類編程語言對 EXIF 數據進行提取。因爲咱們的應用後端是 python 開發的,因此這裏介紹如何用 python 進行提取。圖片
感謝強大的python, 不少現成的庫供咱們調用, 直接使用PIL庫就能夠完成這項工做, 首先你須要安裝這個庫:
pip install pillow
下面是核心代碼,基本的思路就是先經過 PIL.Image 讀取圖片,而後根據 PIL.ExifTags 中的關鍵字生成手機參數字典,字典生成出來了,至於這些數據怎麼用就八仙過海,各顯申通了。下面是實現代碼:
import PIL.Image import PIL.ExifTags import sys if len(sys.argv) != 2: print("Usage: {} image_file".format(sys.arg[0])) exit() # 經過 PIL.Image.open 讀取圖片 img = PIL.Image.open(sys.argv[1]) # 生成手機參數數據字典 exif = { PIL.ExifTags.TAGS[k]: v for k, v in img._getexif().items() if k in PIL.ExifTags.TAGS } # 打印這些信息 for info in exif: print(info, end=':') print(exif[info])
運行後獲得的結果(有的關鍵信息我已經打了馬賽克,或者刪了,畢竟隱私嘛。):
(imageExif) λ python get_exif.py IMG20190324132051.jpg GPSInfo: 馬賽克 :) ResolutionUnit:2 ExifOffset:250 Make:OPPO Model:OPPO R11 DateTime:2019:03:24 13:20:51 Flash:16 ......
注意看數據,
如 GPSInfo
信息記錄了在拍攝這張照片時用戶所處的地理位置,同時記錄了拍攝時間。
如 Make
字段記錄了用戶也難怪的什麼手機 這裏我用的是 OPPO R11。
固然,其餘語言也可作這個,歡迎討論。