API เชฆเซเชตเชพเชฐเชพ เช•เช‚เชชเชจเชตเชฟเชธเซเชคเชพเชฐ เชกเซ‡เชŸเชพ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชค เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชชเชฐเชฟเชšเชฏ

เช•เช‚เชชเชจเชตเชฟเชธเซเชคเชพเชฐ เชคเซ‡เชจเชพ เชธเชฐเชณ เช‡เชตเซ‡เชจเซเชŸ เชธเซ‡เชŸเช…เชช เช…เชจเซ‡ เชตเชฟเชเซเชฏเซเชฒเชพเช‡เชเซ‡เชถเชจ เชฒเชตเชšเซ€เช•เชคเชพเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช‰เชคเซเชชเชพเชฆเชจ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชธเชพเชงเชจ เชคเชฐเซ€เช•เซ‡ เช–เซ‚เชฌ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชธเชพเชฌเชฟเชค เชฅเชฏเซเช‚ เช›เซ‡. เช…เชจเซ‡ เช˜เชฃเซ€เชตเชพเชฐ เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชเชŸเซเชฐเชฟเชฌเซเชฏเซเชถเชจ เชฎเซ‹เชกเชฒ, เช•เซเชฒเชธเซเชŸเชฐ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เช…เชฅเชตเชพ เช…เชจเซเชฏ BI เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เช›เซ‡. เช•เช‚เชชเชจเชตเชฟเชธเซเชคเชพเชฐเชฎเชพเช‚เชฅเซ€ เช•เชพเชšเชพ เช‡เชตเซ‡เชจเซเชŸ เชกเซ‡เชŸเชพ เชธเชพเชฅเซ‡ เชœ เช†เชตเซ€ เช›เซ‡เชคเชฐเชชเชฟเช‚เชกเซ€ เช•เชฐเชตเซ€ เชถเช•เซเชฏ เช›เซ‡. เช† เชฒเซ‡เช– เชคเชฎเชจเซ‡ เชœเชฃเชพเชตเชถเซ‡ เช•เซ‡ เชจเซเชฏเซ‚เชจเชคเชฎ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชœเซเชžเชพเชจ เชธเชพเชฅเซ‡ เช† เชกเซ‡เชŸเชพ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฎเซ‡เชณเชตเชตเซ‹.

เชชเซ‚เชฐเซเชตเชœเชฐเซ‚เชฐเซ€เชฏเชพเชคเซ‹

  1. เช•เช‚เชชเชจเชตเชฟเชธเซเชคเชพเชฐเชฎเชพเช‚ เชเช• เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชœเซ‡เชฎเชพเช‚ เช‡เชตเซ‡เชจเซเชŸเซเชธ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเซ‡เชฒ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเชฐ เช†เช‚เช•เชกเชพ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡
  2. เชชเชพเชฏเชฅเซ‹เชจ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒเซเช‚ เช›เซ‡ (เชนเซเช‚ เชตเชฐเซเชเชจ 3.8.3 เชฎเชพเช‚ เช•เชพเชฎ เช•เชฐเซเช‚ เช›เซเช‚), เชœเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชธเช‚เชญเชตเชฟเชค เชฐเซ€เชกเชฐ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช“เช›เชพเชฎเชพเช‚ เช“เช›เชพ เชฎเซ‚เชณเชญเซ‚เชค เชธเซเชคเชฐเซ‡ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡

เชธเซ‚เชšเชจเชพเช“

เชชเช—เชฒเซเช‚ 1. API-เช•เซ€ เช…เชจเซ‡ เช—เซเชชเซเชค-เช•เซ€ เชฎเซ‡เชณเชตเชตเซ€

เชกเซ‡เชŸเชพ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชชเชนเซ‡เชฒเชพ API เช•เซ€ เช…เชจเซ‡ เช—เซเชชเซเชค เช•เซ€ เชฎเซ‡เชณเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชคเชฎเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชฎเชพเชฐเซเช—เชจเซ‡ เช…เชจเซเชธเชฐเซ€เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชถเซ‹เชงเซ€ เชถเช•เซ‹ เช›เซ‹:

  1. "เชกเซ‡เชŸเชพ เชฎเซ‡เชจเซ‡เชœ เช•เชฐเซ‹" (เชธเซเช•เซเชฐเซ€เชจเชจเซ€ เชจเซ€เชšเซ‡ เชกเชพเชฌเซ€ เชฌเชพเชœเซเช เชธเซเชฅเชฟเชค)
  2. เช‡เชšเซเช›เชฟเชค เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชชเชธเช‚เชฆ เช•เชฐเซ‹ เช•เซ‡ เชœเซ‡เชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเชฐ เชœเชพเช“
  3. เช–เซเชฒเชคเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฎเซ‡เชจเซ‚เชฎเชพเช‚, "เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ" เชชเชธเช‚เชฆ เช•เชฐเซ‹.
  4. เช…เชฎเซ‡ API-เช•เซ€ เช…เชจเซ‡ เชธเชฟเช•เซเชฐเซ‡เชŸ-เช•เซ€ เชถเชฌเซเชฆเชฎเชพเชณเชพเช“ เชถเซ‹เชงเซ€เช เช›เซ€เช, เชคเซ‡เชฎเชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชœเช—เซเชฏเชพเช เช•เซ‰เชชเชฟ เช•เชฐเซ€เชจเซ‡ เชธเชพเชšเชตเซ€เช เช›เซ€เช.

