使用 python 提取照片中的手机信息

最近在做一个项目,有一个很重要的点是需要获取使用用户的手机信息,这里我选择从照片中获取信息。有人会问为什么不从手机里面直接获取设备信息。由于现在android系统的权限设置做的越来越好,直接获取信息很可能被认定为非法获取用户隐私,所以不打算使用这个思路。

我的思路是,获取用户上传的图片中的信息,这样就可以尽量减少用户手机上的权限申请数量,让我们的应用更加受欢迎,(试想一个APP一装上来就请求十几二十个一大堆权限列表,你会开心的去安装吗)。正好应用的一个功能需要用户上传图片,正好顺带这个功能把一些数据获取功能做了,岂不是两全其美,一石二鸟。下面简单介绍下这个技术。

0x01 为什么可以通过图片获取手机信息

在现代的数码相机保存的图片中,有一个分区叫做 EXIF , 正是它的存在保证了可以通过图片获取手机的一些参数。下面是维基百科关于EXIF的介绍:

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

Exif可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。*

wiki上的内容至少告诉我们两点:

一是这个 EXIF 是专门设计来为数码相机保存照片属性设计的。

二是这个 EXIF 是可以附加在常见的各种图片格式中的

正是这些特性让我们可以从图片中提取手机设备的信息。

0x02 通过 Python 提取 EXIF 中的信息

只要掌握了其格式, 理论上可以通过各种编程语言对 EXIF 数据进行提取。由于我们的应用后端是 python 开发的,所以这里介绍如何用 python 进行提取。

感谢强大的python, 很多现成的库供我们调用, 直接使用PIL库就可以完成这项工作, 首先你需要安装这个库:

  1. pip install pillow

下面是核心代码,基本的思路就是先通过 PIL.Image 读取图片,然后根据 PIL.ExifTags 中的关键字生成手机参数字典,字典生成出来了,至于这些数据怎么用就八仙过海,各显申通了。下面是实现代码:

  1. import PIL.Image
  2. import PIL.ExifTags
  3. import sys
  4. if len(sys.argv) != 2:
  5. print("Usage: {} image_file".format(sys.arg[0]))
  6. exit()
  7. # 通过 PIL.Image.open 读取图片
  8. img = PIL.Image.open(sys.argv[1])
  9. # 生成手机参数数据字典
  10. exif = {
  11. PIL.ExifTags.TAGS[k]: v
  12. for k, v in img._getexif().items()
  13. if k in PIL.ExifTags.TAGS
  14. }
  15. # 打印这些信息
  16. for info in exif:
  17. print(info, end=':')
  18. print(exif[info])

运行后得到的结果(有的关键信息我已经打了马赛克,或者删了,毕竟隐私嘛。):

  1. (imageExif) λ python get_exif.py IMG20190324132051.jpg
  2. GPSInfo: 马赛克 :)
  3. ResolutionUnit:2
  4. ExifOffset:250
  5. Make:OPPO
  6. Model:OPPO R11
  7. DateTime:2019:03:24 13:20:51
  8. Flash:16
  9. ......

注意看数据,

GPSInfo 信息记录了在拍摄这张照片时用户所处的地理位置,同时记录了拍摄时间。

Make 字段记录了用户也难怪的什么手机 这里我用的是 OPPO R11。

当然,其他语言也可做这个,欢迎讨论。

