Permalänk
Medlem

API för svenska temadagar?

Hej, jag letar efter ett API som erbjuder data över svenska temdagar. T ex helgdagar så som skärtorsdagen och nationaldagen men även mindre officiella dagar som t ex kanelbullens dag. Jag har sökt och sökt och det bästa jag hittat hitintills är https://temadagar.se/kalender/ men de erbjuder inget API. Ett annat jag hittade var https://api.dryg.net/# men där saknas det "inofficiella" dagar så som kanelbullens dag. Dessutom finns det ingen licensinformation vilket jag behöver.

Någon annan på Sweclockers som stött på samma problem? Hur löste ni det?

Permalänk
Medlem

Jag gjorde min egen när jag prövade att förbättra en arbetsuppgift på gamla jobbet. Dem flest dagar har enkla regler vilket gör det otroligt lätt och snabbt att fixa. Sen beroende på vilket språk kan det redan finnas funktioner för dem flesta dagarna. Exempelvis PHP har ju för nästan alla.

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av Tekoppar:

Jag gjorde min egen när jag prövade att förbättra en arbetsuppgift på gamla jobbet. Dem flest dagar har enkla regler vilket gör det otroligt lätt och snabbt att fixa. Sen beroende på vilket språk kan det redan finnas funktioner för dem flesta dagarna. Exempelvis PHP har ju för nästan alla.

Skickades från m.sweclockers.com

Ah, kan egentligen använda ett npm paket jag hittade också, men den saknar också sådana här "skämt" dagar. Kanske får bli att sätta upp ett eget API för det.

Permalänk
Medlem
Skrivet av Baxtex:

Ah, kan egentligen använda ett npm paket jag hittade också, men den saknar också sådana här "skämt" dagar. Kanske får bli att sätta upp ett eget API för det.

Formatet på deras hemsida är ju rätt förutsägbart, så du kan ju bara scrapa ut infon därifrån. Jag skrev en node.js-app som exporterar till iCal-format så man kan importera det i sin kalenderklient, men det är ju bara att ändra till det format du vill ha.

const jsdom = require("jsdom"); const { JSDOM } = jsdom; const request = require("request"); const http = require("http"); const MONTH_MAP = { "januari": "1", "februari": "2", "mars": "3", "april": "4", "maj": "5", "juni": "6", "juli": "7", "augusti": "8", "september": "9", "oktober": "10", "november": "11", "december": "12" }; class Temadag { constructor(name, year, month, day) { this.name = name; this.year = year; this.month = month; this.day = day; } get icalArray() { return [ "BEGIN:VEVENT", `SUMMARY:${this.name}`, `DTSTART;VALUE=DATE:${this.year}${this.month.padStart(2, "0")}${this.day.padStart(2, "0")}`, "END:VEVENT" ]; } }; function getIcal(temadagar) { let ical = [ "BEGIN:VCALENDAR", "VERSION:2.0", "PRODID:-//LemonIllusion//Temadagar.se ICAL//SV" ]; for (let temadag of temadagar) { ical = ical.concat(temadag.icalArray); } ical = ical.concat([ "END:VCALENDAR" ]); return ical.join("\r\n"); } function getTemadagar(sendResponse) { console.log("Constructing response"); request({ url: "https://temadagar.se/kalender/", headers: { "User-Agent": "request" } }, function(error, response, body) { const { document } = (new JSDOM(body)).window; let temadagar = []; for (let yearh3 of document.querySelectorAll(".content h3")) { let year = yearh3.innerHTML.match(/\d+/)[0]; for (let dayb of yearh3.nextElementSibling.querySelectorAll("b")) { let match; if (match = dayb.innerHTML.match(/^(\d{1,2})\s([A-z]+)$/)) { let day = match[1]; let month = MONTH_MAP[match[2].toLowerCase()]; for (let nameEl = dayb.nextSibling.nextSibling; nameEl.nodeName !== "BR"; nameEl = nameEl.nextSibling.nextSibling) { let name; if (nameEl.nodeName === "A") { name = nameEl.innerHTML; } else { name = nameEl.textContent; } name = name.replace("*", ""); temadagar.push(new Temadag(name, year, month, day)); } } } } console.log("Sending response"); sendResponse(getIcal(temadagar)); }); } http.createServer(function(request, response){ console.log("Request recieved"); response.writeHead(200, {"Content-Type": "text/calendar"}); getTemadagar(function(ical){response.end(ical)}.bind(this)); }).listen(80);

