Python

Kako zgraditi monitor spletnega prometa s Pythonom, bučko, SQLite in potisnikom

Kako zgraditi monitor spletnega prometa s Pythonom, bučko, SQLite in potisnikom
Če imate v internetu spletno aplikacijo, morate vedeti, od kod prihajajo vaši obiskovalci, sisteme, ki jih uporabljajo, in druge take stvari.

Čeprav lahko uporabljate storitve, kot so Google Analytics, Monster Insights itd., bolj zabavno je zgraditi nadzorni sistem z uporabo Pythona, zbirke podatkov SQL in Pusherja za sprotno posodabljanje podatkov.

V današnji vadnici bomo preučili, kako ustvariti takšno orodje z uporabo Python, Flask in Pusher. Vadnica je zelo prilagojena delitev vaje, objavljene na uradni strani Pusherja.

Zahteve

Za to gradnjo boste morali vedeti, kako delati s programskim jezikom python, preprostim spletnim razvojem in API-ji.

Namestitev zahtev

Začnite z namestitvijo Pythona v sistem. Prav tako boste morali namestiti Pusher in Flask, httpagentparser.

Ustvarjanje baze podatkov

Prvi korak je ustvariti bazo podatkov, v kateri so podatki shranjeni. Za Python je sqlite3 privzeto in je preprosta. Ustvarite datoteko z imenom baza podatkov.py in vnesite spodnjo kodo:

uvozi sqlite3
iz sqlite3 Napaka pri uvozu
def create_connection (baza podatkov):
poskusite:
conn = sqlite3.povezati (
baza podatkov, isolation_level = Brez, check_same_thread = False)
povez.row_factory = lambda c, r: dict (
zip ([col [0] za col v c.opis], r))
vrn
razen Napaka kot e:
natisni (e)
def create_table (c, sql):
c.izvrši (sql)
def update_or_create_page (c, podatki):
sql = "SELECT * FROM strani, kjer je ime =? in seja =?"
c.izvrši (sql, podatki [: - 1])
rezultat = c.fetchone ()
če je rezultat == Brez:
create_pages (c, podatki)
sicer:
natisni (rezultat)
update_pages (c, rezultat ['id'])
def create_pages (c, podatki):
tisk (podatki)
sql = "INSERT INTO pages (name, session, first_visited)
VREDNOTE (?,?,?) "
c.izvrši (sql, podatki)
def update_pages (c, pageId):
natisni (pageId)
sql = "POSODOBI strani
SET obiski = obiski + 1
KJE id = ?"
c.izvrši (sql, [pageId])
def create_session (c, podatki):
sql = "VSTAVITE V seje (ip, celina, država, mesto, os, brskalnik, seja, created_at)
VREDNOTE (?,?,?,?,?,?,?,?) "
c.izvrši (sql, podatki)
def select_all_sessions (c):
sql = "IZBERI * IZ sej"
c.izvrši (sql)
vrstice = c.prinesi ()
vrne vrstice
def select_all_pages (c):
sql = "IZBERI * IZ strani"
c.izvrši (sql)
vrstice = c.prinesi ()
vrne vrstice
def select_all_user_visits (c, session_id):
sql = "SELECT * FROM strani, kjer je seja =?"
c.izvrši (sql, [session_id])
vrstice = c.prinesi ()
vrne vrstice
def main ():
database = "./ pythonsqlite.db "
sql_create_pages = "" "
USTVARI TABELO, ČE NE OBSTAJA strani (
id celo število PRIMARNI KLJUČ,
ime varchar (225) NOT NULL,
seja varchar (255) NOT NULL,
first_visited datetime NOT NULL,
obiski celo število NOT NULL Privzeto 1
);
"" "
sql_create_session = "" "
USTVARI TABELO, ČE NE OBSTAJA sej (
id celo število PRIMARNI KLJUČ,
ip varchar (225) NI NULL,
celina varchar (225) NOT NULL,
država varchar (225) NI NULL,
mestni varchar (225) NI NULL,
os varchar (225) NI NULL,
brskalnik varchar (225) NOT NULL,
seja varchar (225) NOT NULL,
created_at datetime NOT NULL
);
"" "
# ustvari povezavo z bazo podatkov
conn = create_connection (baza podatkov)
če conn ni nič:
# ustvari tabele
create_table (conn, sql_create_pages)
create_table (conn, sql_create_session)
print ("Povezava vzpostavljena!")
sicer:
print ("Povezave ni bilo mogoče vzpostaviti")
če je __name__ == '__main__':
glavni ()

Shranite datoteko in zaženite skript, da ustvarite bazo podatkov z ustreznimi podatki.

zbirka podatkov python.py
»Povezava je vzpostavljena!"

Nato pojdite na potiskalnik in ustvarite račun. Nato ustvarite aplikacijo in sledite čarovniku za nastavitev aplikacije. Ko končate, kopirajte ključe aplikacije in jih shranite v slovar python, kot je prikazano spodaj.

potisnik = potisnik (
app_id = "1079412",
key = "e5d266a24f3502d2b814",
skrivnost = "bab634d2398eb5fcb0f8",
cluster = "us2")

Na koncu ustvarite aplikacijo bučke in zgradite zaledje, kot je prikazano v spodnji kodi:

iz bučke uvoz Flask, render_template, request, session, jsonify
uvozni urllib.prošnja
iz potisnega uvoza Potiskalnik
od datetime uvoz datumtime
uvozi httpagentparser
uvoz json
uvoz os
uvozi hashlib
iz uvoza baze podatkov create_connection, create_session, update_or_create_page, select_all_sessions, select_all_user_visits, select_all_pages
app = bučka (__ ime__)
app.tajni_klen = os.urandom (24)
# konfiguriraj potisni objekt
potisnik = potisnik (
app_id = "1079412",
key = "e5d266a24f3502d2b814",
skrivnost = "bab634d2398eb5fcb0f8",
cluster = "us2")
database = "./ pythonsqlite.db "
conn = create_connection (baza podatkov)
c = prik.kazalec ()
userOS = Brez
userIP = Brez
userCity = Brez
userBrowser = Brez
userCountry = Brez
userContinent = Brez
sessionID = Brez
def main ():
globalna povezava, c
def parseVisitor (podatki):
update_or_create_page (c, podatki)
potiskalnik.sprožilec (u'pageview ', u'new',
u'page ': podatki [0],
u'session ': sessionID,
u'ip ': userIP
)
potiskač.sprožilec (u'numbers ', u'update',
u'page ': podatki [0],
u'session ': sessionID,
u'ip ': userIP
)
@app.pred_zahtevo
def getAnalyticsData ():
global userOS, userBrowser, userIP, userContinent, userCity, userCountry, sessionID
userInfo = httpagentparser.zaznati (zahtevati.glave.get ('User-Agent'))
userOS = userInfo ['platforma'] ['ime']
userBrowser = userInfo ['brskalnik'] ['ime']
userIP = "196.207.130.148 "če zahteva.remote_addr == '127.0.0.1 'sicer zahteva.oddaljeni_addr
api = "https: // www.iplocate.io / api / lookup / "+ userIP
poskusite:
resp = urllib.prošnja.urlopen (api)
rezultat = oz.preberi ()
rezultat = json.obremenitve (rezultat.dekodiraj ("utf-8"))
userCountry = rezultat ["država"]
userContinent = rezultat ["celina"]
userCity = rezultat ["mesto"]
razen:
print ("Ne najdem:", userIP)
getSession ()
def getSession ():
globalni ID seje
čas = datum in čas.zdaj ().zamenjaj (mikrosekunda = 0)
če 'uporabnik' ni v seji:
vrstice = (str (čas) + userIP).encode ('utf-8')
session ['user'] = hashlib.md5 (vrstice).hexdigest ()
sessionID = session ['user']
potiskač.sprožilec (u'session ', u'new',
u'ip ': userIP,
u'continent ': userContinent,
u'country ': userCountry,
u'city ': userCity,
u'os ': uporabnikOS,
u'browser ': userBrowser,
u'session ': sessionID,
u'time ': str (čas),
)
podatki = [userIP, userContinent, userCountry,
userCity, userOS, userBrowser, sessionID, time]
create_session (c, podatki)
sicer:
sessionID = session ['user']
@app.pot ('/')
indeks def ():
data = ['home', sessionID, str (datetime.zdaj ().zamenjaj (mikrosekunda = 0))]
parseVisitor (podatki)
vrni f'Uporabniški podatki: data '
@app.pot ('/ get-all-session')
def get_all_sessions ():
podatki = []
dbRows = select_all_sessions (c)
za vrstico v dbRows:
podatkov.dodaj (
'ip': vrstica ['ip'],
'celina': vrstica ['celina'],
'country': row ['country'],
'city': row ['city'],
'os': vrstica ['os'],
'brskalnik': vrstica ['brskalnik'],
'session': row ['session'],
'time': row ['created_at']
)
vrni jsonify (podatki)
če je __name__ == '__main__':
glavni ()
app.zaženi (odpravljanje napak = True)

