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,你会慢慢地爱上它,这种爱悠远绵长!各位看官,别忙着敲代码,先点个在看二连!

end


浏览 46
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报