Pitone

Come creare un monitoraggio del traffico Web con Python, Flask, SQLite e Pusher

Come creare un monitoraggio del traffico Web con Python, Flask, SQLite e Pusher
Se hai un'applicazione web in esecuzione su Internet, dovrai sapere da dove provengono i tuoi visitatori, i sistemi che stanno utilizzando e altre cose del genere.

Sebbene tu possa utilizzare servizi come Google Analytics, Monster Insights, ecc., è più divertente costruire un sistema di monitoraggio utilizzando Python, database SQL e Pusher per gli aggiornamenti dei dati in tempo reale.

Nel tutorial di oggi, esamineremo come creare uno strumento del genere utilizzando Python, Flask e Pusher. Il tutorial è uno spin-off altamente personalizzato da un tutorial pubblicato sulla pagina ufficiale di Pusher.

Requisiti

Per questa build, dovrai sapere come lavorare con il linguaggio di programmazione Python, lo sviluppo web semplice e le API.

Requisiti di installazione

Inizia installando Python sul tuo sistema. Dovrai anche installare Pusher e Flask, httpagentparser.

Creazione del database

Il primo passo è creare un database in cui sono archiviati i dati. Per Python, sqlite3 viene fornito di default e utilizzarlo è semplice. Crea un file chiamato database.py e inserisci il codice qui sotto:

import sqlite3
da errore di importazione sqlite3
def create_connection(database):
provare:
conn = sqlite3.Collegare(
database, isolamento_level=Nessuno, check_same_thread=False)
connessione.row_factory = lambda c, r: dict(
zip([col[0] per col in c.descrizione], r))
ritorno conn
tranne Errore come e:
stampa(e)
def create_table(c, sql):
c.eseguire (sql)
def update_or_create_page(c, data):
sql = "SELECT * FROM pagine dove name=? e sessione=?"
c.esegui(sql, dati[:-1])
risultato = c.fetchone()
se risultato == Nessuno:
create_pages(c, dati)
altro:
stampa (risultato)
update_pages(c, risultato['id'])
def create_pages(c, data):
stampa (dati)
sql = "INSERT INTO pages(name,session,first_visited)
VALORI (?,?,?)"
c.eseguire (sql, dati)
def update_pages(c, pageId):
print(IDpagina)
sql = "AGGIORNA pagine
SET visite = visite+1
DOVE id = ?"
c.esegui (sql, [pageId])
def create_session(c, data):
sql = "INSERT INTO session (ip, continente, country, city, os, browser, session, created_at)
VALORI (?,?,?,?,?,?,?,?)"
c.eseguire (sql, dati)
def select_all_sessions(c):
sql = "SELEZIONA * DA sessioni"
c.eseguire (sql)
righe = c.recupera()
restituire righe row
def select_all_pages(c):
sql = "SELEZIONA * DA pagine"
c.eseguire (sql)
righe = c.recupera()
restituire righe
def select_all_user_visits(c, session_id):
sql = "SELECT * FROM pagine dove sessione =?"
c.eseguire (sql, [session_id])
righe = c.recupera()
restituire righe row
def principale():
banca dati = "./pythonsqlite.db"
sql_create_pages = """
CREA TABELLA SE NON ESISTE pagine (
ID intero CHIAVE PRIMARIA,
nome varchar(225) NOT NULL,
sessione varchar(255) NOT NULL,
first_visited datetime NOT NULL,
visite intero NOT NULL Predefinito 1
);
"""
sql_create_session = """
CREA TABELLA SE NON ESISTE sessioni (
ID intero CHIAVE PRIMARIA,
ip varchar(225) NOT NULL,
continente varchar(225) NOT NULL,
paese varchar(225) NOT NULL,
città varchar(225) NOT NULL,
os varchar(225) NOT NULL,
browser varchar(225) NOT NULL,
sessione varchar(225) NOT NULL,
create_at datetime NOT NULL
);
"""
# crea una connessione al database
conn = create_connection(database)
se conn non è Nessuno:
# crea tabelle
create_table(conn, sql_create_pages)
create_table(conn, sql_create_session)
print("Connessione stabilita!")
altro:
print("Impossibile stabilire la connessione")
if __name__ == '__main__':
principale()

