使用 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库就可以完成这项工作, 首先你需要安装这个库:

pip install pillow

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

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

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

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

注意看数据,

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. 停止学习Wireshark

    下载和安装好Wireshark之后,启动Wireshark而且在接口列表中选择接口名,然后開始在此接口上抓包.比如.假设想要在无线网络上抓取流量,点击无线接口.点击Capture Options能够配 ...

  2. Windows下如何采用微软的Caffe配置Faster R-CNN

    前言 比较简单的一篇博客.https://github.com/microsoft/caffe 微软的Caffe以在Windows下编译简单而受到了很多人的喜爱(包括我),只用改改prop配置然后无脑 ...

  3. 斯托克斯定理(Stokes' theorem)

    1. 几种形式 ∮∂SPdx+Qdy+Rdz=∬S∣∣∣∣∣∣cosα∂∂xPcosβ∂∂yQcosγ∂∂zR∣∣∣∣∣∣dS ∮∂Ωw=∬Ωdw 左边是内积: 右边是外积: 物理上的应用: ∮∂SE ...

  4. 学习 NLP(一)—— TF-IDF

    TF-IDF(Term Frequency & Inverse Document Frequency),是一种用于信息检索与数据挖掘的常用加权技术.它的主要思想是:如果某个词或短语在一篇文章中 ...

  5. WPF UserControl 的绑定事件、属性、附加属性

    原文:WPF UserControl 的绑定事件.属性.附加属性 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Vblegend_2013/arti ...

  6. 去除WPF中3D图形的锯齿

    原文:去除WPF中3D图形的锯齿 理论上讲PC在计算3D图形的时候是无法避免不出现锯齿的,因为3D图形都是又若干个三角形组成,如果3D图形想平滑就必须建立多个三角形,你可以想象一下正5边形和正100边 ...

  7. HDU-4249-A Famous Equation(DP)

    Problem Description Mr. B writes an addition equation such as 123+321=444 on the blackboard after cl ...

  8. VC++ 编译libcurl 支持SSL,GZIP(有脚本)

    由于网上下载的 libcurl 不支持 gzip,只好自己动手编译,期间走了很多弯路,下面是最终成功的记录. 我所使用的环境 Visual Studio 2010 . Windows 7 64 bit ...

  9. C#调用WebKit内核

    原文:C#调用WebKit内核 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013564470/article/details/80255954 ...

  10. JS 数组两种定义方式

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...