From fbb3d4eb1ae235020490a097a0f9242afe43678b Mon Sep 17 00:00:00 2001 From: teitoku Date: Mon, 28 Jul 2025 16:51:26 +0900 Subject: [PATCH] Create makefeed --- makefeed.py | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 makefeed.py diff --git a/makefeed.py b/makefeed.py new file mode 100644 index 0000000..a5d78cc --- /dev/null +++ b/makefeed.py @@ -0,0 +1,127 @@ +import os + +abspath = os.path.abspath(__file__) +dname = os.path.dirname(abspath) +os.chdir(dname) + +FEED_HEADER = """ + + +""" + +from time import strftime, gmtime +FEED_TITLE = """ +{} +https://firmereferendum.giustizia.it/referendum/open +{} +it-it +{} +makefeed.py +720 +https://www.rssboard.org/rss-specification + + https://serben.kantai.online/rsslogo.png + Fac-simile logo della repubblica italiana + https://firmereferendum.giustizia.it/referendum/open + +""".format( + "NON UFFICIALE - Ministero della Giustizia - Referendum e iniziative popolari", + "Aggiornamenti sui referendum ed iniziative popolari in fase di raccolta firme", + strftime("%a, %-d %h %Y %H:%m:%S %z", gmtime()) +) + +FEED_FOOTER = """ + + +""" + +# strftime("%a, %-d %h %Y %H:%m:%S %z", gmtime()) + +URL_API = "https://firmereferendum.giustizia.it/referendum/api-portal/iniziativa/public" +URL_INFO = "https://firmereferendum.giustizia.it/referendum/open/dettaglio-open/" +AGENT = "Mozilla/5.0 (Windows; Windows NT 10.2;; en-US) Gecko/20100101 Firefox/52.7" + +mesi = [ + "gennaio", "febbraio", "marzo", "aprile", + "magggio", "giugno", "luglio", "agosto", + "settembre", "ottobre", "novembre", "dicembre" +] + +def date2it(date): + date = date.split('-') + return f"{date[2]} {mesi[int(date[1])-1]} {date[0]}" + +def htmlescape(string): + return string.replace('<','<').replace('>','>').replace('&', '&') + +from datetime import datetime +from zoneinfo import ZoneInfo +def dataIns_to_iso(date, date_time): + time = date_time.split('T')[1] + tz = datetime.fromisoformat(date) + tz = tz.replace(tzinfo=ZoneInfo("Europe/Rome")) + tz = tz.utcoffset().total_seconds() / 3600 + + return_date = datetime.fromisoformat(date).strftime("%a, %-d %h %Y") + return_date += f" {time}" + return_date += f" {int(tz):+03}00" + return return_date + +def make_item(itemdata): + # Do not include current votes in card, only quorum, as it is supposed to be immutable + item_str = """ + + {} + {} + {} + {} + {} + + """ + title = itemdata['titolo'] + link = URL_INFO + str(itemdata['id']) + + insert_time = itemdata['dataIns'] + validity = f"Puoi firmare per questa iniziativa dal {date2it(itemdata['dataInizioRaccolta'])} al {date2it(itemdata['dataFineRaccolta'])}" + initiative_type = itemdata['idDecTipoIniziativa']['nome'] + text_description = itemdata['descrizione'] + pub_time = dataIns_to_iso(itemdata['dataGazzetta'], itemdata['dataIns']) + + website = '' + if 'sito' in itemdata: + itemdata['sito'] + website = f'
Sito dell\'iniziativa: {website}' + + description = f""" + {initiative_type}
+ {text_description}
+
+ {validity}
+ """ + + return item_str.format(title,link,link,pub_time,htmlescape(description)) + +import urllib.request, json + +if __name__ == "__main__": + print("Fetching data ...") + data = json.loads( + urllib.request.urlopen( + urllib.request.Request( + URL_API, + data=None, + headers={ 'User-Agent': AGENT } + ) + ).read().decode('utf-8') + ) + print("Fetch complete") + + if not data['resultDescription'] == "Successo": + print("Error in fetching information") + exit(1) + + with open('rss.xml', 'w') as file: + file.write(FEED_HEADER + FEED_TITLE) + for item in data['content']: + file.write(make_item(item)) + file.write(FEED_FOOTER)