Python

Як створити монітор веб-трафіку за допомогою Python, Flask, SQLite та Pusher

Як створити монітор веб-трафіку за допомогою Python, Flask, SQLite та Pusher
Якщо у вас працює веб-програма в Інтернеті, вам потрібно буде знати, звідки беруться відвідувачі, системи, якими вони користуються, та інші подібні речі.

Хоча ви можете користуватися такими сервісами, як Google Analytics, Monster Insights тощо., цікавіше будувати систему моніторингу за допомогою Python, бази даних SQL та Pusher для оновлення даних у режимі реального часу.

У сьогоднішньому підручнику ми поговоримо про те, як створити такий інструмент за допомогою Python, Flask та Pusher. Навчальний посібник - це спеціально налаштований результат із підручника, опублікованого на офіційній сторінці Pusher.

Вимоги

Для цієї збірки вам потрібно буде знати, як працювати з мовою програмування python, простою веб-розробкою та API.

Встановлення вимог

Почніть із встановлення Python у вашій системі. Вам також потрібно буде встановити Pusher and Flask, httpagentparser.

Створення бази даних

Першим кроком є ​​створення бази даних, де дані зберігаються. Для Python sqlite3 є типовим, і використовувати його просто. Створіть файл із назвою база даних.py та введіть код нижче:

імпортувати sqlite3
з помилки імпорту sqlite3
def create_connection (база даних):
спробуйте:
conn = sqlite3.підключити (
база даних, isolation_level = None, check_same_thread = False)
зв’язок.row_factory = лямбда c, r: dict (
zip ([col [0] для col в c.опис], r))
повернути соед
крім помилки як e:
друк (e)
def create_table (c, sql):
c.виконати (sql)
def update_or_create_page (c, дані):
sql = "ВИБЕРІТЬ * ІЗ сторінок, де name =? і сесія =?"
c.виконати (sql, дані [: - 1])
результат = c.фетхон ()
якщо результат == немає:
create_pages (c, дані)
ще:
друк (результат)
update_pages (c, результат ['id'])
def create_pages (c, data):
друк (дані)
sql = "ВСТАВИТИ НА сторінки (ім'я, сесія, перший_відвіданий)
ЦІННОСТІ (?,?,?) "
c.виконати (sql, дані)
def update_pages (c, pageId):
друк (pageId)
sql = "ОНОВИТИ сторінки
SET відвідувань = відвідувань + 1
ДЕ id = ?"
c.виконати (sql, [pageId])
def create_session (c, дані):
sql = "ВСТАВИТИ У сеанси (ip, континент, країна, місто, ос, браузер, сесія, created_at)
ЦІННОСТІ (?,?,?,?,?,?,?,?) "
c.виконати (sql, дані)
def select_all_sessions (c):
sql = "ВИБЕРІТЬ * ВІД сеансів"
c.виконати (sql)
рядки = c.fetchall ()
повернути рядки
def select_all_pages (c):
sql = "ВИБРАТИ * ІЗ сторінок"
c.виконати (sql)
рядки = c.fetchall ()
повернути рядки
def select_all_user_visits (c, session_id):
sql = "ВИБЕРІТЬ * ІЗ сторінок, де сесія =?"
c.виконати (sql, [ідентифікатор_сесії])
рядки = c.fetchall ()
повернути рядки
def main ():
база даних = "./ pythonsqlite.дб "
sql_create_pages = "" "
СТВОРИТИ ТАБЛИЦЮ, ЯКЩО НЕ ІСНУЄ сторінок (
id ціле число ПЕРВИННИЙ КЛЮЧ,
ім'я varchar (225) НЕ НУЛЕВО,
сесія varchar (255) NOT NULL,
first_visited datetime NOT NULL,
відвідує ціле число NOT NULL За замовчуванням 1
);
"" "
sql_create_session = "" "
СТВОРИТИ ТАБЛИЦЮ, ЯКЩО НЕ ІСНУЄ сесій (
id ціле число ПЕРВИННИЙ КЛЮЧ,
ip varchar (225) НЕ НУЛЬ,
континент варчар (225) НЕ НУЛЬ,
країна varchar (225) НЕ НУЛЬ,
міський варчар (225) НЕ НУЛЬ,
os varchar (225) НЕ НУЛЬ,
браузер varchar (225) НЕ НУЛЬ,
сесія varchar (225) NOT NULL,
created_at datetime NOT NULL
);
"" "
# створити підключення до бази даних
conn = create_connection (база даних)
якщо conn не є None:
# створити таблиці
create_table (conn, sql_create_pages)
create_table (conn, sql_create_session)
print ("З'єднання встановлено!")
ще:
print ("Не вдалося встановити з'єднання")
якщо __name__ == '__основна__':
основний ()

