520那天我被綠了...

520是一年幾度的重要日子,青男俊女們?nèi)浅鰟?dòng),鮮花遍地,朋友圈也開啟了曬禮物大賽。
在這個(gè)重要的日子里,大多數(shù)文章會(huì)教你如何送禮物,如何約會(huì),如何虐狗。我卻不一樣,我今天要教你如何識(shí)別海王,如何摘綠帽!
真實(shí)案例
一哥們在這天早早收班,下班就準(zhǔn)點(diǎn)溜了,準(zhǔn)備回家跟女友一起浪漫地渡過這個(gè)重要的夜晚。可誰料女朋友跟他說今晚要加班,可能會(huì)比較晚回家。哥們情緒有點(diǎn)低落,準(zhǔn)備回家打幾把王者。
在回家的路上,他收到女朋友發(fā)來的一張自拍照,并且囑咐他要乖乖的在家等她回去。

這張照片(非原照片,看官們別想入非非!)看起來沒什么特別,沒什么背景,只有一個(gè)正臉照。但是這哥們在地鐵上端詳了許久,又聯(lián)想到女朋友平時(shí)很少加班,怎么恰巧今天這么特殊的日子需要加班?突然一個(gè)奇怪的想法冒出頭,該不會(huì)有隱情吧?
他始終感覺有點(diǎn)不踏實(shí),又不想打電話問女朋友(這種詢問一般會(huì)讓女方認(rèn)為你不信任她),索性回家打開電腦,開始敲起代碼來。
那么,他為什么要敲代碼呢?到底敲的是什么代碼呢?
他的思路是這樣的,我們拍的照片一般都會(huì)附帶一些附加信息,比如照片的拍攝時(shí)間、拍攝地點(diǎn)等。那么我可以通過寫程序去讀取這些信息,然后看看拍攝地點(diǎn)是不是女朋友的公司,就可以知道她是否真的在公司加班了。
代碼驗(yàn)證
首先,他獲取到照片,存放在電腦的某個(gè)文件夾下。
接著,安裝一個(gè) Python 的第三方庫 exifread。
pip3 install exifread
這個(gè)庫的強(qiáng)大之處就是它可以直接讀取照片信息。主要是使用這個(gè)方法:
tags = exifread.process_file(f)
我們運(yùn)行一下,可以看到照片里面包含的很詳細(xì)的信息,有很多:

具體實(shí)現(xiàn)程序:
def extract_image(pic_path):
GPS = {}
date = ''
with open(pic_path, 'rb') as f:
tags = exifread.process_file(f)
for tag, value in tags.items():
# 緯度
if re.match('GPS GPSLatitudeRef', tag):
GPS['GPSLatitudeRef'] = str(value)
# 經(jīng)度
elif re.match('GPS GPSLongitudeRef', tag):
GPS['GPSLongitudeRef'] = str(value)
# 海拔
elif re.match('GPS GPSAltitudeRef', tag):
GPS['GPSAltitudeRef'] = str(value)
elif re.match('GPS GPSLatitude', tag):
try:
match_result = re.match('\[(\w*),(\w*),(\w.*)/(\w.*)\]', str(value)).groups()
GPS['GPSLatitude'] = int(match_result[0]), int(match_result[1]), int(match_result[2])
except:
deg, min, sec = [x.replace(' ', '') for x in str(value)[1:-1].split(',')]
GPS['GPSLatitude'] = convert_coor(deg, min, sec)
elif re.match('GPS GPSLongitude', tag):
try:
match_result = re.match('\[(\w*),(\w*),(\w.*)/(\w.*)\]', str(value)).groups()
GPS['GPSLongitude'] = int(match_result[0]), int(match_result[1]), int(match_result[2])
except:
deg, min, sec = [x.replace(' ', '') for x in str(value)[1:-1].split(',')]
GPS['GPSLongitude'] = convert_coor(deg, min, sec)
elif re.match('GPS GPSAltitude', tag):
GPS['GPSAltitude'] = str(value)
elif re.match('.*Date.*', tag):
date = str(value)
return {'GPS_information': GPS, 'date_information': date}
從這里面,我們就可以獲取到照片拍攝的地點(diǎn)的經(jīng)緯度,這樣雖然說可以粗略地看出是在哪一塊。并不能看到具體的位置信息,如果想看到位置信息,那么第一種方法可以百度查找經(jīng)緯度,百度有提供坐標(biāo)反解成地點(diǎn)的功能。
作為有追求的程序員,這樣做一方面有點(diǎn)“l(fā)ow逼”,另一方面總感覺一件事情只做了一半沒完成。所以我們肯定要用自動(dòng)反解的方法,才可以體現(xiàn)出優(yōu)越感。
百度有開發(fā)者接口,可以自己去注冊一個(gè),成為百度地圖開發(fā)者,然后就可以調(diào)用 API 來反解坐標(biāo)了。
具體的代碼如下:
通過baidu Map的API將GPS信息轉(zhuǎn)換成地址
def find_address_from_bd(GPS):
secret_key = 'wLyevcXk5QY36hTKmvV5350F'
if not GPS['GPS_information']:
return '該照片無GPS信息'
lat, lng = GPS['GPS_information']['GPSLatitude'], GPS['GPS_information']['GPSLongitude']
baidu_map_api = "http://api.map.baidu.com/geocoder/v2/?ak={0}&callback=renderReverse&location={1},{2}s&output=json&pois=0".format(
secret_key, lat, lng)
response = requests.get(baidu_map_api)
content = response.text.replace("renderReverse&&renderReverse(", "")[:-1]
baidu_map_address = json.loads(content)
formatted_address = baidu_map_address["result"]["formatted_address"]
province = baidu_map_address["result"]["addressComponent"]["province"]
city = baidu_map_address["result"]["addressComponent"]["city"]
district = baidu_map_address["result"]["addressComponent"]["district"]
location = baidu_map_address["result"]["sematic_description"]
return formatted_address, province, city, district, location
這里面需要將百度地圖開發(fā)者的 secret_key 放進(jìn)去就可以,上面是我的 key ,如果你不想麻煩,可以用我的試試。
接下來,就是見證奇跡的時(shí)刻了,我們來看看程序運(yùn)行的結(jié)果:
拍攝時(shí)間:2021:05:20 19:33:20
照片拍攝地址:('湖北省武漢市洪山區(qū)雄楚大道1070', '湖北省', '武漢市', '洪山區(qū)', '立頓酒店-金俊花園東南130米')
這哥們看到這個(gè)傻眼了,立馬去地圖上搜了一下,這跟他女朋友的公司還有好遠(yuǎn),這有極大概率是戴綠帽了...
接下來的劇情咱就不說了,大家自己發(fā)揮想象吧!
總結(jié)
這世道,浮云太多,學(xué)會(huì) Python,你就擁有一雙火眼金睛,去洞察世間的萬事萬物。感情會(huì)存在背叛,Python 不會(huì),所以多學(xué)學(xué)使用 Python,你會(huì)慢慢地愛上它,這種愛悠遠(yuǎn)綿長!各位看官,別忙著敲代碼,先點(diǎn)個(gè)在看和贊二連!
