Digest OSS Hacker News: manuale completo + workflow n8n + script audio (riproducibile, MIT)
This commit is contained in:
commit
3bf557f92d
4 files changed
+1424
No files matched your search
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Scarica il JSON dell'ultimo digest RIUSCITO del workflow v3 e lo salva in latest-digest.json.
|
||||
Chiamato dal cronjob prima della narrazione. Include il testo dei README per la narrazione esaustiva."""
|
||||
import json, sys, urllib.request, urllib.error
|
||||
|
||||
C = json.load(open('/opt/data/hn-oss-digest/creds.json'))
|
||||
H = {'X-N8N-API-KEY': C['n8n_key']}
|
||||
BASE = 'https://n8n.as89.it/api/v1'
|
||||
WID = 'tZwGIY9rcdybQLPr'
|
||||
|
||||
def http(url):
|
||||
req = urllib.request.Request(url, headers=H)
|
||||
with urllib.request.urlopen(req, timeout=60) as r:
|
||||
return r.read().decode()
|
||||
|
||||
d = json.loads(http(f'{BASE}/executions?limit=10&status=success&workflowId={WID}'))
|
||||
data = d.get('data', [])
|
||||
if not data:
|
||||
print('NESSUNA ESECUZIONE RIUSCITA TROVATA')
|
||||
sys.exit(1)
|
||||
|
||||
eid = data[0]['id']
|
||||
x = json.loads(http(f'{BASE}/executions/{eid}?includeData=true'))
|
||||
rd = x['data']['resultData']['runData']
|
||||
sel = rd['Seleziona OSS'][0]['data']['main'][0][0]['json']
|
||||
|
||||
def node_json(node):
|
||||
"""Primo json di output non vuoto del nodo, o None."""
|
||||
runs = rd.get(node)
|
||||
if not runs:
|
||||
return None
|
||||
for conn in runs[0].get('data', {}).get('main', []):
|
||||
if conn:
|
||||
return conn[0].get('json')
|
||||
return None
|
||||
|
||||
g = node_json('Gemini riassume')
|
||||
src = 'Gemini riassume'
|
||||
if not g or 'candidates' not in g:
|
||||
g = node_json('Gemini lite (fallback)')
|
||||
src = 'Gemini lite (fallback)'
|
||||
if not g or 'candidates' not in g:
|
||||
print('NESSUN RIASSUNTO DISPONIBILE')
|
||||
sys.exit(1)
|
||||
print(f'sorgente riassunto: {src}')
|
||||
txt = g['candidates'][0]['content']['parts'][0]['text']
|
||||
dj = json.loads(txt)
|
||||
|
||||
# item originali (con il testo dei README) allegati alle sezioni finali
|
||||
readme_by_url = {it.get('url', ''): it.get('readme', '') for it in sel.get('items', [])}
|
||||
for k in ('show', 'repo', 'news'):
|
||||
for it in dj.get('sections', {}).get(k, []):
|
||||
it['readme'] = readme_by_url.get(it.get('url', ''), '')
|
||||
|
||||
out = {
|
||||
'executionId': eid,
|
||||
'count': sel.get('count'),
|
||||
'conReadme': sel.get('conReadme'),
|
||||
'sinceOld': sel.get('sinceOld'),
|
||||
'sinceNew': sel.get('sinceNew'),
|
||||
'geminiSource': src,
|
||||
'sections': dj.get('sections', {}),
|
||||
}
|
||||
with open('/opt/data/hn-oss-digest/latest-digest.json', 'w') as f:
|
||||
json.dump(out, f, ensure_ascii=False, indent=1)
|
||||
|
||||
tot = sum(len(out['sections'].get(k, [])) for k in ('show', 'repo', 'news'))
|
||||
conr = sum(1 for k in ('show', 'repo', 'news') for it in out['sections'].get(k, []) if it.get('readme'))
|
||||
print(f'exec {eid}: {tot} item salvati in latest-digest.json | README allegati: {conr}')
|
||||
Reference in new issue
Block a user