520那天我被绿了...
共 7422字,需浏览 15分钟
·
2021-06-03 02:58
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
来反解坐标了。
具体的代码如下:
通过baidu Map的API将GPS信息转换成地址
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,你会慢慢地爱上它,这种爱悠远绵长!各位看官,别忙着敲代码,先点个在看
和赞
二连!