这篇的目的只有一个,那就是找出录音文件中的信息,来电及时间等这些信息到底藏哪里了。
首先我想到的可能是直接用文件名的形式,但是很遗憾,文件名就是数字序号,并没有其他信息,然后我想到的就是利用音频文件的表演者,专辑等信息,右键属性查看了一下也没有,最后试着用Ulrtaedit打开了一下,果然发现了玄机,原来啊直接就存在这里了,音频文件是有个类似头文件信息的,在第100h行写入了信息,如图
直接用16进制表示出来了,再对照用自带软件的信息,很开就搞懂了每个字符的意思。
下面开始着手提取信息,用二进制打开WAV文件,找到地址,但是再怎么显示成上图的样子这里我卡了一个多小时,最后终于在网上找到了关键的一句!
b = hex(int.from_bytes(a, byteorder=sys.byteorder))
就这么简单的一句我找得好辛苦!
其他的都是日常操作了,贴上代码
#-*-coding:gb2312-*-
import sys
import os
import time
import wave
import json
from pymediainfo import MediaInfo
import csv
file_dir=os.getcwd()
filelist=[]
for root, dirs, files in os.walk(file_dir):
for f in files:
if f[-4:]=='.WAV':
filelist.append(f)
print(filelist)
def get_media_info(media_name):
media_info = MediaInfo.parse(media_name)
media_data = json.loads(media_info.to_json())["tracks"]
timeslast=int(media_data[0]['duration']/1000)
return timeslast
def getdata(filename):
file = open(filename, 'rb')
numberadd = [257, 258, 259]
dayadd = [265, 266, 267]
timeadd = [268, 269, 270]
typeadd = 271
number = []
day = []
time = []
for i in numberadd:
file.seek(i)
a = file.read(1)
b = hex(int.from_bytes(a, byteorder=sys.byteorder))
c = b[2:4]
number.append(c)
phonenumber = ''.join(number)
for i in dayadd:
file.seek(i)
a = file.read(1)
b = hex(int.from_bytes(a, byteorder=sys.byteorder))
c = b[2:4]
day.append(c)
days = '-'.join(day)
for i in timeadd:
file.seek(i)
a = file.read(1)
b = hex(int.from_bytes(a, byteorder=sys.byteorder))
c = b[2:4]
time.append(c)
times = ':'.join(time)
file.seek(typeadd)
a = file.read(1)
b = hex(int.from_bytes(a, byteorder=sys.byteorder))
c = b[2:4]
if c == '5':
types = 'B'
elif c == '2':
types = 'Z'
else:
types=0
timelast=get_media_info(filename)
file.close()
datalist=[filename,phonenumber, days, times, types,timelast]
print(datalist)
return datalist
f = open('data.csv','a+',newline='')
cw = csv.writer(f)
cw.writerow(['文件名','电话号码','日期','时间','类型','时长'])
for f in filelist:
try:
cw.writerow(getdata(f))
except:
pass
终于搞定了,最后就剩下数据分析画图了,正好复习一下PANDAS的相关知识,等我攒够一个月数据了就继续!