เช•เซเชฒเชฟเช• เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ, เชคเชฎเซ‡ เชฒเชฟเช‚เช•เชจเซ‡ เช…เชจเซเชธเชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชœเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช†เชจเชพ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:
analytics.amplitude.com/$$$$$$$/manage/project/******/settings,
เชœเซเชฏเชพเช‚ $$$$$$ เช เชคเชฎเชพเชฐเซ€ เชธเช‚เชธเซเชฅเชพเชจเซเช‚ เช•เช‚เชชเชจเชตเชฟเชธเซเชคเชพเชฐ เชฒเซ‰เช—เชฟเชจ เช›เซ‡, ****** เช เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชจเช‚เชฌเชฐ เช›เซ‡

เชชเช—เชฒเซเช‚ 2: เชœเชฐเซ‚เชฐเซ€ เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹เชจเซ€ เชนเชพเชœเชฐเซ€ เชคเชชเชพเชธเชตเซ€

เชธเชพเชฐเชพ เชธเชฎเชพเชšเชพเชฐ เช เช›เซ‡ เช•เซ‡ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฒเช—เชญเช— เชšเซ‹เช•เซเช•เชธเชชเชฃเซ‡ เช† เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เช“ เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒเซ€ เช›เซ‡ เช…เชฅเชตเชพ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‡เชฒเซ€ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเชฎเชพเชฐเซ‡ เชคเชชเชพเชธ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชฒเช–เชคเซ€ เชตเช–เชคเซ‡ เชฎเซ‡เช‚ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ€เชงเซ‡เชฒเซ€ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เช“เชจเซ€ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเซ‚เชšเชฟ (เชœเซเชฏเชพเช‚ เชฏเซ‹เช—เซเชฏ เชนเซ‹เชฏ เชคเซเชฏเชพเช‚ เช•เซŒเช‚เชธเชฎเชพเช‚ เชตเชฐเซเชเชจ เชธเซ‚เชšเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡):

  1. เชตเชฟเชจเช‚เชคเซ€เช“ (2.10.0) - เชกเซ‡เชŸเชพ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ api เชฆเซเชตเชพเชฐเชพ เชตเชฟเชจเช‚เชคเซ€ เชฎเซ‹เช•เชฒเชตเซ€
  2. pandas (1.0.1) - json เชตเชพเช‚เชšเชตเซเช‚, เชกเซ‡เชŸเชพเชซเซเชฐเซ‡เชฎ เชฌเชจเชพเชตเชตเซ€ เช…เชจเซ‡ เชชเช›เซ€ เชซเชพเช‡เชฒเชฎเชพเช‚ เชฒเช–เชตเซเช‚
  3. zipfile - API เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซ‡เชฒ เช†เชฐเซเช•เชพเช‡เชตเชฎเชพเช‚เชฅเซ€ เชซเชพเช‡เชฒเซ‹เชจเซ‡ เชฌเชนเชพเชฐ เช•เชพเชขเซ‹
  4. gzip - .gz เชฎเชพเช‚เชฅเซ€ json เชซเชพเช‡เชฒเซ‹เชจเซ‡ เช…เชจเชชเซ‡เช• เช•เชฐเซ€ เชฐเชนเซ€ เช›เซ‡
  5. os - เช…เชจเชชเซ‡เช•เซเชก เช†เชฐเซเช•เชพเช‡เชตเชฎเชพเช‚เชฅเซ€ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชฎเซ‡เชณเชตเชตเซ€
  6. เชธเชฎเชฏ - เชตเซˆเช•เชฒเซเชชเชฟเช•, เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เชšเชพเชฒเชคเซ‹ เชธเชฎเชฏ เชฎเชพเชชเซ‹
  7. tqdm - เชตเซˆเช•เชฒเซเชชเชฟเช•, เชซเชพเช‡เชฒ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ€ เชชเซเชฐเช—เชคเชฟเชจเชพ เชธเชฐเชณ เชจเชฟเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡

เชชเช—เชฒเซเช‚ 3. เชกเซ‡เชŸเชพ เชฒเซ‹เชกเชฟเช‚เช— เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฒเช–เชตเซ€

