Add PHP variant: no-cron, request-time feed generation for shared hosting

Same imio.smartweb JSON API as the Python script, but each feed regenerates
on demand (15 min file cache) instead of via cron, so it works on plain
PHP shared hosting with no server config access. Also adds facebook.php,
a caching proxy for the user's FetchRSS Atom feed so all three feeds live
under one domain and can be shared as stable URLs.

Tested with PHP 8.3 CLI: valid XML, real data (40 news, 12 events, proxied
Facebook feed).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
para
2026-09-25 22:05:26 +02:00
co-authored by Claude Sonnet 5
parent ecf9baaa4d
commit 8205bfdffc
7 changed files with 351 additions and 21 deletions
+47 -21
View File
@@ -1,23 +1,41 @@
# Flux RSS - Commune de Silly
Genere deux flux RSS 2.0 (actualites + agenda) pour la commune de Silly
(Belgique), a partir de l'API JSON REST (Plone / `imio.smartweb`) utilisee
par www.silly.be — sans navigateur headless.
Genere trois flux RSS/Atom pour la commune de Silly (Belgique) : actualites,
agenda et page Facebook. Deux implementations equivalentes sont fournies :
Voir [silly_rss.py](silly_rss.py) pour le detail technique (empreinte
Cloudflare, contrainte `b_size=20`, etc.).
- **[php/](php/)** — a deployer sur un hebergement PHP mutualise classique.
**Recommande** : aucun cron ni conf serveur a ecrire, chaque flux se
regenere a la demande (avec cache 15 min) des qu'un lecteur RSS l'interroge.
- **[silly_rss.py](silly_rss.py)** — script Python autonome a lancer via cron,
pour un serveur ou vous controlez le cron/nginx (ex. Yunohost).
## Utilisation manuelle
Les deux utilisent la meme source : l'API JSON REST (Plone / `imio.smartweb`)
que www.silly.be charge en JS via les balises `<smartweb-news>` /
`<smartweb-events>` — pas besoin de navigateur headless. Le detail technique
(empreinte Cloudflare, contrainte `b_size=20`) est commente dans
[php/common.php](php/common.php) et [silly_rss.py](silly_rss.py).
```bash
python3 silly_rss.py /chemin/de/sortie
```
## Option recommandee : PHP (hebergement perso)
Genere `actualites.xml` et `agenda.xml` dans le dossier indique (`.` par
defaut). Aucune dependance externe : Python 3.10+ (stdlib) et `curl`
(present par defaut sur Yunohost).
1. Copier tout le dossier [php/](php/) sur l'hebergement (FTP/SFTP), par ex.
dans `silly-rss/` a la racine du site.
2. Verifier que PHP a l'extension `curl` activee (quasi toujours le cas en
mutualise standard).
3. Le dossier `php/cache/` doit etre inscriptible par PHP (permissions par
defaut suffisent generalement sur du mutualise ; sinon `chmod 775`).
4. Les flux sont alors accessibles en :
- `https://votre-site/silly-rss/actualites.php`
- `https://votre-site/silly-rss/agenda.php`
- `https://votre-site/silly-rss/facebook.php` (proxy/cache du flux
[FetchRSS](https://fetchrss.com) de la page Facebook, pour avoir une
URL stable sur votre propre domaine)
5. Ajouter ces 3 URLs comme sources dans FreshRSS (Administration > Flux
RSS > Ajouter un flux).
## Deploiement sur Yunohost
Teste avec PHP 8.3 CLI : les 3 scripts produisent du XML valide avec de
vraies donnees (40 actualites, 12 evenements, flux Facebook proxifie).
## Option alternative : Python + cron (Yunohost)
1. **Dossier de sortie**
@@ -30,12 +48,15 @@ defaut). Aucune dependance externe : Python 3.10+ (stdlib) et `curl`
ligne a ajouter via `crontab -e` (execution toutes les heures).
3. **nginx** — voir [deploy/nginx-silly-rss.conf](deploy/nginx-silly-rss.conf),
a copier dans `/etc/nginx/conf.d/<votre-domaine>.d/silly-rss.conf` puis :
a copier dans `/etc/nginx/conf.d/akbar.nohost.me.d/silly-rss.conf` puis :
```bash
sudo nginx -t && sudo systemctl reload nginx
```
NB : `/rss` est deja pris par FreshRSS sur ce domaine, d'ou le choix de
`/silly-rss/` comme chemin.
4. **Premiere generation** (avant le premier passage du cron) :
```bash
@@ -43,13 +64,18 @@ defaut). Aucune dependance externe : Python 3.10+ (stdlib) et `curl`
```
5. **FreshRSS** — ajouter comme sources :
- `https://<votre-domaine>/silly-rss/actualites.xml`
- `https://<votre-domaine>/silly-rss/agenda.xml`
- `https://akbar.nohost.me/silly-rss/actualites.xml`
- `https://akbar.nohost.me/silly-rss/agenda.xml`
Cette option ne gere pas Facebook (pas de proxy) : ajouter directement
l'URL FetchRSS dans FreshRSS si vous utilisez cette variante.
## Facebook (page communedesilly)
Pas de solution fiable trouvee : le HTML de facebook.com est vide de
contenu exploitable sans authentification, et l'instance RSS-Bridge testee
(`FacebookBridge`) renvoie une erreur 400. Recommandation : un service
tiers specialise (RSS.app, Fetch RSS) plutot qu'un scraper maison, qui
sera cassé au premier changement de Facebook.
Pas de solution fiable trouvee en scraping direct : le HTML de
facebook.com est vide de contenu exploitable sans authentification, et
l'instance RSS-Bridge testee (`FacebookBridge`) renvoie une erreur 400.
Solution retenue : [FetchRSS](https://fetchrss.com) (service tiers). La
variante PHP le reproxifie sous votre propre domaine (`facebook.php`) pour
avoir 3 URLs stables et partageables ; la variante Python s'appuie
directement sur l'URL FetchRSS.