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