Piton

Kako izraditi monitor web prometa pomoću Pythona, Flaska, SQLitea i Pushera

Kako izraditi monitor web prometa pomoću Pythona, Flaska, SQLitea i Pushera
Ako vam web aplikacija radi na internetu, morat ćete znati odakle dolaze posjetitelji, sustave koje koriste i druge takve stvari.

Iako možete koristiti usluge kao što su Google Analytics, Monster Insights itd., zabavnije je graditi sustav praćenja pomoću Pythona, SQL baze podataka i Pushera za ažuriranje podataka u stvarnom vremenu.

U današnjem uputstvu razmotrit ćemo kako stvoriti takav alat koristeći Python, Flask i Pusher. Vodič je visoko prilagođeni odjeljak iz vodiča objavljenog na službenoj stranici Pushera.

Zahtjevi

Za ovu gradnju morat ćete znati kako raditi s programskim jezikom python, jednostavnim web razvojem i API-ima.

Instaliranje zahtjeva

Započnite instaliranjem Pythona na vaš sustav. Također ćete morati instalirati Pusher i Flask, httpagentparser.

Izrada baze podataka

Prvi korak je stvaranje baze podataka u kojoj se podaci pohranjuju. Za Python sqlite3 dolazi kao zadana postavka i njegova je upotreba jednostavna. Stvorite datoteku koja se naziva baza podataka.py i unesite kod ispod:

uvoz sqlite3
iz sqlite3 pogreška uvoza
def create_connection (baza podataka):
probati:
conn = sqlite3.Spojiti(
baza podataka, isolation_level = None, check_same_thread = False)
spoj.row_factory = lambda c, r: dict (
zip ([col [0] za col u c.opis], r))
povrat conn
osim Pogreška kao e:
ispis (e)
def create_table (c, sql):
c.izvršiti (sql)
def update_or_create_page (c, podaci):
sql = "SELECT * FROM stranice na kojima je ime =? i sesija =?"
c.izvršiti (sql, podaci [: - 1])
rezultat = c.fetchone ()
ako je rezultat == nema:
create_pages (c, podaci)
drugo:
ispis (rezultat)
update_pages (c, rezultat ['id'])
def create_pages (c, podaci):
ispis (podaci)
sql = "INSERT INTO stranice (ime, sesija, prva posjeta)
VRIJEDNOSTI (?,?,?) "
c.izvršiti (sql, podaci)
def update_pages (c, pageId):
ispis (pageId)
sql = "AŽURIRANJE stranica
SET posjeta = posjeta + 1
WHERE id = ?"
c.izvrši (sql, [pageId])
def create_session (c, podaci):
sql = "INSERT INTO session (ip, kontinent, država, grad, os, preglednik, sesija, created_at)
VRIJEDNOSTI (?,?,?,?,?,?,?,?) "
c.izvršiti (sql, podaci)
def select_all_sessions (c):
sql = "SELECT * FROM session"
c.izvršiti (sql)
redovi = c.dohvatiti ()
povratni redovi
def select_all_pages (c):
sql = "SELECT * FROM pages"
c.izvršiti (sql)
redovi = c.dohvatiti ()
povratni redovi
def select_all_user_visits (c, session_id):
sql = "SELECT * FROM stranice na kojima je session =?"
c.izvrši (sql, [session_id])
redovi = c.dohvatiti ()
povratni redovi
def glavni ():
baza podataka = "./ pythonsqlite.db "
sql_create_pages = "" "
STVORI TABELU AKO NE POSTOJI stranice (
id cijeli broj PRIMARNI KLJUČ,
ime varchar (225) NIJE NULL,
sesija varchar (255) NIJE NULL,
first_visited datetime NOT NULL,
posjeti cijeli broj NOT NULL Zadani 1
);
"" "
sql_create_session = "" "
IZRADI TABELU AKO NE POSTOJI sesija (
id cijeli broj PRIMARNI KLJUČ,
ip varchar (225) NIJE NULL,
kontinent varchar (225) NIJE NULL,
zemlja varchar (225) NIJE NULL,
gradski varchar (225) NIJE NIŠTA,
os varchar (225) NIJE NULL,
preglednik varchar (225) NIJE NULL,
sesija varchar (225) NIJE NULL,
created_at datetime NIJE NULL
);
"" "
# stvorite vezu baze podataka
conn = create_connection (baza podataka)
ako conn nije None:
# kreirajte tablice
create_table (conn, sql_create_pages)
create_table (conn, sql_create_session)
print ("Veza uspostavljena!")
drugo:
print ("Nije moguće uspostaviti vezu")
ako je __name__ == '__glavno__':
glavni()