เชธเช‚เช•เซ‡เชค: เชธเช‚เชชเซ‚เชฐเซเชฃ เชกเชพเช‰เชจเชฒเซ‹เชก เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฒเซ‡เช–เชจเชพ เช…เช‚เชคเซ‡ เช›เซ‡; เชœเซ‹ เชคเชฎเซ‡ เชˆเชšเซเช›เซ‹, เชคเซ‹ เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เชคเชฐเชค เชœ เชฒเชˆ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เชœเซ‹ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ เชคเซ‹ เชชเช—เชฒเซเช‚-เชฆเชฐ-เชชเช—เชฒเชพเช‚ เชธเซเชชเชทเซเชŸเซ€เช•เชฐเชฃเซ‹เชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เชฒเซ‹.

เชชเช—เชฒเซเช‚ 3.1. เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹ เช†เชฏเชพเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เช…เชฎเซ‡ เชฌเซ€เชœเชพ เชชเช—เชฒเชพเชฎเชพเช‚ เชธเซ‚เชšเชฟเชฌเชฆเซเชง เชฌเชงเซ€ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เช“ เช†เชฏเชพเชค เช•เชฐเซ€เช เช›เซ€เช.

# ะ˜ะผะฟะพั€ั‚ ะฑะธะฑะปะธะพั‚ะตะบ
import requests
import pandas as pd
import zipfile
import gzip
import os
import time
import tqdm
from tqdm import tqdm

เชชเช—เชฒเซเช‚ 3.2. เช•เช‚เชชเชจเชตเชฟเชธเซเชคเชพเชฐ เชฎเชพเชŸเซ‡ เชตเชฟเชจเช‚เชคเซ€ เชธเชฌเชฎเชฟเชŸ เช•เชฐเชตเซ€

เชšเชพเชฒเซ‹ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจเชจเซ€ เชถเชฐเซ‚เช†เชค เชถเซ‹เชงเซ€เช เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชตเซ‡เชฐเซ€เชเชฌเชฒ a เชชเชฐ เชฒเช–เซ€เช.

เชกเซ‡เชŸเชพ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เชธเชฎเชฏเช—เชพเชณเชพ เชฎเชพเชŸเซ‡ startdate เช…เชจเซ‡ enddate เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡ เช…เชจเซ‡ เชเชฎเซเชชเซเชฒเชฟเชŸเซเชฏเซเชก เชธเชฐเซเชตเชฐเชจเซ‡ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เชตเชฟเชจเช‚เชคเซ€เชจเชพ เชŸเซ‡เช•เซเชธเซเชŸเชฎเชพเช‚ เชฌเชฟเชฒเซเชŸ เช›เซ‡; เชคเชพเชฐเซ€เช– เช‰เชชเชฐเชพเช‚เชค, เชคเชฎเซ‡ เชตเชฟเชจเช‚เชคเซ€เชฎเชพเช‚ 'T' เชชเช›เซ€ เชฎเซ‚เชฒเซเชฏ เชฌเชฆเชฒเซ€เชจเซ‡ เช•เชฒเชพเช•เชจเซ‹ เชชเชฃ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

api_key เช…เชจเซ‡ secret_key เชชเซเชฐเชฅเชฎ เชชเช—เชฒเชพเชฎเชพเช‚ เชฎเซ‡เชณเชตเซ‡เชฒเชพ เชฎเซ‚เชฒเซเชฏเซ‹เชจเซ‡ เช…เชจเซเชฐเซ‚เชช เช›เซ‡; เชธเซเชฐเช•เซเชทเชพ เช•เชพเชฐเชฃเซ‹เชธเชฐ, เชนเซเช‚ เช…เชนเซ€เช‚ เชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชฌเชฆเชฒเซ‡ เชฐเซ‡เชจเซเชกเชฎ เชธเชฟเช•เซเชตเชจเซเชธเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซเช‚ เช›เซเช‚.

a = time.time()
# ะŸะฐั€ะฐะผะตั‚ั€ั‹ ะฝะฐั‡ะฐะปัŒะฝะพะน ะธ ะบะพะฝะตั‡ะฝะพะน ะดะฐั‚ั‹
startdate = '20200627'
enddate = '20200628'

api_key = 'kldfg844203rkwekfjs9234'
secret_key = '094tfjdsfmw93mxwfek'
# ะžั‚ะฟั€ะฐะฒะปะตะฝะธะต ะทะฐะฟั€ะพัะฐ ะฒ Amplitude
response = requests.get('https://amplitude.com/api/2/export?start='+startdate+'T0&end='+enddate+'T0', auth = (api_key, secret_key))
print('1. ะ—ะฐะฟั€ะพั ะพั‚ะฟั€ะฐะฒะปะตะฝ')

เชชเช—เชฒเซเช‚ 3.3. เชกเซ‡เชŸเชพ เชธเชพเชฅเซ‡ เช†เชฐเซเช•เชพเช‡เชต เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เช…เชฎเซ‡ เช†เชฐเซเช•เชพเช‡เชต เชฎเชพเชŸเซ‡ เชจเชพเชฎ เชธเชพเชฅเซ‡ เช†เชตเซ€เช เช›เซ€เช เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชซเชพเช‡เชฒเชจเชพเชฎ เชตเซ‡เชฐเซ€เชเชฌเชฒเชฎเชพเช‚ เชฒเช–เซ€เช เช›เซ€เช. เชฎเชพเชฐเซ€ เชธเช—เชตเชก เชฎเชพเชŸเซ‡, เชนเซเช‚ เชชเซ€เชฐเชฟเชฏเชก + เชธเซ‚เชšเชตเซ‡ เช›เซ‡ เช•เซ‡ เช† เช•เช‚เชชเชจเชตเชฟเชธเซเชคเชพเชฐ เชกเซ‡เชŸเชพ เช›เซ‡. เช†เช—เชณ, เช…เชฎเซ‡ เช•เช‚เชชเชจเชตเชฟเชธเซเชคเชพเชฐเชฎเชพเช‚เชฅเซ€ เชชเซเชฐเชพเชชเซเชค เชชเซเชฐเชคเชฟเชธเชพเชฆเชจเซ‡ เช†เชฐเซเช•เชพเช‡เชตเชฎเชพเช‚ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเซ€เช เช›เซ€เช.

# ะกะบะฐั‡ะธะฒะฐะฝะธะต ะฐั€ั…ะธะฒะฐ ั ะดะฐะฝะฝั‹ะผะธ
filename = 'period_since'+startdate+'to'+enddate+'_amplitude_data'
with open(filename + '.zip', "wb") as code:
    code.write(response.content)
print('2. ะั€ั…ะธะฒ ั ั„ะฐะนะปะฐะผะธ ัƒัะฟะตัˆะฝะพ ัะบะฐั‡ะฐะฝ')  

เชชเช—เชฒเซเช‚ 3.4. เชคเชฎเชพเชฐเชพ เช•เชฎเซเชชเซเชฏเซเชŸเชฐ เชชเชฐเชจเชพ เชซเซ‹เชฒเซเชกเชฐเชฎเชพเช‚เชฅเซ€ เชซเชพเช‡เชฒเซ‹ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ€เช

เชซเชพเช‡เชฒเซ‹ เช•เชพเชขเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเชฟเชชเชซเชพเช‡เชฒ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เช…เชฎเชฒเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซเชฐเซ€เชœเซ€ เชชเช‚เช•เซเชคเชฟเชฎเชพเช‚, เชธเชพเชตเชšเซ‡เชค เชฐเชนเซ‹ เช…เชจเซ‡ เชคเชฎเชพเชฐเซ‹ เชฐเชธเซเชคเซ‹ เชฒเช–เซ‹ เช•เซ‡ เชœเซเชฏเชพเช‚ เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชฌเชนเชพเชฐ เช•เชพเชขเชตเชพเชจเซเช‚ เชตเชงเซ เช…เชจเซเช•เซ‚เชณ เชนเซ‹เชฏ.