Salva il file ed esegui lo script per creare il database con i dati rilevanti.

database pitone.pi
"Connessione stabilita!"

Quindi, vai su pusher e crea un account. Quindi, crea un'applicazione e segui la procedura guidata per configurare l'app. Una volta completato, copia le chiavi dell'app e memorizzale in un dizionario Python come mostrato di seguito.

spintore = spintore(
app_id = "1079412",
chiave = "e5d266a24f3502d2b814",
segreto = "bab634d2398eb5fcb0f8",
cluster = "us2")

Infine, crea un'applicazione flask e crea il backend come mostrato nel codice seguente:

from flask import Flask, render_template, request, session, jsonify
import urllib.richiesta
da pusher import Pusher
da datetime import datetime
import httpagentparser
import json
importare il sistema operativo
importa hashlib
dal database import create_connection, create_session, update_or_create_page, select_all_sessions, select_all_user_visits, select_all_pages
app = Flask(__name__)
app.secret_key = os.casualità(24)
# configura l'oggetto pusher
spintore = spintore(
app_id = "1079412",
chiave = "e5d266a24f3502d2b814",
segreto = "bab634d2398eb5fcb0f8",
cluster = "us2")
banca dati = "./pythonsqlite.db"
conn = create_connection(database)
c = conn.cursore()
userOS = Nessuno
userIP = Nessuno
userCity = Nessuno
userBrowser = Nessuno
userCountry = Nessuno
userContinent = Nessuno
IDsessione = Nessuno
def principale():
connessione globale, c
def parseVisitor(data):
update_or_create_page(c, data)
spintore.trigger(u'pageview', u'new',
u'page': data[0],
u'session': IDsessione,
u'ip': userIP
)
spintore.trigger(u'numbers', u'update',
u'page': data[0],
u'session': IDsessione,
u'ip': userIP
)
@app.prima_richiesta
def getAnalyticsData():
userOS globale, userBrowser, userIP, userContinent, userCity, userCountry, sessionID
userInfo = httpagentparser.rilevare (richiesta).intestazioni.get('User-Agent'))
userOS = userInfo['platform']['name']
userBrowser = userInfo['browser']['name']
userIP = "196.207.130.148" su richiesta.remote_addr == '127.0.0.1' altra richiesta.ind_remoto
api = "https://www.iplocare.io/api/lookup/" + userIP
provare:
risp = urllib.richiesta.urlopen(api)
risultato = risp.leggere()
risultato = json.carichi (risultato.decodifica("utf-8"))
userPaese = risultato["paese"]
userContinent = risultato["continente"]
userCity = risultato["città"]
tranne:
print("Impossibile trovare: ", IPutente)
getSession()
def getSession():
ID sessione globale
ora = data e ora.adesso().sostituisci(microsecondo=0)
se 'utente' non è in sessione:
righe = (str(time)+userIP).codifica('utf-8')
session['user'] = hashlib.md5 (linee).esadecimale()
IDsessione = sessione['utente']
spintore.trigger(u'session', u'new',
u'ip': userIP,
u'continent': userContinent,
u'paese': userCountry,
u'city': userCity,
u'os': userOS,
u'browser': userBrowser,
u'session': IDsessione,
u'time': str(time),
)
data = [userIP, userContinent, userCountry,
userCity, userOS, userBrowser, ID sessione, ora]
create_session(c, dati)
altro:
IDsessione = sessione['utente']
@app.itinerario('/')
def indice():
data = ['home', IDsessione, str(datetime.adesso().sostituisci(microsecondo=0))]
parseVisitor (dati)
return f'Dati utente: data'
@app.route('/get-all-sessions')
def get_all_sessions():
dati = []
dbRows = select_all_sessions(c)
per riga in dbRows:
dati.aggiungere(
'ip': riga['ip'],
'continente': riga['continente'],
'paese': riga['paese'],
'città': riga['città'],
'os': riga['os'],
'browser': riga['browser'],
'sessione': riga['sessione'],
'ora': riga['creato_alle']
)
restituire jsonify (dati)
if __name__ == '__main__':
principale()
app.run(debug=True)

Una volta completato, esegui l'app utilizzando il comando flask run e vai a 127.0.0.1:5000/ Questo dovrebbe registrare l'utente, le informazioni sulla sessione dell'indirizzo IP specifico incluso Agente (browser), Paese e simili.

Per visualizzare tutta la sessione registrata, vai a 127.0.0.1:5000/ottieni tutte le sessioni.

[

"browser": "Chrome",
"città": "New York",
"continente": "Nord America",
"paese": "Stati Uniti",
"ip":"192.148.18.103",
"os": "Linux",
"sessione": "9a5d6a84d93ad62a599293acb2e751a1",
"tempo":"2021-01-13 02:52:32"
,

"browser": "Mozilla",
"città": "Oregon",
"continente": "Nord America",
"paese": "Stati Uniti",
"ip": "66.115.149.229",
"os": "Windows",
"sessione": "64d205c98c839e1d346c733ffd41b27f",
"tempo":"2021-01-13 02:54:12"
,

"browser": "Chrome",
"city": "Ogden",
"continente": "Nord America",
"paese": "Stati Uniti",
"ip": "172.231.59.124",
"os": "Windows",
"sessione": "3fd564c16a32b5139a8dd0578e36aded",
"tempo":"2021-01-13 02:54:37"
,

"browser": "Chrome",
"città": "New York",
"continente": "Nord America",
"paese": "Stati Uniti",
"ip": "72.229.28.185",
"os": "Windows",
"sessione": "27ad92271023888427da216de10a7cae",
"tempo":"2021-01-13 02:55:07"
,

"browser": "Chrome",
"città": "Nairobi",
"continente": "Africa",
"paese": "Kenia",
"ip": "196.207.130.148",
"os": "Linux",
"sessione": "c92cdab9eefa2fe121d49264986e7345",
"tempo":"2021-01-13 02:56:43"
,

"browser": "Chrome",
"città": "Nairobi",
"continente": "Africa",
"paese": "Kenia",
"ip": "196.207.130.148",
"os": "Windows",
"sessione": "31ee28ec6a655e0fa13be4dba8c13861",
"tempo":"2021-01-13 03:11:49"

]

Con l'app in esecuzione, puoi modificare casualmente il tuo indirizzo IP e i browser per raccogliere informazioni sufficienti per il tuo database. Utilizzando i dati raccolti, puoi utilizzare strumenti di dati come lo stack ELK per visualizzarlo e vedere quali posizioni e browser visitano l'applicazione di più.

Quello che segue è un esempio di visualizzazione dei dati raccolti dall'app sopra.

Conclusione

In questo tutorial, abbiamo utilizzato Python, SQLite e Pusher per raccogliere informazioni sugli utenti che visitano il sito Web e quindi abbiamo utilizzato i dati per creare visualizzazioni.

Per semplificare le cose, ho limitato l'output dell'app a console e JSON per accogliere coloro che non hanno lavorato con il modello jinja di Flask.

Questa semplice app è aperta all'espansione in uno strumento di analisi web completo. Considera le risorse di seguito per ulteriori conoscenze:

Come modificare le impostazioni del mouse e del touchpad utilizzando Xinput in Linux
La maggior parte delle distribuzioni Linux viene fornita con la libreria "libinput" per impostazione predefinita per gestire gli eventi di input su un...
Rimappa i pulsanti del mouse in modo diverso per software diversi con X-Mouse Button Control
Forse hai bisogno di uno strumento che possa cambiare il controllo del tuo mouse con ogni applicazione che utilizzi. In questo caso, puoi provare un'a...
Recensione del mouse wireless Microsoft Sculpt Touch
Ho letto di recente del Microsoft Scolpisci il tocco mouse wireless e ho deciso di acquistarlo. Dopo averlo usato per un po', ho deciso di condividere...