• 520那天我被绿了...



    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

    
    
  • 相关阅读:
    LeetCode 130. 被围绕的区域 (DFS)
    LeetCode 200. 岛屿数量 (BFS)
    LeetCode 200. 岛屿数量 (DFS)
    Win10下Anaconda命令行相关操作
    LeetCode 53. 最大子序和
    从尾到头打印链表
    字符串逆序
    交换俩字符串
    LeetCode 147. 对链表进行插入排序
    LeetCode 面试题 02.08. 环路检测
  • 原文地址:https://www.cnblogs.com/finer/p/14939778.html
Copyright © 2020-2023  润新知