4

女友加班发自拍,男友用几行代码发现惊天秘密...

 3 years ago
source link: http://www.justdopython.com/2021/05/20/picinfo/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

女友加班发自拍,男友用几行代码发现惊天秘密...

发表于 2021-05-20

| 分类于 python

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

示例代码:(https://github.com/JustDoPython/python-examples/tree/master/xianhuan/picinfo)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK