2017-01-11 13 views
1

웹 서버 Apache와 Nginx는 방문자에게 mod_unique_id/userid 모듈을 사용하여 uniqid 쿠키를 제공 할 수 있습니다. 이러한 cookie looks like은 base64 문자열로 인코딩 된 4 개의 uint32 값입니다. 두 번째 바이트는 쿠키가 발행 된 타임 스탬프입니다.apache/niginx 사용자 ID 쿠키의 날짜 추출

날짜와 시간을 추출하고 싶습니다.

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() 

이 줄은 특히 "인공"입니다. 모든 코드를 더 "파이썬적이고"더 빠르게 만드는 방법은 무엇입니까?

datetime.fromtimestamp(unpack('IIII', b64decode(raw_cookie))[1]) 

답변

1

"인공"및 "pythonic"으로 정확히 무엇을 의미하는지 모르지만 적어도 내 컴퓨터에서는 해당 코드가 올바르지 않습니다. 그리고 그것은 당신이 알아 채지 못할 수도있는 가짜 데이터를주는 방식으로 부정확합니다.

unpack'IIII' 형식 코드는 바이트 순서를 지정하지 않으므로 내 (x86) 컴퓨터에서 잘못된 시간 소인이됩니다. documentation은 바이트 순서를 생략하면 컴퓨터의 바이트 순서가 기본값이됩니다. 그러나 mod_uid 버전 2에서 쿠키는 네트워크 바이트 순서를 사용합니다. 형식 코드 !IIII'으로 네트워크 바이트 순서를 지정하십시오.

에 의한 경우 "파이썬"여기, 대신 하나에 그것을 포장의 몇 줄에 걸쳐 그것을 확산 말은 즉 볼 수있는 방법입니다 :

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