女友半夜加班發(fā)自拍抒寂,IT男友用30行python代碼發(fā)現(xiàn)驚天秘密

點擊上方“機器學(xué)習(xí)愛好者社區(qū)”

選擇“星標”公眾號,重磅干貨掠剑,第一時間送達

這是一個悲傷的故事

昨天屈芜,我司的python開發(fā)小哥剛準備下班陪女友共進晚餐,滿心期待地盼著女友的回復(fù)朴译,卻接到女友晚上要加班的電話井佑,滿滿的失落感涌上心頭~

還有比這空歡喜更讓人傷心難過的事情嘛!emmm還真有

不一會兒动分,小哥哥的女友發(fā)來了一張自稱在加班并將背景模糊的自拍照毅糟,故事從這兒就開始了:

? 如下 ↓ ↓ ↓

不就是一張自拍照嗎?這事兒又是為何最終讓人難過呢澜公,難道這不是女友在安慰我們的python開發(fā)小哥哥嗎姆另?

老鐵們,你們要是這么想坟乾,接下來文章內(nèi)容一定要細細品味迹辐、好好學(xué)習(xí)、深入研究……

為何女友要背景虛化甚侣?為何要特意發(fā)照片明吩?明明平常工作不加班呀?

面對重重疑惑殷费,我們的python開發(fā)小哥哥心生疑慮印荔,決心運用所學(xué)python知識對女友自拍照編寫了一段代碼進行分析,不遛彎了详羡,結(jié)果卻顯示照片的拍攝地址為「X X酒店」

綠帽從天而降仍律,小哥哥這綠帽子是戴的穩(wěn)穩(wěn)的了,好在及時止損了实柠,不然天天為老板996水泉,最終換來的卻是女友的669??

想知道小哥哥是如何捍衛(wèi)自己男人的尊嚴的,快拿小本本記下來窒盐,快拿小本本記下來草则,快拿小本本記下來!P防臁炕横!?

重要事情說三遍

第一步:編寫python腳本分析照片

通過下載發(fā)來的照片原圖,利用python來編寫全文的腳本文件葡粒,由此讀取照片中拍攝的詳細地址(地址可以詳細到具體的街道和酒店名稱)

第二步:引入exifread模塊

再安裝python中的exifread模塊看锉,用于照片分析

pip install exifread 安裝exfriead模塊姿锭。

PS C:\WINDOWS\system32> pip install exifread
Collecting exifread
Downloading ExifRead-2.3.2-py3-none-any.whl (38 kB)
Installing collected packages: exifread
Successfully installed exifread-2.3.2
PS C:\WINDOWS\system32> pip install json

第三步:讀取GPS定位的經(jīng)緯度信息

通過Python的exifread模塊,可以讀取照片中隱藏的經(jīng)緯度信息(其實我們?nèi)粘5恼掌型[藏著很多的秘密伯铣,包括拍攝時間以及經(jīng)緯度等)

#讀取照片的GPS經(jīng)緯度信息
def find_GPS_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'] = latitude_and_longitude_convert_to_decimal_system(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'] = latitude_and_longitude_convert_to_decimal_system(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}

第四步:利用百度API將GPS轉(zhuǎn)地址

最后我們再通過調(diào)用百度的API接口呻此,將獲得的GPS經(jīng)緯度信息轉(zhuǎn)換為可定位讀取的具體地址信息

def find_address_from_GPS(GPS):
secret_key = 'zbLsuDDL4CS2U0M4KezOZZbGUY9iWtVf'
if not GPS['GPS_information']:
return '該照片無GPS信息'
#經(jīng)緯度信息
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)
#百度API轉(zhuǎn)換成具體的地址
content = response.text.replace("renderReverse&&renderReverse(", "")[:-1]
print(content)
baidu_map_address = json.loads(content)
#將返回的json信息解析整理出來
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

if __name__ == '__main__':
GPS_info = find_GPS_image(pic_path='C:/女友自拍.jpg')
address = find_address_from_GPS(GPS=GPS_info)
print("拍攝時間:" + GPS_info.get("date_information"))
print('照片拍攝地址:' + str(address))