Ko končate, zaženite aplikacijo z uporabo ukazne bučke in zaženite 127.0.0.1: 5000 / To bi moralo prijaviti uporabnika, podatke o seji določenega naslova IP, vključno z agentom (brskalnik), državo in podobno.

Če si želite ogledati vso zabeleženo sejo, pojdite na 127.0.0.1: 5000 / vse seje.

[

"browser": "Chrome",
"city": "New York",
"kontinent": "Severna Amerika",
"country": "Združene države",
"ip": "192.148.18.103 ",
"os": "Linux",
"session": "9a5d6a84d93ad62a599293acb2e751a1",
"time": "2021-01-13 02:52:32"
,

"browser": "Mozilla",
"city": "Oregon",
"kontinent": "Severna Amerika",
"country": "Združene države",
"ip": "66.115.149.229 ",
"os": "Windows",
"session": "64d205c98c839e1d346c733ffd41b27f",
"time": "2021-01-13 02:54:12"
,

"browser": "Chrome",
"city": "Ogden",
"kontinent": "Severna Amerika",
"country": "Združene države",
"ip": "172.231.59.124 ",
"os": "Windows",
"session": "3fd564c16a32b5139a8dd0578e36aded",
"time": "2021-01-13 02:54:37"
,

"browser": "Chrome",
"city": "New York",
"kontinent": "Severna Amerika",
"country": "Združene 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",
"session": "c92cdab9eefa2fe121d49264986e7345",
"time": "2021-01-13 02:56:43"
,

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

]

Z zagnano aplikacijo lahko naključno spremenite svoj naslov IP in brskalnike, da zberete dovolj informacij za svojo bazo podatkov. Z uporabo zbranih podatkov lahko s pomočjo podatkovnih orodij, kot je ELK stack, vizualizirate in vidite, katere lokacije in brskalniki več obiskujejo aplikacijo.

Sledi primer vizualizacije zbranih podatkov iz zgornje aplikacije.

Zaključek

V tej vadnici smo uporabili Python, SQLite in Pusher za zbiranje informacij o uporabnikih, ki obiščejo spletno mesto, nato pa podatke uporabili za ustvarjanje vizualizacij.

Da bodo stvari enostavnejše, sem izhodne podatke aplikacije omejil na konzolo in JSON, da se prilagodi tistim, ki še niso delali s predlogami jinja Flask.

Ta preprosta aplikacija je odprta za razširitev v polno orodje za spletno analitiko. Za dodatno znanje si oglejte spodnje vire:

Najboljše igre z ročnim sledenjem
Oculus Quest je pred kratkim predstavil odlično idejo ročnega sledenja brez krmilnikov. Z vedno večjim številom iger in dejavnosti, ki izvajajo podpor...
Kako prikazati prekrivanje zaslonskega menija v celozaslonskih aplikacijah in igrah za Linux
Igranje celozaslonskih iger ali uporaba aplikacij v celozaslonskem načinu brez motenj vam lahko odreže ustrezne sistemske informacije, ki so vidne na ...
Top 5 kartic za zajemanje iger
Vsi smo v YouTubu videli in oboževali pretakanje iger. PewDiePie, Jakesepticye in Markiplier so le nekateri izmed najboljših igralcev, ki so zaslužili...