Spremite datoteku i pokrenite skriptu za stvaranje baze podataka s relevantnim podacima.

python baza podataka.py
“Veza uspostavljena!"

Zatim prijeđite na potiskivač i izradite račun. Zatim stvorite aplikaciju i slijedite čarobnjaka za postavljanje aplikacije. Po završetku kopirajte ključeve aplikacije i spremite ih u python rječnik kao što je prikazano u nastavku.

potiskivač = Potiskivač (
app_id = "1079412",
key = "e5d266a24f3502d2b814",
tajna = "bab634d2398eb5fcb0f8",
klaster = "us2")

Na kraju, stvorite tikvicu i izradite pozadinu kao što je prikazano u donjem kodu:

iz tikvice uvozna boca, render_template, zahtjev, sesija, jsonify
uvoz urllib.zahtjev
iz potiskivača uvoz Pusher
od datetime uvoz datetime
uvoz httpagentparser
uvoz json
uvoz os
uvoz hashlib
iz uvoza baze podataka create_connection, create_session, update_or_create_page, select_all_sessions, select_all_user_visits, select_all_pages
app = tikvica (__ ime__)
app.tajni_ključ = os.urandom (24)
# konfiguriraj potisni objekt
potiskivač = Potiskivač (
app_id = "1079412",
key = "e5d266a24f3502d2b814",
tajna = "bab634d2398eb5fcb0f8",
klaster = "us2")
baza podataka = "./ pythonsqlite.db "
conn = create_connection (baza podataka)
c = povez.pokazivač ()
userOS = Nijedan
userIP = Nema
userCity = Nema
userBrowser = Nema
userCountry = Nema
userContinent = Nema
sessionID = Nema
def glavni ():
globalna konekcija, c
def parseVisitor (podaci):
update_or_create_page (c, podaci)
potiskivač.okidač (u'pageview ', u'new',
u'page ': podaci [0],
u'session ': sessionID,
u'ip ': userIP
)
potiskivač.okidač (u'brojevi ', u'update',
u'page ': podaci [0],
u'session ': sessionID,
u'ip ': userIP
)
@app.prije_ zahtjeva
def getAnalyticsData ():
global userOS, userBrowser, userIP, userContinent, userCity, userCountry, sessionID
userInfo = httpagentparser.otkriti (zahtjev.zaglavlja.get ('Korisnički agent'))
userOS = userInfo ['platforma'] ['ime']
userBrowser = userInfo ['preglednik'] ['ime']
userIP = "196.207.130.148 "ako zahtjev.remote_addr == '127.0.0.1 'else zahtjev.daljinski_addr
api = "https: // www.iplocirati.io / api / lookup / "+ userIP
probati:
resp = urllib.zahtjev.urlopen (api)
rezultat = odg.čitati()
rezultat = json.opterećenja (rezultat.dekodiraj ("utf-8"))
userCountry = rezultat ["zemlja"]
userContinent = rezultat ["kontinent"]
userCity = rezultat ["grad"]
osim:
print ("Nije moguće pronaći:", userIP)
getSession ()
def getSession ():
globalni ID sesije
vrijeme = datum i vrijeme.sada().zamijeniti (mikrosekunda = 0)
ako 'korisnik' nije u sesiji:
linije = (str (vrijeme) + userIP).encode ('utf-8')
session ['user'] = hashlib.md5 (linije).hexdigest ()
sessionID = session ['korisnik']
potiskivač.okidač (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 (vrijeme),
)
podaci = [userIP, userContinent, userCountry,
userCity, userOS, userBrowser, sessionID, vrijeme]
create_session (c, podaci)
drugo:
sessionID = session ['korisnik']
@app.ruta ('/')
def indeks ():
podaci = ['home', sessionID, str (datetime.sada().zamijeniti (mikrosekunda = 0))]
parseVisitor (podaci)
vrati f'Korisnički podaci: data '
@app.ruta ('/ get-all-session')
def get_all_sessions ():
podaci = []
dbRows = select_all_sessions (c)
za red u dbRows:
podaci.dodati(
'ip': redak ['ip'],
'kontinent': redak ['kontinent'],
'zemlja': redak ['zemlja'],
'grad': row ['grad'],
'os': redak ['os'],
'browser': row ['browser'],
'session': row ['session'],
'vrijeme': redak ['stvoren_at']
)
vrati jsonify (podaci)
ako je __name__ == '__glavno__':
glavni()
app.pokrenite (otklanjanje pogrešaka = True)