使用 python 提取照片中的手机信息的更多相关文章

  1. Python 日志输出中添加上下文信息

    Python日志输出中添加上下文信息 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如: ...

  2. python+adb实现自动化获取手机信息

    首先我们先看一下使用adb查看Android手机信息的指令 #获取手机名称NAME = 'adb shell getprop ro.product.model'#获取手机版本VERSION = 'ad ...

  3. python提取mysql中指定列参数,并循环打印

    试验环境: Python 3.7.0 Mysql 5.0 实验目的: 使用python将数据库中指定的列中的数值取出来,并循环遍历,用以当成参数传递给需要它的方法. 本次实验取的是para列的数据 实 ...

  4. python 提取目录中特定类型的文件

    python使用‘os’和‘re’模块提取目录中特定类型的文件,这两个模都是安装python自带的,所以不需要安装. 思路: 使用os库lilstdir获取文件夹中的所有文件名,然后带上文件夹路径组合 ...

  5. python提取文件中的方法名称

    #提取文件中的方法名称 # -*- coding:utf-8 -*- def Query_Method(filepath): file = open(filepath,'r',encoding= 'U ...

  6. 使用正则提取字符串中URL等信息

    一.说明 背景:最近在做同步京东商品信息时遇到一个问题,同步后的商品详情无法在富文本中修改,强制修改会导致图片无法正常显示,研究发现详情中的图片是在css的作为背景图指定的. 解决:经过多次尝试,最后 ...

  7. 照片元数据信息以及在照片中写入gps信息

    /// 照片元数据编码 在下面的文章里,可以看到图片所有的元数据定义信息 https://msdn.microsoft.com/zh-cn/library/system.drawing.imaging ...

  8. 如何用Python输出PPT中的文字信息

    在这里,会用到win32com模块 模块下载地址:http://sourceforge.net/projects/pywin32/files/pywin32/ 代码如下: import win32co ...

  9. python 提取字符串中的指定字符 正则表达式

    例1: 字符串: '湖南省长沙市岳麓区麓山南路麓山门' 提取:湖南,长沙 在不用正则表达式的情况下: address = '湖南省长沙市岳麓区麓山南路麓山门' address1 = address.s ...

随机推荐

  1. Android能够获取到唯一的设备ID吗?

    Android是否有唯一的设备ID,如果有的话,该怎样快速有效获取? Settings.Secure#ANDROID_ID 返回Android ID ,是一个64位的16进制字符串 1 2 3 imp ...

  2. 初探js

    第一章   1.JS的位置 1-1.行间 1-2.内嵌 1-3.外联 2.JS的标签位置 页面中的代码在一般情况下会按从上到下的顺序,从左往右的顺序执行. 因此当JS放在了元素上面的时候,就不能正常执 ...

  3. WPF窗口继承实现统一风格的自定义窗口

    如何实现一个窗口的风格(style),让所有的窗口都继承这样同样的风格,包括标题栏,放大.缩小和关闭按钮. 那么,我们可不可以就建立一个Base窗口,然后将这个窗口的风格给设计好之后,所有的窗口都继承 ...

  4. shell问题集合

    1.syntax error near unexpected token `then' if后要有空格,[] 中括号的开头和结尾要有空格! [ $1-eq"root" ]中括号中的 ...

  5. hdu2083 简易版之最短距离

    点A和点B之间随意一点到A的距离+到B的距离=|AB|,而AB外的一点到A的距离+到B的距离>|AB|: #include<math.h> #include<stdio.h&g ...

  6. WPF Windows背景透明其中的文字保持不透明

    原文:WPF Windows背景透明其中的文字保持不透明 版权声明:本文为博主原创,未经允许不得转载.交流.源码资料加群:161154103 https://blog.csdn.net/mpegfou ...

  7. Qt Installer Framework 3.0.1 Released(功能比较强)

    We are happy to announce the release of Qt IFW 3.0.1. 3.0.1 is fully compatible with 2.0.5, which me ...

  8. 大班模型行为PK(总结)

    行为类模式包括责任链模式.命令模式.解释器模式.迭代模式.中介模式.备忘录模式.观察者模式.State模式.策略模式.模板方法.Visitor模式,我去,许多.. .主要有以下挑几个easy混乱和控制 ...

  9. Xamarin 设置可接受的版本

    一共分三个版本,编译版本.最小版本.目标版本(最适应) 一般编译使用最新的版本,目标版本选择最主流的 参考资料 https://docs.microsoft.com/en-us/xamarin/and ...

  10. Introduction To The Smart Client Software Factory (CAB/SCSF Part 18)

    1. Shell This is the start-up project for the solution. It is very similar to the start-up projects ...