博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python-根据照片信息获取用户详细信息(微信发原图或泄露位置信息)
阅读量:2070 次
发布时间:2019-04-29

本文共 2998 字,大约阅读时间需要 9 分钟。

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者: 蒙娜丽胖

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取


前言

有媒体曝出,微信发原图或存在泄露位置信息的风险。

对此,腾讯微信团队微博12月1日发布声明称,朋友圈发送的照片都经过系统自动压缩,不带位置等信息,实在担心的话,可以P完图再发,如下图:
在这里插入图片描述
微信团队提到过Exif,何为Exif?

可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。

Exif最初由日本电子工业发展协会在1996年制定,版本为1.0。1998年,升级到2.1,增加了对音频文件的支持。2002年3月,发表了2.2版。

Python库

这里需要Python的两个库,一个是读取Exif信息的exifread;一个是根据经纬度获取详细地址信息的geopy;

安装如下:

pip3 install exifreadpip3 install geopy

Python源码

import exifreadimport jsonimport urllib.requestimport sysfrom geopy.geocoders import Nominatim# 获取照片的详细信息def get_img_infor_tup(photo):    img_file = open(photo, 'rb')    image_map = exifread.process_file(img_file)    try:        #图片的经度        img_longitude_ref = image_map["GPS GPSLongitudeRef"].printable        img_longitude = image_map["GPS GPSLongitude"].printable[1:-1].replace(" ","").replace("/",",").split(",")        img_longitude = float(img_longitude[0])+float(img_longitude[1])/60+float(img_longitude[2])/float(img_longitude[3])/3600        if img_longitude_ref != "E":            img_longitude = img_longitude * (-1)        #图片的纬度        img_latitude_ref = image_map["GPS GPSLatitudeRef"].printable        img_latitude = image_map["GPS GPSLatitude"].printable[1:-1].replace(" ","").replace("/",",").split(",")        img_latitude = float(img_latitude[0])+float(img_latitude[1])/60+float(img_latitude[2])/float(img_latitude[3])/3600        if img_latitude_ref != "N":            img_latitude = img_latitude*(-1)        #照片拍摄时间        img_create_date = image_map["EXIF DateTimeOriginal"].printable        img_file.close()        # 返回经纬度元组        return img_longitude, img_latitude, img_create_date    except Exception as e:        print('ERROR:图片中不包含Gps信息')# 根据经纬度获取详细的信息def get_detail_infor(lat, lon):    reverse_value = str(lat) + ', ' + str(lon)    geolocator = Nominatim()    location = geolocator.reverse(reverse_value)    print('照片的经纬度信息:')    print((location.latitude, location.longitude))    print('照片的地址信息:')    print(location.address)        print('照片的全部信息:')    print(location.raw)if __name__ == '__main__':    infor_tup = get_img_infor_tup('./image/IMG_2174.JPG')    get_detail_infor(infor_tup[1], infor_tup[0])

运行结果

照片的经纬度信息:(31.2734692, 121.4653229)照片的地址信息:Appart Jeje, 45, 柳营路, 卓悦局, 静安区, 上海市, 200072, China 中国照片的全部信息:{
'place_id': 245107137, 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright', 'osm_type': 'node', 'osm_id': 6066843985, 'lat': '31.2734692', 'lon': '121.4653229', 'display_name': 'Appart Jeje, 45, 柳营路, 卓悦局, 静安区, 上海市, 200072, China 中国', 'address': {
'address29': 'Appart Jeje', 'house_number': '45', 'road': '柳营路', 'neighbourhood': '卓悦局', 'city': '静安区', 'county': '静安区', 'state': '上海市', 'postcode': '200072', 'country': 'China 中国', 'country_code': 'cn'}, 'boundingbox': ['31.2733692', '31.2735692', '121.4652229', '121.4654229']}

结束语

Exif针对所以的原图照片,所以在发照片的时候如果不想个人信息被泄露,可以发压缩过得图片和PS过得图片,需要说明的一点是通过微信发照片是默认压缩的!

转载地址:http://bgjmf.baihongyu.com/

你可能感兴趣的文章
oracle 聚合函数 LISTAGG ,将多行结果合并成一行
查看>>
Oracle列转行函数 Listagg() 语法详解及应用实例
查看>>
LISTAGG函数的用法
查看>>
Oracle Spatial操作geometry方法
查看>>
IDEA类和方法注释模板设置(非常详细)
查看>>
Java程序初始化的顺序
查看>>
Dubbo和Spring结合配置文件内容解析为bean的过程
查看>>
fastJson注解@JSONField使用的一个实例
查看>>
fastjson的@JSONField注解的一点问题
查看>>
fastjson使用(三) -- 序列化
查看>>
浅谈使用单元素的枚举类型实现单例模式
查看>>
Java 利用枚举实现单例模式
查看>>
Java 动态代理作用是什么?
查看>>
Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM) (清晰,浅显)
查看>>
三种线程安全的单例模式
查看>>
Spring AOP 和 动态代理技术
查看>>
从 volatile 说起,可见性和有序性是什么
查看>>
如何开始接手一个项目
查看>>
Netty 5用户指南
查看>>
Java实现简单的RPC框架
查看>>