当前位置 博文首页 > 纯洁的微笑:女友加班发自拍,男友用几行代码发现惊天秘密...
文 |?闲欢
来源:Python 技术「ID: pythonall」
520是一年几度的重要日子,青男俊女们全城出动,鲜花遍地,朋友圈也开启了晒礼物大赛。
在这个重要的日子里,大多数文章会教你如何送礼物,如何约会,如何虐狗。我却不一样,我今天要教你如何识别海王,如何摘绿帽!
一哥们在这天早早收班,下班就准点溜了,准备回家跟女友一起浪漫地渡过这个重要的夜晚。可谁料女朋友跟他说今晚要加班,可能会比较晚回家。哥们情绪有点低落,准备回家打几把王者。
在回家的路上,他收到女朋友发来的一张自拍照,并且嘱咐他要乖乖的在家等她回去。
这张照片(非原照片,看官们别想入非非!)看起来没什么特别,没什么背景,只有一个正脸照。但是这哥们在地铁上端详了许久,又联想到女朋友平时很少加班,怎么恰巧今天这么特殊的日子需要加班?突然一个奇怪的想法冒出头,该不会有隐情吧?
他始终感觉有点不踏实,又不想打电话问女朋友(这种询问一般会让女方认为你不信任她),索性回家打开电脑,开始敲起代码来。
那么,他为什么要敲代码呢?到底敲的是什么代码呢?
他的思路是这样的,我们拍的照片一般都会附带一些附加信息,比如照片的拍摄时间、拍摄地点等。那么我可以通过写程序去读取这些信息,然后看看拍摄地点是不是女朋友的公司,就可以知道她是否真的在公司加班了。
首先,他获取到照片,存放在电脑的某个文件夹下。
接着,安装一个 Python 的第三方库?exifread
。
pip3 install exifread
这个库的强大之处就是它可以直接读取照片信息。主要是使用这个方法:
tags = exifread.process_file(f)
我们运行一下,可以看到照片里面包含的很详细的信息,有很多:
具体实现程序:
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)
????????????#?经度
????????????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}
从这里面,我们就可以获取到照片拍摄的地点的经纬度,这样虽然说可以粗略地看出是在哪一块。并不能看到具体的位置信息,如果想看到位置信息,那么第一种方法可以百度查找经纬度,百度有提供坐标反解成地点的功能。
作为有追求的程序员,这样做一方面有点“low逼”,另一方面总感觉一件事情只做了一半没完成。所以我们肯定要用自动反解的方法,才可以体现出优越感。
百度有开发者接口,可以自己去注册一个,成为百度地图开发者,然后就可以调用?API
?来反解坐标了。
具体的代码如下:
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
这里面需要将百度地图开发者的?secret_key
?放进去就可以,上面是我的 key ,如果你不想麻烦,可以用我的试试。
接下来,就是见证奇迹的时刻了,我们来看看程序运行的结果:
拍摄时间:2021:05:20 19:33:20
照片拍摄地址:('湖北省武汉市洪山区雄楚大道1070',?'湖北省',?'武汉市',?'洪山区',?'立顿酒店-金俊花园东南130米')
这哥们看到这个傻眼了,立马去地图上搜了一下,这跟他女朋友的公司还有好远,这有极大概率是戴绿帽了...
接下来的剧情咱就不说了,大家自己发挥想象吧!
这世道,浮云太多,学会 Python,你就拥有一双火眼金睛,去洞察世间的万事万物。感情会存在背叛,Python 不会,所以多学学使用 Python,你会慢慢地爱上它,这种爱悠远绵长!各位看官,别忙着敲代码,先点个在看
和赞
二连!
PS:公号内回复「Python」即可进入Python 新手学习交流群,一起 100 天计划!
老规矩,兄弟们还记得么,右下角的 “在看” 点一下,如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!
【代码获取方式】
识别文末二维码,回复:20210522
cs