Збережіть файл і запустіть скрипт, щоб створити базу даних з відповідними даними.

база даних python.py
“Зв’язок встановлено!"

Далі перейдіть до штовхача і створіть рахунок. Далі створіть програму та дотримуйтесь майстра, щоб налаштувати програму. Після завершення скопіюйте ключі програми та збережіть їх у словнику python, як показано нижче.

штовхач = штовхач (
app_id = "1079412",
key = "e5d266a24f3502d2b814",
секрет = "bab634d2398eb5fcb0f8",
кластер = "us2")

Нарешті, створіть програму-колбу та побудуйте серверну систему, як показано в коді нижче:

з імпорту колби Flask, render_template, request, session, jsonify
імпорт urllib.запит
від штовхача імпортного штовхача
з дати і часу імпорту
імпортувати httpagentparser - -
імпорт JSON
імпорт ос
імпортувати хешліб
з імпорту бази даних create_connection, create_session, update_or_create_page, select_all_sessions, select_all_user_visits, select_all_pages
app = Flask (__ name__)
додаток.секретний_ключ = ос.урандом (24)
# налаштування об'єкта штовхача
штовхач = штовхач (
app_id = "1079412",
key = "e5d266a24f3502d2b814",
секрет = "bab634d2398eb5fcb0f8",
кластер = "us2")
база даних = "./ pythonsqlite.дб "
conn = create_connection (база даних)
c = зв.курсор ()
userOS = Немає
userIP = Немає
userCity = Немає
userBrowser = Немає
userCountry = Немає
userContinent = Немає
sessionID = Немає
def main ():
глобальний зв’язок, c
def parseVisitor (дані):
update_or_create_page (c, дані)
штовхач.тригер (u'pageview ', u'new',
u'page ': дані [0],
u'session ': sessionID,
u'ip ': userIP
)
штовхач.тригер (u'numbers ', u'update',
u'page ': дані [0],
u'session ': sessionID,
u'ip ': userIP
)
@app.до_запиту
def getAnalyticsData ():
глобальний userOS, userBrowser, userIP, userContinent, userCity, userCountry, sessionID
userInfo = httpagentparser.виявити (запит.заголовки.get ('User-Agent'))
userOS = userInfo ['платформа'] ['ім'я']
userBrowser = userInfo ['браузер'] ['ім'я']
userIP = "196.207.130.148 "за запитом.remote_addr == '127.0.0.1 'ще запит.віддалений_аддр
api = "https: // www.iplocate.io / api / lookup / "+ userIP
спробуйте:
відповідно = urllib.запит.урлопен (api)
результат = відп.читати ()
результат = json.навантаження (результат.декодування ("utf-8"))
userCountry = результат ["країна"]
userContinent = результат ["континент"]
userCity = result ["місто"]
крім:
print ("Не вдалося знайти:", userIP)
getSession ()
def getSession ():
глобальний ідентифікатор сеансу
час = дата і час.зараз ().замінити (мікросекунда = 0)
якщо 'користувач' не в сесії:
рядки = (str (час) + userIP).encode ('utf-8')
session ['user'] = hashlib.md5 (рядки).шістнадцятковий ()
sessionID = session ['user']
штовхач.тригер (u'session ', u'new',
u'ip ': userIP,
u'continent ': userContinent,
u'country ': userCountry,
u'city ': userCity,
u'os ': userOS,
u'browser ': userBrowser,
u'session ': sessionID,
u'time ': str (час),
)
дані = [userIP, userContinent, userCountry,
userCity, userOS, userBrowser, sessionID, час]
create_session (c, дані)
ще:
sessionID = session ['user']
@app.route ('/')
індекс def ():
data = ['home', sessionID, str (datetime.зараз ().замінити (мікросекунда = 0))]
parseVisitor (дані)
повернути дані користувача: дані
@app.route ('/ отримати всі сеанси')
def get_all_sessions ():
дані = []
dbRows = select_all_sessions (c)
для рядка в dbRows:
даних.додати (
'ip': рядок ['ip'],
'континент': рядок ['континент'],
'country': row ['country'],
'місто': row ['місто'],
'os': рядок ['os'],
'браузер': рядок ['браузер'],
'session': row ['session'],
'time': row ['created_at']
)
повернути jsonify (дані)
якщо __name__ == '__основна__':
основний ()
додаток.запустити (налагодження = True)

Після завершення запустіть програму за допомогою команди flask run і перейдіть до пункту 127.0.0.1: 5000 / Це повинно реєструвати користувача, інформацію про сеанс конкретної IP-адреси, включаючи агента (браузер), країну тощо.

Щоб переглянути весь зареєстрований сеанс, перейдіть до 127.0.0.1: 5000 / отримати всі сеанси.

[

"browser": "Chrome",
"city": "Нью-Йорк",
"континент": "Північна Америка",
"country": "США",
"ip": "192.148.18.103 ",
"os": "Linux",
"сесія": "9a5d6a84d93ad62a599293acb2e751a1",
"time": "2021-01-13 02:52:32"
,

"browser": "Mozilla",
"city": "Орегон",
"континент": "Північна Америка",
"country": "США",
"ip": "66.115.149.229 ",
"os": "Windows",
"сесія": "64d205c98c839e1d346c733ffd41b27f",
"time": "2021-01-13 02:54:12"
,

"browser": "Chrome",
"city": "Ogden",
"континент": "Північна Америка",
"country": "США",
"ip": "172.231.59.124 ",
"os": "Windows",
"сесія": "3fd564c16a32b5139a8dd0578e36aded",
"time": "2021-01-13 02:54:37"
,

"browser": "Chrome",
"city": "Нью-Йорк",
"континент": "Північна Америка",
"country": "США",
"ip": "72.229.28.185 ",
"os": "Windows",
"сесія": "27ad92271023888427da216de10a7cae",
"time": "2021-01-13 02:55:07"
,

"browser": "Chrome",
"city": "Найробі",
"континент": "Африка",
"country": "Кенія",
"ip": "196.207.130.148 ",
"os": "Linux",
"сесія": "c92cdab9eefa2fe121d49264986e7345",
"time": "2021-01-13 02:56:43"
,

"browser": "Chrome",
"city": "Найробі",
"континент": "Африка",
"country": "Кенія",
"ip": "196.207.130.148 ",
"os": "Windows",
"сесія": "31ee28ec6a655e0fa13be4dba8c13861",
"time": "2021-01-13 03:11:49"

]

Запустивши програму, ви можете випадковим чином змінити свою IP-адресу та браузери, щоб зібрати достатньо інформації для вашої бази даних. Використовуючи зібрані дані, ви можете використовувати інструменти даних, такі як стек ELK, щоб візуалізувати їх і побачити, які місця та браузери більше відвідують додаток.

Далі наведено приклад візуалізації зібраних даних із програми, наведеної вище.

Висновок

У цьому підручнику ми використовували Python, SQLite та Pusher для збору інформації про користувачів, які відвідують веб-сайт, а потім використовували дані для створення візуалізації.

Щоб все було простіше, я обмежив вихід програми консоллю та JSON для розміщення тих, хто не працював із шаблоном Jinja Flask.

Цей простий додаток відкритий для розширення в повноцінний інструмент веб-аналітики. Розгляньте наведені нижче ресурси для отримання додаткових знань:

Як розробити гру на Linux
Десять років тому не так багато користувачів Linux передбачали, що їх улюблена операційна система колись стане популярною ігровою платформою для комер...
Open Source Ports of Commercial Game Engines
Free, open source and cross-platform game engine recreations can be used to play old as well as some of the fairly recent game titles. This article wi...
Кращі ігри командного рядка для Linux
Командний рядок - це не просто ваш найбільший союзник при використанні Linux, він також може бути джерелом розваг, оскільки ви можете використовувати ...