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

时间:2017-01-11 10:52:43

标签: python parsing datetime cookies userid

两个Web服务器Apache和Nginx都可以通过mod_unique_id / userid模块为访问者提供uniqid cookie。这样的cookie looks like四个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])

1 个答案:

答案 0 :(得分:1)

我不知道你的意思是“人工”和“pythonic”,但至少在我的机器上,代码是不正确的。并且这种方式不正确会给您带来可能没有被注意到的伪造数据。

'IIII'的{​​{1}}格式代码未指定字节顺序,这在我的(x86)计算机上导致错误的时间戳。 documentation表示省略字节顺序将导致它默认为机器的字节顺序。但是在mod_uid版本2中,cookie使用网络字节顺序。使用格式代码unpack指定网络字节顺序。

如果用“pythonic”表示将它分散在几行而不是将其打包成一行,这就是它的外观:

!IIII'