Reading time: 4 minutes
28
28
[!tldr] 28 TLDR Cloudflare skriptas puslapių peržiūrų statistikai
Cloudflare skriptas puslapių peržiūrų statistikai
Main Script
Tai pagrindinis Cloudflare skriptas pritaikytas veikti su visais artefaktas.eu subdomenais naudojant wildcard’ą :luc_asterisk:artefaktas.eu/ :luc_asterisk:.
Veikimo principas:
- Vartotojo naršyklė atlieka užklausą ir kreipiasi viena ar kita URL nuoroda
- Cloudflare skriptas atlieka Middleware (tarpininkavimo) funkciją
- Pirminė užklausa yra klonuojama
- Iš pirminės užklausos suformuojama pilna URL nuoroda
- URL nuoroda perduodama secondary request metodui
- Cloudflare D1 duomenų bazėje registruojami nauji, vartotojo neidentifikuojantys duomenys (nuoroda, pirminis arba inkrementuotas peržiūrų skaičius)
- Grąžinama pirminės užklausos atsako kopija
Būtina:
- Pririšti (Bind) api skriptą prie pagrindinio (Main) ir suteikti kokį nors kintamojo vardą (Kitu atveju nebus leista atlikti užklausų iš vieno skripto į kitą)
- Susikurti D1 duomenų bazę: (duomenų bazė - viewcount_database, lentelė - viewcounts, naudojami laukeliai - url, viewcount)
- Atitinkamai sukonfigūtuoti .toml nustatymų failus
- Atitinkamai susitvarkyti kodą, nes čia tik prototipas 😃
// src/index.js
async function secondary_request(passed_req, passed_api_url, passed_url, env) {
const req_headers = {
headers: {
"User-Agent": "artefaktasbot",
passedUrl: passed_url
}
};
await fetch(passed_api_url, req_headers);
}
async function handleRequest(request, env) {
const request_clone = request.clone();
const { url } = request.url;
try{
const pass_url = new URL(url);
await secondary_request(request, "https://myapiurl.eu/api", pass_url, env);
const original_response = await fetch(request)
let response = new Response(original_response.body, {
headers: original_response.headers,
});
return response
}
catch(e){
const original_response = await fetch(request)
let response = new Response(original_response.body, {
headers: original_response.headers,
});
return response
}
}
var src_default = {
async fetch(request, env) {
return await handleRequest(request, env).catch((err) => new Response(err.stack, { status: 500 }));
}
};
export {
src_default as default
};
//# sourceMappingURL=index.js.map
API Script (React komponentams)
Tai API (aplikacinės programinės sąsajos kodas) skirtas grąžinti puslapio peržiūrų skaičių priklausomai nuo perduodamo parametro “passedUrl”.
Jei perduodamas parametras nėra tuščias “”, nėra lygus null ir turi domeno šaknį artefaktas.eu - vykdomas tolesnis patikrinimas ir grąžinama atitinkama reikšmė.
Keletas pastebėjimų
React komponentai atlieka preflight patikrinimus. Dėl šios priežasties tiesiog būtina leisti prieigą prie savo API šakninio kelio / ir užtikrinti atitinkamų atsako antraščių leidimus (OPTIONS, GET, User-Agent, passedUrl).
// src/worker.js
var worker_default = {
async fetch(request, env) {
const { pathname } = new URL(request.url);
let headers, key, viewcount;
switch (pathname) {
case "/":
const myHeaders = new Headers();
myHeaders.set("Accept-Control-Allow-Origin","*");
myHeaders.set("Access-Control-Allow-Headers","GET, OPTIONS, passedUrl, User-Agent")
const init = {
headers:myHeaders,
status:404
}
return new Response("Error", init);
case "/api":
const myapiHeaders = new Headers();
myapiHeaders.set("Accept-Control-Allow-Origin","*");
myapiHeaders.set("Access-Control-Allow-Headers","GET, OPTIONS, passedUrl, User-Agent")
const apiinit = {
headers:myapiHeaders,
status:200
}
headers = request.headers;
key = headers.get("passedUrl");
if(key && key!="" && key!="null"){
if(String(key).includes("artefaktas.eu")){
let consURL = new URL(key)
key = consURL.pathname;
let host_name = consURL.hostname;
if(!String(key).includes(".")){
const { results } = await env.DB.prepare("SELECT viewcount FROM viewcounts WHERE url = ?").bind(`${host_name}${key}`).all();
if (results && results!="null" && results!="") {
viewcount = parseInt(results[0]["viewcount"])
viewcount = viewcount + 1;
await env.DB.prepare("UPDATE viewcounts SET viewcount = ? WHERE url = ?").bind(viewcount, `${host_name}${key}`).all();
return new Response(JSON.stringify({ viewCount: viewcount }),apiinit);
} else {
await env.DB.prepare("INSERT INTO viewcounts (url, viewcount) VALUES (?1, ?2)").bind(`${host_name}${key}`, 1).all();
viewcount = 1
return new Response(JSON.stringify({ viewCount: viewcount }),apiinit);
}
}
}
else{
return new Response("Error", { status: 404 });
}
}
else{
const myapiHeaders = new Headers();
myapiHeaders.set("Accept-Control-Allow-Origin","*");
myapiHeaders.set("Access-Control-Allow-Headers","GET, OPTIONS, passedUrl, User-Agent")
const apiinit = {
headers:myapiHeaders,
status:200
}
return new Response("Error", apiinit);
}
default:
const errHeaders = new Headers();
errHeaders.set("Accept-Control-Allow-Origin","*");
errHeaders.set("Access-Control-Allow-Headers","GET, OPTIONS, passedUrl, User-Agent")
const errInit = {
headers:errHeaders,
status:200
}
return new Response("Error", errInit);
}
}
};
export {
worker_default as default
};
//# sourceMappingURL=worker.js.map
Inner Tags: #cloudflare #skriptas #puslapiu #perziuru #statistikai #galima #reklama #react #reactjs #kovas #du_tukstanciai_dvidesimt_ketvirtieji
Internal links if exist:
External links if exist:
Markdown external:
Visa pateikiama informacija - asmeninė autoriaus nuomonė. Kilus naiškumams rekomenduojama susisiekti elektroniniu paštu: admin@artefaktas.eu
Artefaktas.eu is licensed under CC BY-NC-ND 4.0