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 = Няма, check_same_thread = False)
конн.row_factory = лямбда c, r: dict (
zip ([col [0] за col в c.описание], r))
връщане конн
с изключение на Грешка като e:
печат (д)
def create_table (c, sql):
° С.изпълни (sql)
def update_or_create_page (c, данни):
sql = "SELECT * FROM страници, където име =? и сесия =?"
° С.изпълни (sql, данни [: - 1])
резултат = c.fetchone ()
ако резултат == няма:
create_pages (c, данни)
друго:
печат (резултат)
update_pages (c, резултат ['id'])
def create_pages (c, данни):
печат (данни)
sql = "INSERT INTO страници (име, сесия, first_visited)
СТОЙНОСТИ (?,?,?) "
° С.изпълнение (sql, данни)
def update_pages (c, pageId):
печат (pageId)
sql = "АКТУАЛИЗИРАНЕ на страници
SET посещения = посещения + 1
КЪДЕ id = ?"
° С.изпълни (sql, [pageId])
def create_session (c, данни):
sql = "INSERT INTO сесии (ip, континент, държава, град, os, браузър, сесия, created_at)
СТОЙНОСТИ (?,?,?,?,?,?,?,?) "
° С.изпълнение (sql, данни)
def select_all_sessions (c):
sql = "SELECT * FROM сесии"
° С.изпълни (sql)
редове = c.извличане ()
връщане на редове
def select_all_pages (c):
sql = "ИЗБЕРЕТЕ * ОТ страници"
° С.изпълни (sql)
редове = c.извличане ()
връщане на редове
def select_all_user_visits (c, session_id):
sql = "SELECT * FROM страници, където сесия =?"
° С.изпълни (sql, [session_id])
редове = c.извличане ()
връщане на редове
def main ():
база данни = "./ pythonsqlite.db "
sql_create_pages = "" "
СЪЗДАЙТЕ ТАБЛИЦА, АКО НЕ СЪЩЕСТВУВА страници (
id цяло число ОСНОВЕН КЛЮЧ,
име varchar (225) NOT NULL,
сесия varchar (255) NOT NULL,
first_visited datetime NOT NULL,
посещава цяло число NOT NULL По подразбиране 1
);
""
sql_create_session = "" "
СЪЗДАЙТЕ ТАБЛИЦА, АКО НЕ СЪЩЕСТВУВА сесии (
id цяло число ОСНОВЕН КЛЮЧ,
ip varchar (225) НЕ Е НУЛО,
континент varchar (225) НЕ Е НУЛО,
страна varchar (225) НЕ НУЛО,
градски варчар (225) НЕ НУЛО,
os varchar (225) NOT NULL,
браузър varchar (225) NOT NULL,
сесия 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__ == '__main__':
главен ()

Запазете файла и стартирайте скрипта, за да създадете базата данни със съответните данни.

база данни на python.py
"Установена е връзка!”

След това преминете към тласкача и създайте акаунт. След това създайте приложение и следвайте съветника, за да настроите приложението. След като завършите, копирайте ключовете на приложението и ги съхранявайте в речник на python, както е показано по-долу.

тласкач = тласкач (
app_id = "1079412",
ключ = "e5d266a24f3502d2b814",
тайна = "bab634d2398eb5fcb0f8",
клъстер = "us2")

И накрая, създайте приложение за колба и изградете бекенда, както е показано в кода по-долу:

от колба импортиране Колба, render_template, заявка, сесия, jsonify
импортиране на urllib.заявка
от тласкач внос тласкач
от datetime импортиране datetime
импортиране на httpagentparser
импортиране json
внос os
внос hashlib
от импортиране на база данни create_connection, create_session, update_or_create_page, select_all_sessions, select_all_user_visits, select_all_pages
ап = колба (__ име__)
ап.secret_key = os.уранд (24)
# конфигуриране на обект тласкач
тласкач = тласкач (
app_id = "1079412",
ключ = "e5d266a24f3502d2b814",
тайна = "bab634d2398eb5fcb0f8",
клъстер = "us2")
база данни = "./ pythonsqlite.db "
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 = резултат ["град"]
с изключение:
print ("Не можах да намеря:", userIP)
getSession ()
def getSession ():
глобален идентификатор на сесията
време = дата и час.сега().замени (микросекунда = 0)
ако „потребител“ не е в сесия:
редове = (str (време) + userIP).encode ('utf-8')
session ['user'] = hashlib.md5 (редове).hexdigest ()
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.маршрут ('/')
def index ():
data = ['home', sessionID, str (datetime.сега().замени (микросекунда = 0))]
parseVisitor (данни)
връща f'Потребителски данни: data '
@app.route ('/ get-all-session')
def get_all_sessions ():
данни = []
dbRows = select_all_sessions (c)
за ред в dbRows:
данни.добавяне (
'ip': ред ['ip'],
'континент': ред ['континент'],
'държава': ред ['държава'],
'city': row ['city'],
'os': ред ['os'],
„браузър“: ред [„браузър“],
'session': row ['session'],
'time': row ['created_at']
)
връщане jsonify (данни)
ако __name__ == '__main__':
главен ()
ап.стартиране (отстраняване на грешки = Вярно)

След като приключите, стартирайте приложението, като използвате командната колба за изпълнение и отидете до 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
В миналото играта на игри се смяташе само за хоби, но с течение на времето игралната индустрия отбеляза огромен ръст по отношение на технологиите и бр...
Най-добрите игри за игра с ръчно проследяване
Oculus Quest наскоро представи страхотната идея за ръчно проследяване без контролери. С непрекъснато нарастващия брой игри и дейности, които изпълнява...
Как да покажете OSD наслагване в приложения на цял екран за Linux и игри
Играта на цял екран или използване на приложения в режим на цял екран без разсейване може да ви откъсне от съответната системна информация, видима в п...