从apache/niginx用户标识cookie提取日期
问题描述:
两个web服务器Apache和Nginx都可以为访问者提供uniqid cookie和mod_unique_id/userid模块。这样一个cookie looks like四个uint32值编码为base64字符串。第二个字节是cookie发布时的时间戳。从apache/niginx用户标识cookie提取日期
我想提取它的日期和时间。
from base64 import b64decode
from datetime import datetime
import shlex, gzip, glob
from struct import unpack
import pandas as pd
import numpy as np
def get_data() -> pd.DataFrame:
filenames = glob.glob('data/user_cookie/stat-*.gz')
for filename in filenames:
print(filename)
f = gzip.open(filename, 'rt')
for row in f.readlines():
parts = shlex.split(row)
useragent, raw_cookie = parts[9], parts[16]
if raw_cookie == '-':
raw_visit_date = parts[3][1:]
# this is a first visit
visit_date = datetime.strptime(raw_visit_date,
'%d/%b/%Y:%H:%M:%S')
else:
visit_date = datetime.fromtimestamp(unpack('IIII',
b64decode(raw_cookie))[1])
print(useragent, visit_date)
if __name__ == '__main__':
get_data()
这条线在我看来特别“人造”。如何使所有的代码更“pythonic”和更快?
datetime.fromtimestamp(unpack('IIII', b64decode(raw_cookie))[1])
答
我不明白你的意思是什么“人造”和“pythonic”,但至少在我的机器上,该代码是不正确的。这种方式不正确,会给你一些可能没有注意到的虚假数据。
'IIII'
格式代码unpack
没有指定字节顺序,在我的(x86)计算机上这会导致错误的时间戳。 documentation表示省略字节顺序会导致它默认为您机器的字节顺序。但在mod_uid版本2中,cookie使用网络字节顺序。使用格式代码!IIII'
指定网络字节顺序。
如果“Python的”你的意思是跨越了几行,而不是打包成一个传播它,这里怎么会看:
binary_cookie = b64decode(raw_cookie)
fields = unpack('!IIII', binary_cookie)
visit_date = datetime.fromtimestamp(fields[1])