Po završetku pokrenite aplikaciju pomoću naredbene tikvice run i prijeđite na 127.0.0.1: 5000 / Ovo bi trebalo prijaviti korisnika, podatke o sesiji određene IP adrese, uključujući agenta (preglednik), državu i slično.

Da biste pregledali sve zabilježene sesije, idite na 127.0.0.1: 5000 / get-all-session.

[

"browser": "Chrome",
"city": "New York",
"kontinent": "Sjeverna Amerika",
"country": "Sjedinjene Države",
"ip": "192.148.18.103 ",
"os": "Linux",
"sesija": "9a5d6a84d93ad62a599293acb2e751a1",
"time": "2021-01-13 02:52:32"
,

"browser": "Mozilla",
"city": "Oregon",
"kontinent": "Sjeverna Amerika",
"country": "Sjedinjene Države",
"ip": "66.115.149.229 ",
"os": "Windows",
"sesija": "64d205c98c839e1d346c733ffd41b27f",
"time": "2021-01-13 02:54:12"
,

"browser": "Chrome",
"city": "Ogden",
"kontinent": "Sjeverna Amerika",
"country": "Sjedinjene Države",
"ip": "172.231.59.124 ",
"os": "Windows",
"session": "3fd564c16a32b5139a8dd0578e36aded",
"time": "2021-01-13 02:54:37"
,

"browser": "Chrome",
"city": "New York",
"kontinent": "Sjeverna Amerika",
"country": "Sjedinjene Države",
"ip": "72.229.28.185 ",
"os": "Windows",
"session": "27ad92271023888427da216de10a7cae",
"time": "2021-01-13 02:55:07"
,

"browser": "Chrome",
"city": "Nairobi",
"kontinent": "Afrika",
"country": "Kenija",
"ip": "196.207.130.148 ",
"os": "Linux",
"sesija": "c92cdab9eefa2fe121d49264986e7345",
"time": "2021-01-13 02:56:43"
,

"browser": "Chrome",
"city": "Nairobi",
"kontinent": "Afrika",
"country": "Kenija",
"ip": "196.207.130.148 ",
"os": "Windows",
"sesija": "31ee28ec6a655e0fa13be4dba8c13861",
"time": "2021-01-13 03:11:49"

]

Dok je aplikacija pokrenuta, možete nasumično promijeniti svoju IP adresu i preglednike kako biste prikupili dovoljno podataka za svoju bazu podataka. Pomoću prikupljenih podataka možete koristiti podatkovne alate kao što je ELK stog da biste ih vizualizirali i vidjeli koja mjesta i preglednici više posjećuju aplikaciju.

Slijedi primjer vizualizacije prikupljenih podataka iz gornje aplikacije.

Zaključak

U ovom uputstvu koristili smo Python, SQLite i Pusher za prikupljanje podataka o korisnicima koji posjećuju web mjesto, a zatim smo ih koristili za izradu vizualizacija.

Kako bi stvari bile jednostavne, ograničio sam izlaz aplikacije na konzolu i JSON kako bi se smjestili oni koji nisu radili s predloškom jinja Flask.

Ova jednostavna aplikacija otvorena je za proširenje u punopravni alat za web analitiku. Dodatna znanja potražite u donjim resursima:

Luke komercijalnih igara s otvorenim kodom
Besplatne igre s otvorenim kodom i više platformi mogu se koristiti za igranje starih, kao i nekih prilično nedavnih naslova igara. U ovom će se člank...
Najbolje igre naredbenog retka za Linux
Naredbeni redak nije samo vaš najveći saveznik pri korištenju Linuxa - on također može biti izvor zabave jer ga možete koristiti za igranje mnogih zab...
Najbolje aplikacije za mapiranje gamepada za Linux
Ako volite igrati igre na Linuxu s gamepadom umjesto tipičnim sustavom za unos tipkovnice i miša, za vas postoji nekoliko korisnih aplikacija. Mnoge r...