Dold text
Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem
Skrivet av LemonIllusion:

Formatet på deras hemsida är ju rätt förutsägbart, så du kan ju bara scrapa ut infon därifrån. Jag skrev en node.js-app som exporterar till iCal-format så man kan importera det i sin kalenderklient, men det är ju bara att ändra till det format du vill ha.

const jsdom = require("jsdom"); const { JSDOM } = jsdom; const request = require("request"); const http = require("http"); const MONTH_MAP = { "januari": "1", "februari": "2", "mars": "3", "april": "4", "maj": "5", "juni": "6", "juli": "7", "augusti": "8", "september": "9", "oktober": "10", "november": "11", "december": "12" }; class Temadag { constructor(name, year, month, day) { this.name = name; this.year = year; this.month = month; this.day = day; } get icalArray() { return [ "BEGIN:VEVENT", `SUMMARY:${this.name}`, `DTSTART;VALUE=DATE:${this.year}${this.month.padStart(2, "0")}${this.day.padStart(2, "0")}`, "END:VEVENT" ]; } }; function getIcal(temadagar) { let ical = [ "BEGIN:VCALENDAR", "VERSION:2.0", "PRODID:-//LemonIllusion//Temadagar.se ICAL//SV" ]; for (let temadag of temadagar) { ical = ical.concat(temadag.icalArray); } ical = ical.concat([ "END:VCALENDAR" ]); return ical.join("\r\n"); } function getTemadagar(sendResponse) { console.log("Constructing response"); request({ url: "https://temadagar.se/kalender/", headers: { "User-Agent": "request" } }, function(error, response, body) { const { document } = (new JSDOM(body)).window; let temadagar = []; for (let yearh3 of document.querySelectorAll(".content h3")) { let year = yearh3.innerHTML.match(/\d+/)[0]; for (let dayb of yearh3.nextElementSibling.querySelectorAll("b")) { let match; if (match = dayb.innerHTML.match(/^(\d{1,2})\s([A-z]+)$/)) { let day = match[1]; let month = MONTH_MAP[match[2].toLowerCase()]; for (let nameEl = dayb.nextSibling.nextSibling; nameEl.nodeName !== "BR"; nameEl = nameEl.nextSibling.nextSibling) { let name; if (nameEl.nodeName === "A") { name = nameEl.innerHTML; } else { name = nameEl.textContent; } name = name.replace("*", ""); temadagar.push(new Temadag(name, year, month, day)); } } } } console.log("Sending response"); sendResponse(getIcal(temadagar)); }); } http.createServer(function(request, response){ console.log("Request recieved"); response.writeHead(200, {"Content-Type": "text/calendar"}); getTemadagar(function(ical){response.end(ical)}.bind(this)); }).listen(80);

Dold text

Japp, dock blir det väldigt shady då det är till en produkt för ett företag. Så har inga problem med att betala eller så men behöver ha tillåtelse/licens för att använda det kommersiellt liksom.

Permalänk
Medlem
Skrivet av Baxtex:

Japp, dock blir det väldigt shady då det är till en produkt för ett företag.

De erbjuder exakt samma tjänst själva för 50 kr, så om det är för något seriöst ändamål är det ju bara att köpa kalendern av dem. (om de tillåter kommersiell användning vill säga)

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem
Skrivet av LemonIllusion:

De erbjuder exakt samma tjänst själva för 50 kr, så om det är för något seriöst ändamål är det ju bara att köpa kalendern av dem.

Jo jag såg det. Tänkte mest se om det fanns något annat smidigare.