当前位置 博文首页 > 纯洁的微笑:女友加班发自拍,男友用几行代码发现惊天秘密...

    纯洁的微笑:女友加班发自拍,男友用几行代码发现惊天秘密...

    作者:[db:作者] 时间:2021-07-25 22:13

    文 |?闲欢

    来源: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?来反解坐标了。

    具体的代码如下:

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

    PS:公号内回复「Python」即可进入Python 新手学习交流群,一起 100 天计划!

    老规矩,兄弟们还记得么,右下角的 “在看” 点一下,如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!

    代码获取方式

    识别文末二维码,回复:20210522

    cs