/v1 în Power BI. Acesta acoperă
modelul de conectivitate Power Query (M), un model semantic de tip star-schema construit
pe /v1/activities, reîmprospătarea incrementală și situațiile în care se utilizează seturile de date
reporting în variantă preliminară pentru rezultatele de phishing la nivel de persoană.
Exemplele utilizează gazda de producție din SUA
(https://api.us-east-1.livingsecurity.ai/v1). Pentru o organizație din UE, utilizați
https://api.eu-west-1.livingsecurity.ai/v1 atât în Fn_FetchAll, cât și în
Fn_GetJson, apoi asociați credențialul sursei de date cu această gazdă. Consultați
Regiuni.
Acest ghid utilizează credențiale Basic stocate, cu o cheie API. Nu aveți nevoie de un client
OAuth. Consultați Autentificare pentru
opțiunile de credențiale și Developer Hub
pentru acces și configurare.
Scopul acestui exemplu
Utilizați-l atunci când trebuie să:- Încărcați endpoint-urile de listare
/v1într-un set de date Power BI, cu paginare corectă prin cursor și reîncercare în caz de depășire a limitei de rată. - Construiți un model semantic în care măsurile („entități active”, „activități per entitate activă”) sunt dimensionale, nu calculate dintr-un tabel plat.
- Reduceți o reîmprospătare programată Power BI de la parcurgerea completă a istoricului la o fereastră zilnică mică, folosind reîmprospătarea incrementală.
- Alegeți granularitatea corectă pentru phishing: totaluri la nivel de campanie (operațional) față de rezultate la nivel de persoană și evenimente tipizate (reporting, variantă preliminară).
Cerințe preliminare
- O cheie API cu permisiunile necesare interogărilor dumneavoastră:
- Exemplul operațional:
activity:read,entity:readșisimulation:read. - Phishing la nivel de persoană prin seturi de date de raportare:
reporting:read. Consultați Chei API.
- Exemplul operațional:
- Power BI Desktop sau un spațiu de lucru Power BI / Fabric în care puteți crea un model semantic și programa reîmprospătarea.
Alegeți granularitatea potrivită
/v1 expune două suprafețe conexe pentru phishing. Acestea nu sunt interschimbabile.
Interogările de exemplu Power BI de mai jos apelează rutele operaționale
(
/v1/simulations, /v1/simulations/{id}/results, /v1/activities,
/v1/entities). Pentru raportarea phishing la nivel de persoană, preferați familia
reporting în variantă preliminară de mai jos. O cheie căreia i s-a acordat doar reporting:read nu poate
apela /v1/simulation_results operațional (API-ul returnează 403).
Scala de dificultate
Dificultatea simulării este un număr întreg de la 1 la 5 pe/v1/simulations (difficulty_level),
/v1/simulation_results (difficulty_level), proprietățile /v1/activities
(difficulty_tier) și /v1/reporting/simulation_events (difficulty_tier).
1 este cel mai ușor nivel, iar 5 este cel mai dificil. Simulările adaptive și progresive nu au
o valoare unică la nivel de campanie, deci /v1/simulations.difficulty_level este null,
în timp ce difficulty_level per destinatar din rezultate poate fi totuși setat. Pentru a face corespondența cu
exporturile vechi de tip scăzut/mediu/ridicat, tratați 1–2 ca scăzut, 3 ca mediu și 4–5 ca
ridicat.
Model de conectivitate (Power Query)
Patru reguli stau la baza fiecărei interogări din exemplu. Fiecare dintre ele este impusă de serviciul Power BI, nu de preferințe de stil.Păstrați URL-ul de bază Web.Contents static și încheiați-l la /v1
Păstrați URL-ul de bază Web.Contents static și încheiați-l la /v1
Puneți tot ce este dinamic în
RelativePath și Query. Primul argument al
Web.Contents trebuie să fie un șir literal care se încheie la rădăcina /v1
regională a organizației:- SUA:
https://api.us-east-1.livingsecurity.ai/v1 - UE:
https://api.eu-west-1.livingsecurity.ai/v1
"simulations", nu
"v1/simulations"). Nu lipiți o gazdă din SUA pentru o organizație din UE.Dacă primul argument este construit prin concatenare de șiruri, serviciul Power BI
nu poate identifica static sursa de date, iar reîmprospătarea programată eșuează cu
o eroare de „sursă de date dinamică”, chiar dacă interogarea funcționează în Power BI
Desktop.Furnizați cheia API ca un credențial Basic stocat, nu în textul interogării
Furnizați cheia API ca un credențial Basic stocat, nu în textul interogării
Când Power BI solicită credențiale pentru sursa de date
/v1, alegeți
Basic și lipiți cheia API ca nume de utilizator. Introduceți un substituent
precum x în câmpul Parolă. Serviciul Power BI respinge o
parolă necompletată, chiar dacă API-ul ignoră acest câmp. Cheia ca parolă, cu un nume
de utilizator substituent, funcționează de asemenea.Nu adăugați un antet Authorization în M. Funcționează pe desktopul dumneavoastră, apoi
încorporează cheia în fișierul interogării și intră în conflict cu reîmprospătarea programată.Lăsați să ruleze testul de conexiune din caseta de dialog a credențialelor
Lăsați să ruleze testul de conexiune din caseta de dialog a credențialelor
GET /v1 este autentificat: returnează 200 cu o cheie validă și 401
fără una. Indicați sursa de date către …/v1 și nu omiteți testul —
o cheie bună se salvează, una revocată sau malformată eșuează imediat.Exemplele mai vechi utilizau gazda simplă ca sursă de date și indicau omiterea testului
deoarece GET / este întotdeauna 404. Reorientați acele modele către …/v1.Setați explicit limit=500 pentru fiecare interogare de listare
Setați explicit limit=500 pentru fiecare interogare de listare
Dimensiunea implicită a paginii pentru fiecare endpoint de listare
/v1 este 25. Lăsarea valorii
implicite multiplică numărul de solicitări pentru aceleași date. Valorile interogării trebuie să fie text —
limit = "500" în M, nu limit = 500.Funcția comună de paginare
Fiecare interogare din exemplu apelează o singurăFn_FetchAll care parcurge
next_page_token până când acesta este null (consultați
paginare). Proprietățile sale notabile:
- URL de bază
/v1static,RelativePathșiQuerydinamice. Necesar pentru reîmprospătarea programată și pentru testul credențialelor. ManualStatusHandling = {429}cu reîncercare limitată. Funcția citeșteRetry-Aftercând Power Query o expune, altfel așteaptă 30 de secunde și renunță după 5 răspunsuri429consecutive, cu o eroare explicită, în loc să intre în buclă până la expirarea reîmprospătării.5xxnu este reîncercat în mod deliberat — o eroare de server trebuie să fie vizibilă, nu să producă în tăcere un set de date parțial.Timeoutde 60 de secunde. Paginile răspund de obicei în mult mai puțin de o secundă, deci un minut de tăcere înseamnă că solicitarea este moartă.Binary.Bufferînainte deJson.Document. Fără buffering, motorul mashup poate solicita din nou fluxul de răspuns dacă îl citește de mai multe ori.baseQueryeste transmis neschimbat la fiecare iterație. Token-urile de pagină sunt cursoare opace, semnate, legate de organizație, credențial, versiunea contractului și amprenta filtrelor și a sortării. Modificarea unui filtru în timpul parcurgerii este respinsă ca token nevalid, în loc să fie reluată de la prima pagină.
Fn_FetchAll.pq — base and call shape
Interogări tipizate per endpoint
Fiecare consumator alFn_FetchAll urmează aceeași structură: apelează endpoint-ul,
proiectează o listă fixă de coloane, elimină discriminatorul object și tipizează
marcajele temporale ca datetimezone, astfel încât măsurile de dată să nu se deplaseze în tăcere în funcție de
fusul orar al capacității de reîmprospătare.
Excel
Același Power Query (M) rulează în Get & Transform din Excel — este același motor ca în Power BI Desktop. Utilizați această variantă când doriți un tabel într-o foaie de lucru în loc de un model semantic. În Excel pentru Windows (Microsoft 365, Excel 2024, 2021, 2019 sau 2016):- Data → Get Data → From Other Sources → Blank Query.
- În Power Query Editor, Home → Editor avansat. Lipiți mai întâi
Fn_FetchAll, apoi redenumiți interogarea respectivăFn_FetchAll(Query Settings → Name sau clic dreapta în panoul Queries → Rename). - Repetați pentru
Fn_GetJson, apoi pentru fiecare interogare de raport. - Home → Close & Load → Close & Load To… deschide caseta de dialog Import Data.
Alegeți Only Create Connection pentru
Fn_FetchAllșiFn_GetJson(sunt funcții, nu tabele). Alegeți Table pentru fiecare interogare de raport pe care o doriți într-o foaie de lucru. - La prima reîmprospătare, alegeți Basic: cheia API ca User name, un
substituent precum
xca Password. Excel stochează un singur credențial per URL de sursă de date; interogările ulterioare care accesează aceeași gazdă/v1îl reutilizează.
Close & Load To… poate fi inactiv prima dată când creați o interogare într-un
registru de lucru. Utilizați Close & Load, apoi în Excel selectați Data →
Queries & Connections, faceți clic dreapta pe interogare și alegeți Load To.
Această cale este documentată de Microsoft pentru acest caz.
Living-Security-Version din Power Query pe o sursă
autentificată — aceeași restricție ca în Power BI. Fixați contul de serviciu sau transmiteți api_version în înregistrarea interogării. Consultați
Versiunile contractului și credențialele stocate.
Interogări de raport gata de utilizare (corespondențe de coloane și diferențe față de un
export al unui furnizor anterior):
Conformitate per persoană
Înscrieri la Instruire la granularitate persoană × atribuire.
Jurnal phishing prin e-mail
Interacțiuni de phishing la nivel de eveniment, ultimele 12 luni.
Cei mai vulnerabili utilizatori
Sinteză per persoană pe 12 luni a clicurilor, credențialelor și raportărilor.
Seturi de date de raportare în variantă preliminară (phishing per persoană)
Familia de raportare în variantă preliminară oferă seturi de date pentru phishing per persoană. Necesităreporting:read și acces la raportare pentru organizația dumneavoastră.
Utilizați catalogul de seturi de date de mai jos pentru a inspecta schemele și politicile de date.
Descoperiți catalogul live:
simulation_results
- Cale:
GET /v1/reporting/simulation_results - Granularitate: entitate × simulare
- Filtre:
simulation,entity,updated_after, pluslimit/page_token - Obiect wire:
reporting.simulation_result - Chei de asociere:
entity_id,simulation_id
ReportingSimulationResults.pq (sketch)
updated_after ca limită inferioară inclusivă a filigranului când reîmprospătați
partițiile recente. Dimensiunile modificabile ale rezultatelor se actualizează pe loc sub același id.
simulation_events
- Cale:
GET /v1/reporting/simulation_events - Granularitate: un fapt tipizat per interacțiune observată
- Filtre:
simulation,entity,event_type,occurred_after, pluslimit/page_token - Obiect wire:
reporting.simulation_event - Tipuri de evenimente: token-uri publice închise, precum
simulation.delivered,simulation.opened,simulation.link_clicked,simulation.credentials_submitted,simulation.reported— nu tipuri brute de activitate ClickHousephishing.simulation.* - Dispozitiv:
device_typeeste clasa derivată (token-urile observate includdesktop,mobile,tablet,unknown).user_agentbrut nu se află pe/v1. IP-ul brut nu se află niciodată pe/v1(nu este niciodată persistat; doarip_hashcu salt).
ReportingSimulationEvents.pq (sketch)
occurred_after pentru încărcări incrementale de evenimente. Faptele sunt doar de tip append;
sosirile întârziate sunt rânduri noi.
entities
- Cale:
GET /v1/reporting/entities - Granularitate: un rând curent per entitate
- Filtre:
type,updated_after, pluslimit/page_token - Obiect wire:
reporting.entity - Cheie de asociere:
id/entity_id(aceeași valoare)
reporting.simulation_results.entity_id = reporting.entities.id.
GET /v1/entities operațional rămâne pe entity:read și reprezintă o
permisiune diferită.
ReportingEntities.pq
entity_versions și cohort_memberships
Aceste două seturi de date au o excepție denumită, limitată la starea curentă:Nu există un tabel autoritar cu istoricul versiunilor sau al apartenențelor. Acest set de date proiectează rândul curent ca un singur interval deschis (valid_toeste null,is_currenteste true).valid_fromestecreated_atsau, în caz contrar,updated_atpentru versiunile entităților și momentul observării solicitării pentru apartenențele la Cohortă. Intervalele istorice închise nu sunt fabricate.
- entity_versions:
GET /v1/reporting/entity_versions. Aceleași filtre ca entities.valid_fromestecreated_atsau, în caz contrar,updated_at. O entitate cu ambele marcaje temporale null este omisă. - cohort_memberships:
GET /v1/reporting/cohort_memberships. Filtre:cohort,entity,updated_after.updated_ateste ultima actualizare a Cohortei, astfel încât reîmprospătarea incrementală să rămână corectă.valid_fromeste momentul observării solicitării. Asociațientity_idcureporting.entities.id.
ReportingEntityVersions.pq
ReportingCohortMemberships.pq
Model semantic star-schema pe /v1/activities
/v1/activities este fluxul de evenimente cu marcaj temporal al organizației. Nu are
măsuri numerice — fiecare cantitate dintr-un raport este un număr de rânduri — ceea ce face ca
o schemă stea să fie o potrivire naturală.
Activitieseste faptul de eveniment la granularitatea reală. Un rând per activitate. Participanții sunt eliminați de aici și reconstruiți ca tabel propriu.ActivityParticipantsexistă deoarece participanții sunt cu adevărat de tip unu-la-mulți, cu roluri precumactorșitarget. Aplatizarea peActivitiesar duplica rândurile de activitate (umflând fiecare număr) sau ar elimina participanții suplimentari. Relația cuActivitieseste singura relație bidirecțională a modelului, astfel încât un slicer de entitate ajunge la tabelul de fapte.Entitieseste dimensiunea care denumește participanții. Rândurile de participanți dintr-o activitate conținentity_idși un rol, dar nu un nume afișat.Dateseste generat în M (zero apeluri API) și marcat ca tabel de date al modelului. Aceasta face legale funcțiile DAX de inteligență temporală (DATESINPERIOD,DATEADD). Coloanele cu numele lunii și al zilei săptămânii declarăsortByColumnpe omoloagele lor numerice, astfel încât vizualizările să nu sorteze lunile alfabetic.
discourageImplicitMeasures): total
activități, entități active, activități per entitate activă, zile cu activitate
și o medie zilnică glisantă pe 7 zile.
Structura tabelului de legătură
ActivityParticipants parcurge /v1/activities și expandează matricea participants
la câte un rând per participant:
ActivityParticipants.pq
ActivityParticipants parcurge /v1/activities independent, în loc să
facă referire la interogarea Activities. În Power BI, două interogări încărcate ca două
tabele își aduc fiecare datele independent la momentul reîmprospătării. Menținerea lor independente
permite serviciului să reîmprospăteze în paralel partițiile ambelor tabele.
Reîmprospătare incrementală
Ambele tabele la granularitate de fapt (Activities și ActivityParticipants) declară o
politică de reîmprospătare incrementală Power BI: păstrarea a 5 ani de partiții anuale,
reimportarea ultimelor 14 zile la fiecare reîmprospătare.
Mecanismul este o pereche de parametri DateTime, RangeStart și RangeEnd,
pe care serviciul Power BI îi reatribuie per partiție la momentul reîmprospătării. Fiecare interogare de fapte
integrează acești parametri în filtrele start_date și end_date
ale API-ului, astfel încât volumul de solicitări la nivel de partiție este proporțional cu partiția,
nu cu întregul istoric. Interogarea lărgește fereastra API cu un minut pe fiecare
parte și reaplică local limita exactă semideschisă [RangeStart, RangeEnd),
astfel încât corectitudinea partiției nu depinde de faptul că serverul
tratează limitele ca inclusive sau exclusive.
Activities.pq — the fold that makes incremental refresh work
Fereastra de 14 zile este generoasă în mod deliberat. Ingestia activităților nu este
de tip append-only-la-momentul-curent: completările retroactive ale conectorilor aduc evenimente cu marcaje temporale din trecut.
O fereastră de 1-2 zile le-ar pierde definitiv.
Extinderea ferestrei de reîmprospătare în API
GET /v1/activities acceptă filtrele start_date și end_date în care
se integrează parametrii Power BI, filtrând event_ts între limite.
Entities este o dimensiune, așa că acest exemplu o reîmprospătează integral de fiecare dată,
nu incremental.
Seturile de date de raportare utilizează propriile filigrane (updated_after,
occurred_after) în locul ferestrei de date a activităților.
Limite de rată în timpul reîmprospătării
/v1 aplică bugete separate per cheie și per IP (consultați
limite de rată). Respectați 429 + Retry-After; nu
codificați un buget de solicitări direct în model. Două proprietăți ale reîmprospătărilor Power BI
sunt importante:
- Parcurgerea unui singur tabel este secvențială. Fiecare solicitare de pagină necesită token-ul paginii anterioare, deci un tabel este limitat de latență indiferent de dimensiunea paginii.
- Reîmprospătările concurente ale tabelelor se multiplică. Mai multe tabele mari reîmprospătate
în paralel reprezintă cazul care atinge plafonul, motiv pentru care calea de reîncercare
429 din
Fn_FetchAllcontează. Preferați mai puține tabele în paralel, în loc să presupuneți o concurență nelimitată.
Versiunile contractului și credențialele stocate
/v1 acceptă un antet de solicitare Living-Security-Version pentru a fixa o versiune publicată a
contractului (consultați Ghid rapid API). Power
Query nu poate trimite acel antet când sursa de date utilizează credențiale stocate —
doar sursele de date anonime permit antete personalizate. Adăugarea lui face ca o reîmprospătare să eșueze cu:
contract_version fixată a contului de serviciu
sau cea mai recentă versiune publicată dacă nu este setată nicio fixare.
Confirmați versiunea contractului contului cu administratorul API înainte de
a publica o reîmprospătare. Consultați jurnalul de modificări API pentru
versiunile acceptate.
Dacă o reîmprospătare începe să se comporte neașteptat, inspectați antetul de răspuns al API-ului
Living-Security-Version pentru a vedea ce contract a
servit efectiv solicitarea.
Reîmprospătați și verificați modelul
Publicați modelul semantic în spațiul de lucru Power BI, asociați credențialul său stocat cu sursa regională/v1 și rulați o reîmprospătare înainte de a activa o
programare. Examinați istoricul reîmprospătărilor pentru eșecuri sau citiri incomplete.
Verificați numărul de rânduri față de o citire API independentă, folosind aceleași filtre.
Ghidul de paginare include exemple Python și cURL
pentru citirea unui set complet de rezultate. O reîmprospătare care citește doar
prima pagină poate părea reușită pe un set de date mic; comparați numerele înainte de
a vă baza pe raport.
Alegeri de modelare
- Totalurile campaniei și rezultatele per persoană au granularități diferite.
SimulationResultsapeleazăGET /v1/simulations/{id}/results(un GET per rulare). Pentru phishing per persoană, adăugați interogări pentruGET /v1/reporting/simulation_resultsșiGET /v1/reporting/simulation_events(sauGET /v1/simulation_resultsoperațional, dacă dețineți dejasimulation:read). vectorspe/v1/simulationseste aplatizat într-un șir separat prin virgulă. O coloană de tip listă nu poate fi utilizată ca dimensiune reală într-un slicer. Dacă o pagină de raport trebuie să filtreze după vector, adăugați un tabel de legătură simulare-vector.
Pașii următori
Developer Hub
Creați un cont de serviciu și o cheie API pentru Power BI.
Ghid rapid API
Autentificați solicitările
/v1 cu autentificare Basic.Paginare
Envelope-ul listei, token-urile cursor și stabilitatea filtrelor pe durata unei parcurgeri.
Limite de rată
Bugete per cheie și per IP, contractul 429 și recomandări de reîncercare.