# ะ˜ะทะฒะปะตั‡ะตะฝะธะต ั„ะฐะนะปะพะฒ ะฒ ะฟะฐะฟะบัƒ ะฝะฐ ะบะพะผะฟัŒัŽั‚ะตั€ะต
z = zipfile.ZipFile(filename + '.zip', 'r')
z.extractall(path = 'C:\Users\...\'+filename)
print('3. ะั€ั…ะธะฒ ั ั„ะฐะนะปะฐะผะธ ะธะทะฒะปะตั‡ะตะฝ ะธ ะทะฐะฟะธัะฐะฝ ะฒ ะฟะฐะฟะบัƒ ' + filename)

เชชเช—เชฒเซเช‚ 3.5. json เชฐเซ‚เชชเชพเช‚เชคเชฐเชฃ

เช†เชฐเซเช•เชพเช‡เชตเชฎเชพเช‚เชฅเซ€ เชซเชพเช‡เชฒเซ‹ เชเช•เซเชธเซเชŸเซเชฐเซ‡เช•เซเชŸ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชคเชฎเชพเชฐเซ‡ json เชซเชพเช‡เชฒเซ‹เชจเซ‡ .gz เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เช•เชจเซเชตเชฐเซเชŸ เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เช†เช—เชณเชจเชพ เช•เชพเชฎ เชฎเชพเชŸเซ‡ เชกเซ‡เชŸเชพเชซเซเชฐเซ‡เชฎเชฎเชพเช‚ เชฒเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชฎเชนเซ‡เชฐเชฌเชพเชจเซ€ เช•เชฐเซ€เชจเซ‡ เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ เช…เชนเซ€เช‚ เชคเชฎเชพเชฐเซ‡ เชชเชพเชฅเชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชชเชฐ เชฌเชฆเชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช…เชจเซ‡ 000000 เชจเซ‡ เชฌเชฆเชฒเซ‡ Amplitude เชฅเซ€ เชคเชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชจเช‚เชฌเชฐ เชฒเช–เซ‹ (เช…เชฅเชตเชพ เชฎเซ‡เชจเซเชฏเซเช…เชฒเซ€ เชชเชพเชฅ เช–เซ‹เชฒเซ‹ เชœเซเชฏเชพเช‚ เช†เชฐเซเช•เชพเช‡เชต เช•เชพเชขเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹ เช…เชจเซ‡ เช…เช‚เชฆเชฐเชจเชพ เชซเซ‹เชฒเซเชกเชฐเชจเซเช‚ เชจเชพเชฎ เชœเซเช“).

เช•เซเชฐเชฎเชฎเชพเช‚:

เชตเซ‡เชฐเซ€เชเชฌเชฒ เชชเชฐ เชกเชพเชฏเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฒเช–เชตเซ€, เชกเชพเชฏเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚เชฅเซ€ เชซเชพเชˆเชฒเซ‹เชจเซ€ เชฏเชพเชฆเซ€ เชฎเซ‡เชณเชตเชตเซ€, tqdm เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช–เชพเชฒเซ€ เชกเซ‡เชŸเชพเชซเซเชฐเซ‡เชฎ, time.sleep(1) เชฌเชจเชพเชตเชตเซ€, เชฒเซ‚เชชเชจเซ€ เช…เช‚เชฆเชฐ เช†เชชเชฃเซ‡ .gz เชซเชพเชˆเชฒเซ‹ เช–เซ‹เชฒเซ€เช เช›เซ€เช เช…เชจเซ‡ เชคเชฐเชค เชœ json เชตเชพเช‚เชšเชตเชพ เช…เชจเซ‡ เชญเชฐเชตเชพ เชฎเชพเชŸเซ‡ pandas เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช. เช†เชชเซ‡เชฒ เชกเซ‡เชŸเชพเชซเซเชฐเซ‡เชฎ.

# ะŸั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธะต json ะบ ะพะฑั‹ั‡ะฝะพะผัƒ ั‚ะฐะฑะปะธั‡ะฝะพะผัƒ ั„ะพั€ะผะฐั‚ัƒ
directory = 'C:\Users\...\'+filename+'
# ะŸั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธะต json ะบ ะพะฑั‹ั‡ะฝะพะผัƒ ั‚ะฐะฑะปะธั‡ะฝะพะผัƒ ั„ะพั€ะผะฐั‚ัƒ
directory = 'C:\Users\...\'+filename+'\000000'
files = os.listdir(directory)
amplitude_dataframe = pd.DataFrame()
print('ะŸั€ะพะณั€ะตัั ะพะฑั€ะฐะฑะพั‚ะบะธ ั„ะฐะนะปะพะฒ:')
time.sleep(1)
for i in tqdm(files):
with gzip.open(directory + '\' + i) as f:
add = pd.read_json(f, lines = 'True')
amplitude_dataframe = pd.concat([amplitude_dataframe, add])
time.sleep(1)    
print('4. JSON ั„ะฐะนะปั‹ ะธะท ะฐั€ั…ะธะฒะฐ ัƒัะฟะตัˆะฝะพ ะฟั€ะตะพะฑั€ะฐะทะพะฒะฐะฝั‹ ะธ ะทะฐะฟะธัะฐะฝั‹ ะฒ dataframe')
0000' files = os.listdir(directory) amplitude_dataframe = pd.DataFrame() print('ะŸั€ะพะณั€ะตัั ะพะฑั€ะฐะฑะพั‚ะบะธ ั„ะฐะนะปะพะฒ:') time.sleep(1) for i in tqdm(files): with gzip.open(directory + '\' + i) as f: add = pd.read_json(f, lines = 'True') amplitude_dataframe = pd.concat([amplitude_dataframe, add]) time.sleep(1) print('4. JSON ั„ะฐะนะปั‹ ะธะท ะฐั€ั…ะธะฒะฐ ัƒัะฟะตัˆะฝะพ ะฟั€ะตะพะฑั€ะฐะทะพะฒะฐะฝั‹ ะธ ะทะฐะฟะธัะฐะฝั‹ ะฒ dataframe')

เชชเช—เชฒเซเช‚ 3.6. เชเช•เซเชธเซ‡เชฒเชฎเชพเช‚ เชกเซ‡เชŸเชพเชซเซเชฐเซ‡เชฎ เชฒเช–เชตเซเช‚

เชเช•เซเชธเซ‡เชฒ เชชเชฐ เช…เชชเชฒเซ‹เชก เช…เชนเซ€เช‚ เชฎเชพเชคเซเชฐ เชเช• เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡. เช˜เชฃเชพ เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚, เชชเชพเชฏเชฅเซ‹เชจเชจเซ€ เช…เช‚เชฆเชฐ เชชเชฐเชฟเชฃเชพเชฎเซ€ เชกเซ‡เชŸเชพ เชซเซเชฐเซ‡เชฎ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เช…เชฅเชตเชพ เชกเซ‡เชŸเชพเชจเซ‡ เชธเซเชŸเซ‹เชฐเซ‡เชœเชฎเชพเช‚ เชฎเซ‚เช•เชตเซ‹ เชตเชงเซ เช…เชจเซเช•เซ‚เชณ เช›เซ‡.

เชคเชฎเชพเชฐเซ‡ เช…เชนเซ€เช‚ เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชกเซ‡เชŸเชพ เช…เชชเชฒเซ‹เชก เชชเชพเชฅเชจเซ‡ เชชเชฃ เชฌเชฆเชฒเชตเซ‹ เชชเชกเชถเซ‡.

# ะ—ะฐะฟะธัะฐั‚ัŒ ะฟะพะปัƒั‡ะตะฝะฝะพะน ั‚ะฐะฑะปะธั†ั‹ ะฒ Excel-ั„ะฐะนะป
amplitude_dataframe.to_excel('C:\Users\...\'+filename+'.xlsx',index=False)
print('5. Dataframe ัƒัะฟะตัˆะฝะพ ะทะฐะฟะธัะฐะฝ ะฒ ั„ะฐะนะป ' + filename)

เชชเช—เชฒเซเช‚ 3.7. เช…เชฎเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเชพ เชšเชพเชฒเชคเชพ เชธเชฎเชฏเชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเซ€เช เช›เซ€เช

เชšเชฒ b เชฎเชพเช‚ เชตเชฐเซเชคเชฎเชพเชจ เชธเชฎเชฏเชจเซ‡ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเชตเซเช‚, เชคเชซเชพเชตเชค เช…เชจเซ‡ เชฎเชฟเชจเชฟเชŸเชจเซ€ เชธเช‚เช–เซเชฏเชพเชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเซ€เชจเซ‡, เช•เซเชฒ เชฎเชฟเชจเชฟเชŸเซ‹ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡. เช† เช›เซ‡เชฒเซเชฒเซเช‚ เชชเช—เชฒเซเช‚ เช›เซ‡.

b = time.time()
diff = b-a
minutes = diff//60
print('ะ’ั‹ะฟะพะปะฝะตะฝะธะต ะบะพะดะฐ ะทะฐะฝัะปะพ: {:.0f} ะผะธะฝัƒั‚(ั‹)'.format( minutes))

เชจเชฟเชทเซเช•เชฐเซเชท

เชคเชฎเซ‡ เช•เซ‹เชทเซเชŸเช•เชจเซ‡ เช•เซ‰เชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เชเชฎเซเชชเซเชฒเชฟเชŸเซเชฏเซเชก_เชกเซ‡เชŸเชพเชซเซเชฐเซ‡เชฎ เชตเซ‡เชฐเซ€เชเชฌเชฒเชจเซ‡ เช•เซ‰เชฒ เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชœเซ‡เชฎเชพเช‚ เชกเซ‡เชŸเชพ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹. เชคเซ‡เชฎเชพเช‚ เชฒเช—เชญเช— 50 เช•เซ‰เชฒเชฎ เชนเชถเซ‡, เชœเซ‡เชฎเชพเช‚เชฅเซ€ 80% เช•เซ‡เชธเซ‹เชฎเชพเช‚ เชคเชฎเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเชถเซ‹: เช‡เชตเซ‡เชจเซเชŸ_เชŸเชพเช‡เชช - เช‡เชตเซ‡เชจเซเชŸเชจเซเช‚ เชจเชพเชฎ, เช‡เชตเซ‡เชจเซเชŸ_เชชเซเชฐเซ‹เชชเชฐเซเชŸเซ€เช - เช‡เชตเซ‡เชจเซเชŸ เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐเซเชธ, เช‡เชตเซ‡เชจเซเชŸ_เชŸเชพเช‡เชฎ - เช‡เชตเซ‡เชจเซเชŸ เชŸเชพเช‡เชฎ, uuid - เช•เซเชฒเชพเชฏเช‚เชŸ เช†เชˆเชกเซ€, user_properties - เช•เซเชฒเชพเชฏเช‚เชŸ เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐเซเชธ, เชคเชฎเชพเชฐเซ‡ เชชเชนเซ‡เชฒเชพ เชคเซ‡เชฎเชจเซ€ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเชตเซเช‚ เชœเซ‹เชˆเช. . เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเชพเชฐเซ€ เชชเซ‹เชคเชพเชจเซ€ เช—เชฃเชคเชฐเซ€เชจเชพ เช†เช‚เช•เชกเชพเช“เชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€ เชเชฎเซเชชเซเชฒเชฟเชŸเซเชฏเซเชก เชกเซ‡เชถเชฌเซ‹เชฐเซเชกเชจเชพ เชธเซ‚เชšเช•เชพเช‚เช•เซ‹ เชธเชพเชฅเซ‡ เช•เชฐเซ‹ เช›เซ‹, เชคเซเชฏเชพเชฐเซ‡ เชคเชฎเชพเชฐเซ‡ เชญเซ‚เชฒเชตเซเช‚ เชœเซ‹เชˆเช เชจเชนเซ€เช‚ เช•เซ‡ เชธเชฟเชธเซเชŸเชฎ เช…เชจเชจเซเชฏ เช•เซเชฒเชพเชฏเช‚เชŸ/เชซเชจเชฒ เชตเช—เซ‡เชฐเซ‡เชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ€ เชชเซ‹เชคเชพเชจเซ€ เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เช† เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ, เชคเชฎเชพเชฐเซ‡ เชšเซ‹เช•เซเช•เชธเชชเชฃเซ‡ เชเชฎเซเชชเซเชฒเชฟเชŸเซเชฏเซเชก เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เชตเชพเช‚เชšเชตเซเช‚ เชœเซ‹เชˆเช.

เชคเชฎเชพเชฐเชพ เชงเซเชฏเชพเชจ เชฌเชฆเชฒ เช†เชญเชพเชฐ! เชนเชตเซ‡ เชคเชฎเซ‡ Amplitude เชชเชฐ เช•เชพเชšเซ‹ เช‡เชตเซ‡เชจเซเชŸ เชกเซ‡เชŸเชพ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เชคเชฎเชพเชฐเชพ เช•เชพเชฐเซเชฏเชฎเชพเช‚ เชคเซ‡เชจเซ‹ เชธเช‚เชชเซ‚เชฐเซเชฃ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เช†เช–เซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸ:

# ะ˜ะผะฟะพั€ั‚ ะฑะธะฑะปะธะพั‚ะตะบ
import requests
import pandas as pd
import zipfile
import gzip
import os
import time
import tqdm
from tqdm import tqdm
a = time.time()
# ะŸะฐั€ะฐะผะตั‚ั€ั‹ ะฝะฐั‡ะฐะปัŒะฝะพะน ะธ ะบะพะฝะตั‡ะฝะพะน ะดะฐั‚ั‹
startdate = '20200627'
enddate = '20200628'

api_key = 'd988fddd7cfc0a8a'
secret_key = 'da05cf1aeb3a361a61'
# ะžั‚ะฟั€ะฐะฒะปะตะฝะธะต ะทะฐะฟั€ะพัะฐ ะฒ Amplitude
response = requests.get('https://amplitude.com/api/2/export?start='+startdate+'T0&end='+enddate+'T0', auth = (api_key, secret_key))
print('1. ะ—ะฐะฟั€ะพั ะพั‚ะฟั€ะฐะฒะปะตะฝ')

# ะกะบะฐั‡ะธะฒะฐะฝะธะต ะฐั€ั…ะธะฒะฐ ั ะดะฐะฝะฝั‹ะผะธ
filename = 'period_since'+startdate+'to'+enddate+'_amplitude_data'
with open(filename + '.zip', "wb") as code:
    code.write(response.content)
print('2. ะั€ั…ะธะฒ ั ั„ะฐะนะปะฐะผะธ ัƒัะฟะตัˆะฝะพ ัะบะฐั‡ะฐะฝ')  

# ะ˜ะทะฒะปะตั‡ะตะฝะธะต ั„ะฐะนะปะพะฒ ะฒ ะฟะฐะฟะบัƒ ะฝะฐ ะบะพะผะฟัŒัŽั‚ะตั€ะต
z = zipfile.ZipFile(filename + '.zip', 'r')
z.extractall(path = 'C:\Users\...\'+filename)
print('3. ะั€ั…ะธะฒ ั ั„ะฐะนะปะฐะผะธ ะธะทะฒะปะตั‡ะตะฝ ะธ ะทะฐะฟะธัะฐะฝ ะฒ ะฟะฐะฟะบัƒ ' + filename)

# ะŸั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธะต json ะบ ะพะฑั‹ั‡ะฝะพะผัƒ ั‚ะฐะฑะปะธั‡ะฝะพะผัƒ ั„ะพั€ะผะฐั‚ัƒ
directory = 'C:\Users\...\'+filename+'
# ะ˜ะผะฟะพั€ั‚ ะฑะธะฑะปะธะพั‚ะตะบ
import requests
import pandas as pd
import zipfile
import gzip
import os
import time
import tqdm
from tqdm import tqdm
a = time.time()
# ะŸะฐั€ะฐะผะตั‚ั€ั‹ ะฝะฐั‡ะฐะปัŒะฝะพะน ะธ ะบะพะฝะตั‡ะฝะพะน ะดะฐั‚ั‹
startdate = '20200627'
enddate = '20200628'
api_key = 'd988fddd7cfc0a8a'
secret_key = 'da05cf1aeb3a361a61'
# ะžั‚ะฟั€ะฐะฒะปะตะฝะธะต ะทะฐะฟั€ะพัะฐ ะฒ Amplitude
response = requests.get('https://amplitude.com/api/2/export?start='+startdate+'T0&end='+enddate+'T0', auth = (api_key, secret_key))
print('1. ะ—ะฐะฟั€ะพั ะพั‚ะฟั€ะฐะฒะปะตะฝ')
# ะกะบะฐั‡ะธะฒะฐะฝะธะต ะฐั€ั…ะธะฒะฐ ั ะดะฐะฝะฝั‹ะผะธ
filename = 'period_since'+startdate+'to'+enddate+'_amplitude_data'
with open(filename + '.zip', "wb") as code:
code.write(response.content)
print('2. ะั€ั…ะธะฒ ั ั„ะฐะนะปะฐะผะธ ัƒัะฟะตัˆะฝะพ ัะบะฐั‡ะฐะฝ')  
# ะ˜ะทะฒะปะตั‡ะตะฝะธะต ั„ะฐะนะปะพะฒ ะฒ ะฟะฐะฟะบัƒ ะฝะฐ ะบะพะผะฟัŒัŽั‚ะตั€ะต
z = zipfile.ZipFile(filename + '.zip', 'r')
z.extractall(path = 'C:\Users\...\'+filename)
print('3. ะั€ั…ะธะฒ ั ั„ะฐะนะปะฐะผะธ ะธะทะฒะปะตั‡ะตะฝ ะธ ะทะฐะฟะธัะฐะฝ ะฒ ะฟะฐะฟะบัƒ ' + filename)
# ะŸั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธะต json ะบ ะพะฑั‹ั‡ะฝะพะผัƒ ั‚ะฐะฑะปะธั‡ะฝะพะผัƒ ั„ะพั€ะผะฐั‚ัƒ
directory = 'C:\Users\...\'+filename+'\000000'
files = os.listdir(directory)
amplitude_dataframe = pd.DataFrame()
print('ะŸั€ะพะณั€ะตัั ะพะฑั€ะฐะฑะพั‚ะบะธ ั„ะฐะนะปะพะฒ:')
time.sleep(1)
for i in tqdm(files):
with gzip.open(directory + '\' + i) as f:
add = pd.read_json(f, lines = 'True')
amplitude_dataframe = pd.concat([amplitude_dataframe, add])
time.sleep(1)    
print('4. JSON ั„ะฐะนะปั‹ ะธะท ะฐั€ั…ะธะฒะฐ ัƒัะฟะตัˆะฝะพ ะฟั€ะตะพะฑั€ะฐะทะพะฒะฐะฝั‹ ะธ ะทะฐะฟะธัะฐะฝั‹ ะฒ dataframe')
# ะ—ะฐะฟะธัะฐั‚ัŒ ะฟะพะปัƒั‡ะตะฝะฝะพะน ั‚ะฐะฑะปะธั†ั‹ ะฒ Excel-ั„ะฐะนะป
amplitude_dataframe.to_excel('C:\Users\...\'+filename+'.xlsx',index=False)
print('5. Dataframe ัƒัะฟะตัˆะฝะพ ะทะฐะฟะธัะฐะฝ ะฒ ั„ะฐะนะป ' + filename)
b = time.time()
diff = b-a
minutes = diff//60
print('ะ’ั‹ะฟะพะปะฝะตะฝะธะต ะบะพะดะฐ ะทะฐะฝัะปะพ: {:.0f} ะผะธะฝัƒั‚(ั‹)'.format( minutes))
0000' files = os.listdir(directory) amplitude_dataframe = pd.DataFrame() print('ะŸั€ะพะณั€ะตัั ะพะฑั€ะฐะฑะพั‚ะบะธ ั„ะฐะนะปะพะฒ:') time.sleep(1) for i in tqdm(files): with gzip.open(directory + '\' + i) as f: add = pd.read_json(f, lines = 'True') amplitude_dataframe = pd.concat([amplitude_dataframe, add]) time.sleep(1) print('4. JSON ั„ะฐะนะปั‹ ะธะท ะฐั€ั…ะธะฒะฐ ัƒัะฟะตัˆะฝะพ ะฟั€ะตะพะฑั€ะฐะทะพะฒะฐะฝั‹ ะธ ะทะฐะฟะธัะฐะฝั‹ ะฒ dataframe') # ะ—ะฐะฟะธัะฐั‚ัŒ ะฟะพะปัƒั‡ะตะฝะฝะพะน ั‚ะฐะฑะปะธั†ั‹ ะฒ Excel-ั„ะฐะนะป amplitude_dataframe.to_excel('C:\Users\...\'+filename+'.xlsx',index=False) print('5. Dataframe ัƒัะฟะตัˆะฝะพ ะทะฐะฟะธัะฐะฝ ะฒ ั„ะฐะนะป ' + filename) b = time.time() diff = b-a minutes = diff//60 print('ะ’ั‹ะฟะพะปะฝะตะฝะธะต ะบะพะดะฐ ะทะฐะฝัะปะพ: {:.0f} ะผะธะฝัƒั‚(ั‹)'.format( minutes))

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