本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。
作者: 王翔 清風Python
PS:如有需要Python學習資料的小伙伴可以加點擊下方鏈接自行獲取
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef
通過委托人的述說,專門查了一下深圳最近的天氣,保持在10-20度之間,帶羽絨服的動作確實有些匪夷所思。因為只是懷疑不能直白的查崗,該如何默默地私下調查呢?在和委托人深入探討時,看到她老公發了一張漢庭酒店的入住照片。然而漢庭酒店在全國都有分店,也不能說明什么啊!
突然我靈機一動,也許這一張足以成為是否出軌的證據了!在委托人疑惑中,我讓她把這張照片發到了我的電腦上,經過我飛速的代碼編寫,真想就此浮出水面!
通過解析照片,獲取到了照片的詳細與經緯度,在通過經緯度逆推,得到了最終的拍攝地理位置:陝西省西安市碑林區含光北路162號,拿起手機搜索了一下這個地址實錘了,漢庭酒店無疑!
委托人的連夜機票,最終完成了千里捉小三的壯舉!全劇終…
獲取地理位置
故事到這里結束了,但是小P偵探是如何通過代碼解析到照片中的具體位置呢?如果人人都可以通過照片解析他人的位置,豈不是亂了套了!別急,想通過代碼解析微信發送的照片地理位置,需要滿足以下幾點要求:
1、他人通過選擇原圖的方式,發送照片 2、相機拍照時,默認設置了GPS定位 3、非iphone手機(iphone的地理位置,不會保存在照片中)
現在的手機在拍照時,默認都是打開GPS地位的。那么你只需要確認對方手機不是iphone的,然后讓他給你發送原圖就OK了。
照片屬性中保存了經緯度,可我們如何能通過經緯度逆推地理位置呢?此時我們需要使用到百度地圖的逆地理編碼工具:
1 import requests 2 import exifread 3 4 5 class GetPhotoInfo: 6 def __init__(self, photo): 7 self.photo = photo 8 # 百度地圖ak 9 self.ak = 'nYPs4LQ9a4VhVxj55AD69K6zgsRy9o4z' 10 self.location = self.get_photo_info() 11 12 def get_photo_info(self, ): 13 with open(self.photo, 'rb') as f: 14 tags = exifread.process_file(f) 15 try: 16 # 打印照片其中一些信息 17 print('拍攝時間:', tags['EXIF DateTimeOriginal']) 18 print('照相機制造商:', tags['Image Make']) 19 print('照相機型號:', tags['Image Model']) 20 print('照片尺寸:', tags['EXIF ExifImageWidth'], tags['EXIF ExifImageLength']) 21 # 緯度 22 lat_ref = tags["GPS GPSLatitudeRef"].printable 23 lat = tags["GPS GPSLatitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",") 24 lat = float(lat[0]) + float(lat[1]) / 60 + float(lat[2]) / float(lat[3]) / 3600 25 if lat_ref != "N": 26 lat = lat * (-1) 27 # 經度 28 lon_ref = tags["GPS GPSLongitudeRef"].printable 29 lon = tags["GPS GPSLongitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",") 30 lon = float(lon[0]) + float(lon[1]) / 60 + float(lon[2]) / float(lon[3]) / 3600 31 if lon_ref != "E": 32 lon = lon * (-1) 33 except KeyError: 34 return "ERROR:請確保照片包含經緯度等EXIF信息。" 35 else: 36 print("經緯度:", lat, lon) 37 return lat, lon 38 39 def get_location(self): 40 url = 'http://api.map.baidu.com/reverse_geocoding/v3/?ak={}&output=json' \ 41 '&coordtype=wgs84ll&location={},{}'.format(self.ak, *self.location) 42 response = requests.get(url).json() 43 status = response['status'] 44 if status == 0: 45 address = response['result']['formatted_address'] 46 print('詳細地址:', address) 47 else: 48 print('baidu_map error') 49 50 51 if __name__ == '__main__': 52 Main = GetPhotoInfo('微信圖片_20191203180732.jpg') 53 Main.get_location()