Python 从apache/niginx用户ID cookie中提取日期

Python 从apache/niginx用户ID cookie中提取日期,python,parsing,datetime,cookies,userid,Python,Parsing,Datetime,Cookies,Userid,Web服务器Apache和Nginx都可以为访问者提供带有mod_unique_id/userid模块的uniqid cookie。这样的四个uint32值被编码为base64字符串。第二个字节是发出cookie时的时间戳 我想提取它的日期和时间 from base64 import b64decode from datetime import datetime import shlex, gzip, glob from struct import unpack import pandas a

Web服务器Apache和Nginx都可以为访问者提供带有mod_unique_id/userid模块的uniqid cookie。这样的四个uint32值被编码为base64字符串。第二个字节是发出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])

我不知道你所说的“人工”和“蟒蛇”到底是什么意思,但至少在我的机器上,这些代码是不正确的。在某种程度上,它是不正确的,它会给你提供虚假的数据,而这些数据可能不会被注意到

unpack
'iii'
格式代码未指定字节顺序,这在我的(x86)计算机上会导致时间戳不正确。表示省略字节顺序将导致它默认为机器的字节顺序。但是在mod_uid版本2中,cookie使用网络字节顺序。使用格式代码
指定网络字节顺序!IIII’

如果你所说的“pythonic”是指将其分散成几行,而不是将其打包成一行,那么下面是它的外观:

binary_cookie = b64decode(raw_cookie)
fields = unpack('!IIII', binary_cookie)
visit_date = datetime.fromtimestamp(fields[1])