使用 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. VS2010设置VC6的字体样式及背景色、选中字高亮

    习惯了VC6.0的fixedsys字体,用VS2010还真不习惯.把VS2010打造成经典的.熟悉的模样,也并非难事.网上有相应的文章,我再记录下来,主要是为了自己查找方便(刚刚重装了系统,一切从头再 ...

  2. Qt5.9 官方发布的新版本亮点的确不胜枚举(而且修复2000+ bugs)

    作者:Summer Fang链接:https://www.zhihu.com/question/60486611/answer/177584284来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...

  3. 文件上传(bootstrap fileinput)

    在做Excel文件上传和下载时,原生文件输入框太不美观,从网上找的bootstrap fileinput还是挺漂亮的, 需要引用的文件 //4.fileUpload bundles.Add(new S ...

  4. mac 安装使用Liteide

    1.下载go 官网下载地址(需要FQ)golang 中国镜像网站下载golangtc 下载go1.5.1.darwin-amd64.tar.gz包,解压得到一个Go目录,把go目录移动到你想要的路径下 ...

  5. C和指针 (pointers on C)——第十二章:利用结构和指针

    第十二章 利用结构和指针 这章就是链表.先单链表,后双向链表. 总结: 单链表是一种使用指针来存储值的数据结构.链表中的每一个节点包括一个字段,用于指向链表的下一个节点. 有一个独立的根指针指向链表的 ...

  6. Qt5.8 下链接 Mysql 错误以及解决方法(无论 Mysql 是什么版本的,64 位 Qt 要用 64 位的 Mysql 驱动,32 位的 Qt 要用 32 位的Mysql 驱动)

    Qt 5.8 下链接 Mysql(Windows 平台下),有朋友会出现一个这个无法连接的错误 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: ...

  7. jquery权限选择

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  8. Html5 学习系列(四)文件操作API

    原文:Html5 学习系列(四)文件操作API 引言 在之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台.或者跨 ...

  9. wcf中的消息模式

    1请求响应模式 a.wcf中的消息模式默认是请求响应模式 b.返回值是void默认也是请求响应模式,可返回服务端的错误信息 c.客户端在请求后,当前线程停止真到接受收服务器的响应 [Opereatio ...

  10. .NET中的GC总结

    来自<CLR via C# 3rd Edition>总结 只管理内存,非托管资源,如文件句柄,GDI资源,数据库连接等还需要用户去管理 循环引用,网状结构等的实现会变得简单.GC的标志也压 ...