page contents

用Python告诉你,怎么根据照片信息获取用户详细信息

有媒体曝出,微信发原图或存在泄露位置信息的风险。 对此,腾讯微信团队微博12月1日发布声明称,朋友圈发送的照片都经过系统自动压缩,不带位置等信息,实在担心的话,可以P完图再发,如下图:...

有媒体曝出,微信发原图或存在泄露位置信息的风险。 对此,腾讯微信团队微博12月1日发布声明称,朋友圈发送的照片都经过系统自动压缩,不带位置等信息,实在担心的话,可以P完图再发,如下图:

v2-2ed410f933bc91b2b0254f9299c303f9_hd.jpg

微信团队提到过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 exifread
​
pip3 install geopy

Python源码

import exifread
import json
import urllib.request
import sys
from 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过得图片,需要说明的一点是通过微信发照片是默认压缩的!

  • 发表于 2020-02-06 15:35
  • 阅读 ( 643 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章