接下來就靜待開獎……

{"status":0,"result":{"location":{"lng":103.41424699999998,"lat":24.410461020097278},
"formatted_address":"云南省紅河哈尼族彝族自治州彌勒縣",
"business":"",
"addressComponent":{"country":"中國",
"country_code":0,
"country_code_iso":"CHN",
"country_code_iso2":"CN",
"province":"云南省",
"city":"紅河哈尼族彝族自治州",
"city_level":2,"district":"彌勒縣",
"town":"","town_code":"","adcode":"532526",
"street_number":"",
"direction":"","distance":""},
"sematic_description":"湖泉酒店-A座東南128米",
"cityCode":107}}

拍攝時間:2021:5:03 20:05:32
照片拍攝地址:('云南省紅河哈尼族彝族自治州彌勒縣', '云南省', '紅河哈尼族彝族自治州', '彌勒縣', '湖泉酒店-A座東南128米')

完整代碼如下

import exifread
import re
import json
import requests
import os

#轉(zhuǎn)換經(jīng)緯度格式
def latitude_and_longitude_convert_to_decimal_system(*arg):
"""
經(jīng)緯度轉(zhuǎn)為小數(shù), param arg:
:return: 十進制小數(shù)
"""
return float(arg[0]) + ((float(arg[1]) + (float(arg[2].split('/')[0]) / float(arg[2].split('/')[-1]) / 60)) / 60)

#讀取照片的GPS經(jīng)緯度信息
def find_GPS_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'] = latitude_and_longitude_convert_to_decimal_system(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'] = latitude_and_longitude_convert_to_decimal_system(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}

#通過baidu Map的API將GPS信息轉(zhuǎn)換成地址。
def find_address_from_GPS(GPS):
"""
使用Geocoding API把經(jīng)緯度坐標轉(zhuǎn)換為結(jié)構(gòu)化地址腔寡。
:param GPS:
:return:
"""
secret_key = 'zbLsuDDL4CS2U0M4KezOZZbGUY9iWtVf'
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]
print(content)
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
if __name__ == '__main__':
GPS_info = find_GPS_image(pic_path='C:/Users/pacer/desktop/img/5.jpg')
address = find_address_from_GPS(GPS=GPS_info)
print("拍攝時間:" + GPS_info.get("date_information"))
print('照片拍攝地址:' + str(address))

?·合作焚鲜、交流請關(guān)注:公眾號「機器學(xué)習(xí)愛好者社區(qū)」(ML_shequ)

?·轉(zhuǎn)載請?zhí)砑游⑿牛簓imudeguo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市放前,隨后出現(xiàn)的幾起案子忿磅,更是在濱河造成了極大的恐慌,老刑警劉巖凭语,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葱她,死亡現(xiàn)場離奇詭異,居然都是意外死亡似扔,警方通過查閱死者的電腦和手機吨些,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炒辉,“玉大人豪墅,你說我怎么就攤上這事∏埽” “怎么了偶器?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缝裤。 經(jīng)常有香客問我屏轰,道長,這世上最難降的妖魔是什么憋飞? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任霎苗,我火速辦了婚禮,結(jié)果婚禮上搀崭,老公的妹妹穿的比我還像新娘。我一直安慰自己猾编,他們只是感情好瘤睹,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著答倡,像睡著了一般轰传。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘪撇,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天获茬,我揣著相機與錄音港庄,去河邊找鬼。 笑死恕曲,一個胖子當著我的面吹牛鹏氧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播佩谣,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼把还,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了茸俭?” 一聲冷哼從身側(cè)響起吊履,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎调鬓,沒想到半個月后艇炎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡腾窝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年缀踪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燕锥。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辜贵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出归形,到底是詐尸還是另有隱情托慨,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布暇榴,位于F島的核電站厚棵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蔼紧。R本人自食惡果不足惜婆硬,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奸例。 院中可真熱鬧彬犯,春花似錦、人聲如沸查吊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逻卖。三九已至宋列,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間评也,已是汗流浹背炼杖。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工灭返, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坤邪。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓熙含,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罩扇。 傳聞我的和親對象是個殘疾皇子婆芦,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容