从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])