mirror of
				https://forge.chapril.org/tykayn/orgmode-to-gemini-blog
				synced 2025-10-09 17:02:45 +02:00 
			
		
		
		
	site builder ok
This commit is contained in:
		
							parent
							
								
									7e9e8f2436
								
							
						
					
					
						commit
						83dd9f7472
					
				
					 27 changed files with 526 additions and 235 deletions
				
			
		|  | @ -0,0 +1,193 @@ | |||
| 
 | ||||
|      | ||||
|     <!DOCTYPE html> | ||||
| <html> | ||||
|     <head> | ||||
|         <meta charset="UTF-8"> | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||
|         <meta property="og:image" content="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png"> | ||||
|         <meta property="og:locale" content="fr_FR"> | ||||
|         <meta property="og:description" content="Code, nouvelles technologies et entrepreneurariat par B. Lemoine"> | ||||
|         <meta property="og:url" content="https://www.cipherbliss.com"> | ||||
|         <meta property="og:site_name" content="Cipher Bliss"> | ||||
|         <link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux" href="https://www.cipherbliss.com/feed/"> | ||||
|         <link href="/style.css" rel="stylesheet"> | ||||
|         <meta charset="utf-8"> | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||
|         <title></title> | ||||
|         <meta name="author" content=""> | ||||
|         <link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux" | ||||
|             href="https://www.cipherbliss.com/feed/"> | ||||
|         <meta property="og:title" content=""> | ||||
|         <meta property="og:locale" content="fr_FR"> | ||||
|         <!-- Description de la page --> | ||||
|         <meta name="description" content=""> | ||||
|         <meta name="reply-to" content="contact@cipherbliss.com"> | ||||
|         <link rel="icon" type="image/png" href="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png"> | ||||
|     </head> | ||||
| 
 | ||||
|     <body> | ||||
|         <div id="page"> | ||||
|             <header id="masthead" class="site-header"> | ||||
|                 <div class="header-image" style="background: url(https://www.cipherbliss.com/wp-content/uploads/2016/11/bg.jpg)"> | ||||
|                     <a href="/"> | ||||
|                     <img src="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png" class="site-icon img"> | ||||
|                     </a> | ||||
|                     <h1 class="blog-title">Cipher Bliss</h1> | ||||
|                     <p class="blog-subtitle">Code, nouvelles technologies et entrepreneurariat par B. Lemoine</p> | ||||
|                 </div> | ||||
|                     <nav class="navbar is-fixed-top is-dark" role="navigation" aria-label="main navigation"> | ||||
|                         <div class="navbar-brand"> | ||||
|                             <a class="navbar-item" href="https://www.cipherbliss.com"> | ||||
|                                  | ||||
|                             </a> | ||||
| 
 | ||||
|                         </div> | ||||
| 
 | ||||
|                         <div id="navbarBasicExample" class="navbar-menu"> | ||||
|                             <div class="navbar-start"> | ||||
|                                 <a class="navbar-item" href="https://www.cipherbliss.com"> | ||||
|                                     <img src="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png" | ||||
|                                         class="img-fluid"> | ||||
|                                 </a> | ||||
|                                  | ||||
| <nav> | ||||
|     <a href="/">Accueil</a> | ||||
|     <a href="https://portfolio.cipherbliss.com">Portfolio</a> | ||||
|     <a href="/feed">Flux RSS</a> | ||||
|     <a href="/contact">Contact</a> | ||||
|     <a href="/ressources-de-café-vie-privée">Ressources</a> | ||||
| </nav> | ||||
| 
 | ||||
|                             </div> | ||||
|                             <div class="navbar-end"> | ||||
|                                 <div class="navbar-item"> | ||||
|                                     <form role="search" method="get" class="search-form" action="/"> | ||||
|                                         <label> | ||||
|                                             <input class="search-field" placeholder="Recherche" value="" name="s" | ||||
|                                                 type="search"> | ||||
|                                         </label> | ||||
|                                         <input class="is-hidden search-submit" value="Rechercher" type="submit"> | ||||
|                                     </form> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                     </nav> | ||||
|             </header> | ||||
|             <main class="body-wrap boxed-container"> | ||||
|                 <article class="content"> | ||||
|                      | ||||
| <header id="title-block-header"> | ||||
| <h1 class="title">cipherbliss_blog</h1> | ||||
| </header> | ||||
| <h1 id="création-dun-blog-gemini-1">Création d'un blog gemini</h1> | ||||
| <p>Et hop, un générateur qui fait le café à partir de fichiers orgmode | ||||
| ou markdown.</p> | ||||
| <p>Génération de capsules gemini et blog html à partir d'articles en | ||||
| fichiers Orgmode.</p> | ||||
| <p>exemple avec le blog de DragonFeu. | ||||
| `sources/dragonfeu<sub>blog</sub>`</p> | ||||
| <p>Les articles sont écrits dans le dossier source/, leur nom permet de | ||||
| déduire l'ordre de publication grâce à une date YYY-MM-DD en début de | ||||
| nom de fichier ## création d'un article Pour un article en langue En, | ||||
| sur le blog cipherbliss<sub>blog</sub>, donner le titre entre guillemets | ||||
| ainsi: ```shell python3 new<sub>article</sub>.py | ||||
| cipherbliss<sub>blog</sub> en "Creation of a gemini blog" ``` ## | ||||
| prérequis pour installation</p> | ||||
| <p>Avoir des articles au format org, les mettre dans un dossier | ||||
| source/nom<sub>dublog</sub>, et avoir quelques bibliothèques dispo:</p> | ||||
| <p>```shell bash install.sh ``` [2024-11-04] Testé avec: Pandoc 2.9.2.1 | ||||
| <a | ||||
| href="http://fr.archive.ubuntu.com/ubuntu/pool/universe/p/pandoc/pandoc_2.9.2.1-3ubuntu2_amd64.deb">http://fr.archive.ubuntu.com/ubuntu/pool/universe/p/pandoc/pandoc_2.9.2.1-3ubuntu2_amd64.deb</a></p> | ||||
| <p>Python 3.10.12 ## Conversion des fichiers Org vers gemini et html | ||||
| Ceci va convertir ce qui se trouve dans le dossier | ||||
| `sources/tykayn<sub>blog</sub>` et produire un site web dans | ||||
| `html<sub>output</sub>/tykayn<sub>blog</sub>` ainsi qu'une capsule | ||||
| gemini dans `capsules-gemini/tykayn<sub>blog</sub>`</p> | ||||
| <p>```shell bash converters.sh tykayn<sub>blog</sub> ```</p> | ||||
| <p>## Conversion de blog en capsule gemini</p> | ||||
| <p>L'idée est d'avoir un ensemble de billets de blogs en texte simple | ||||
| versionnés avec git et servis par une capsule gemini ainsi que par un | ||||
| site web. On aura besoin de convertir des billets existants, et de | ||||
| rédiger les nouveaux dans un format qui nous convient, par exemple | ||||
| markdown ou orgmode afin de rendre le tout le plus pérenne possible. On | ||||
| aura aussi besoin de référencer les images dans un dossier de notre | ||||
| dépot, et de gérer les relations entres articles pour que les liens | ||||
| aient du sens sur la capsule gemini autant que dans la version web. On | ||||
| souhaite aussi fournir un flux RSS, et un template de billet de blog | ||||
| avec une entête et un pied de page commun qui donne des moyens de | ||||
| contact, de soutenir l'auteur, et de revenir à l'accueil. On prendra | ||||
| aussi en charge différentes pages:</p> | ||||
| <ul> | ||||
| <li>à propos</li> | ||||
| <li>contact</li> | ||||
| <li>nos projets</li> | ||||
| <li>une liste des articles triés par date.</li> | ||||
| </ul> | ||||
| <p>Il nous faudra aussi un script de mise à jour du blog qui se charge | ||||
| de mettre à jour le flux rss, le dépot git. On peut aller chercher de | ||||
| l'automatisation dans la gestion de plusieurs capsules différentes en | ||||
| tagguant les articles par nom de blog, ce qui nécessite un fichier de | ||||
| config pour les correspondances.</p> | ||||
| <p>## Depuis wordpress Connec à la base de données mysql, et extraction | ||||
| de chaque article pour récupérer la partie HTML et la convertir en | ||||
| markdown et en fichiers org.</p> | ||||
| <p>## Depuis des fichiers orgmode. J'écris en orgmode une base de | ||||
| connaissances qui contient aussi un export de mes anciens billets de | ||||
| blog dans un dossier par blog. Pour cibler quels billets utiliser pour | ||||
| quel blog j'ai donc deux possibilités: leur chemin de fichier, ou des | ||||
| tags particuliers présents dans les fichiers org. <a | ||||
| href="id:5a197a1b-ddfe-4c79-8934-d9a28ab6df65">Textes de blog en | ||||
| préparation</a> <a | ||||
| href="https://forge.chapril.org/tykayn/org-report-stats">https://forge.chapril.org/tykayn/org-report-stats</a></p> | ||||
| <p>Rédaction, conversion, completion des nouveaux articles, régénération | ||||
| des indexs et flux rss, mise à jour du dépot git, publication des | ||||
| pages.</p> | ||||
| <p>Offpunk LazyBlog Dotclear, Wordpress, Hugo, Pélican Pandoc, PandocGmi | ||||
| <a | ||||
| href="https://github.com/njamescouk/pandocGmi/tree/master">https://github.com/njamescouk/pandocGmi/tree/master</a></p> | ||||
| <ul> | ||||
| <li>config par site web de son nom de domaine</li> | ||||
| <li>réécriture des liens internes</li> | ||||
| <li>réécriture des url des images vers le dossier courant</li> | ||||
| <li>réparer la génération de fichiers gmi</li> | ||||
| <li>template footer article: gestion article suivant et précédent</li> | ||||
| <li>conversion des liens avec nom de domaine si relatifs</li> | ||||
| </ul> | ||||
| <ul> | ||||
| <li>navigation sur les pages d'article</li> | ||||
| </ul> | ||||
| <p>- gestion des langues dans la source et la destination</p> | ||||
| <ul> | ||||
| <li>gestion multi site et multi langue</li> | ||||
| </ul> | ||||
| 
 | ||||
|                     <p class="after-article"> | ||||
|                      | ||||
|                     </p> | ||||
|                 </article> | ||||
|             </main> | ||||
|             <footer class="site-footer has-top-divider"> | ||||
|                 <div class="container"> | ||||
|                     <div class="site-footer-inner"> | ||||
|                         | ||||
|                          | ||||
|              | ||||
|              | ||||
| <nav> | ||||
|     <a href="/">Accueil</a> | ||||
|     <a href="https://portfolio.cipherbliss.com">Portfolio</a> | ||||
|     <a href="/feed">Flux RSS</a> | ||||
|     <a href="/contact">Contact</a> | ||||
|     <a href="/ressources-de-café-vie-privée">Ressources</a> | ||||
| </nav> | ||||
| 
 | ||||
| 
 | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </footer> | ||||
|         </div> | ||||
|     </body> | ||||
|     <!-- généré avec orgmode-to-gemini-blog par Tykayn --> | ||||
| </html> | ||||
|   | ||||
|  | @ -10,12 +10,9 @@ | |||
|         <meta property="og:description" content="Code, nouvelles technologies et entrepreneurariat par B. Lemoine"> | ||||
|         <meta property="og:url" content="https://www.cipherbliss.com"> | ||||
|         <meta property="og:site_name" content="Cipher Bliss"> | ||||
|         <link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux" | ||||
|             href="https://www.cipherbliss.com/feed/"> | ||||
|         <link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux" href="https://www.cipherbliss.com/feed/"> | ||||
|         <link href="/style.css" rel="stylesheet"> | ||||
| 
 | ||||
|         <meta charset="utf-8"> | ||||
| 
 | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||
|         <title></title> | ||||
|         <meta name="author" content=""> | ||||
|  | @ -79,182 +76,60 @@ | |||
|             </header> | ||||
|             <main class="body-wrap boxed-container"> | ||||
|                 <article class="content"> | ||||
|                     <!DOCTYPE html> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang=""> | ||||
| <head> | ||||
|   <meta charset="utf-8" /> | ||||
|   <meta name="generator" content="pandoc" /> | ||||
|   <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> | ||||
|   <title>cipherbliss_blog</title> | ||||
|   <style> | ||||
|     html { | ||||
|       color: #1a1a1a; | ||||
|       background-color: #fdfdfd; | ||||
|     } | ||||
|     body { | ||||
|       margin: 0 auto; | ||||
|       max-width: 36em; | ||||
|       padding-left: 50px; | ||||
|       padding-right: 50px; | ||||
|       padding-top: 50px; | ||||
|       padding-bottom: 50px; | ||||
|       hyphens: auto; | ||||
|       overflow-wrap: break-word; | ||||
|       text-rendering: optimizeLegibility; | ||||
|       font-kerning: normal; | ||||
|     } | ||||
|     @media (max-width: 600px) { | ||||
|       body { | ||||
|         font-size: 0.9em; | ||||
|         padding: 12px; | ||||
|       } | ||||
|       h1 { | ||||
|         font-size: 1.8em; | ||||
|       } | ||||
|     } | ||||
|     @media print { | ||||
|       html { | ||||
|         background-color: white; | ||||
|       } | ||||
|       body { | ||||
|         background-color: transparent; | ||||
|         color: black; | ||||
|         font-size: 12pt; | ||||
|       } | ||||
|       p, h2, h3 { | ||||
|         orphans: 3; | ||||
|         widows: 3; | ||||
|       } | ||||
|       h2, h3, h4 { | ||||
|         page-break-after: avoid; | ||||
|       } | ||||
|     } | ||||
|     p { | ||||
|       margin: 1em 0; | ||||
|     } | ||||
|     a { | ||||
|       color: #1a1a1a; | ||||
|     } | ||||
|     a:visited { | ||||
|       color: #1a1a1a; | ||||
|     } | ||||
|     img { | ||||
|       max-width: 100%; | ||||
|     } | ||||
|     h1, h2, h3, h4, h5, h6 { | ||||
|       margin-top: 1.4em; | ||||
|     } | ||||
|     h5, h6 { | ||||
|       font-size: 1em; | ||||
|       font-style: italic; | ||||
|     } | ||||
|     h6 { | ||||
|       font-weight: normal; | ||||
|     } | ||||
|     ol, ul { | ||||
|       padding-left: 1.7em; | ||||
|       margin-top: 1em; | ||||
|     } | ||||
|     li > ol, li > ul { | ||||
|       margin-top: 0; | ||||
|     } | ||||
|     blockquote { | ||||
|       margin: 1em 0 1em 1.7em; | ||||
|       padding-left: 1em; | ||||
|       border-left: 2px solid #e6e6e6; | ||||
|       color: #606060; | ||||
|     } | ||||
|     code { | ||||
|       font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace; | ||||
|       font-size: 85%; | ||||
|       margin: 0; | ||||
|       hyphens: manual; | ||||
|     } | ||||
|     pre { | ||||
|       margin: 1em 0; | ||||
|       overflow: auto; | ||||
|     } | ||||
|     pre code { | ||||
|       padding: 0; | ||||
|       overflow: visible; | ||||
|       overflow-wrap: normal; | ||||
|     } | ||||
|     .sourceCode { | ||||
|      background-color: transparent; | ||||
|      overflow: visible; | ||||
|     } | ||||
|     hr { | ||||
|       background-color: #1a1a1a; | ||||
|       border: none; | ||||
|       height: 1px; | ||||
|       margin: 1em 0; | ||||
|     } | ||||
|     table { | ||||
|       margin: 1em 0; | ||||
|       border-collapse: collapse; | ||||
|       width: 100%; | ||||
|       overflow-x: auto; | ||||
|       display: block; | ||||
|       font-variant-numeric: lining-nums tabular-nums; | ||||
|     } | ||||
|     table caption { | ||||
|       margin-bottom: 0.75em; | ||||
|     } | ||||
|     tbody { | ||||
|       margin-top: 0.5em; | ||||
|       border-top: 1px solid #1a1a1a; | ||||
|       border-bottom: 1px solid #1a1a1a; | ||||
|     } | ||||
|     th { | ||||
|       border-top: 1px solid #1a1a1a; | ||||
|       padding: 0.25em 0.5em 0.25em 0.5em; | ||||
|     } | ||||
|     td { | ||||
|       padding: 0.125em 0.5em 0.25em 0.5em; | ||||
|     } | ||||
|     header { | ||||
|       margin-bottom: 4em; | ||||
|       text-align: center; | ||||
|     } | ||||
|     #TOC li { | ||||
|       list-style: none; | ||||
|     } | ||||
|     #TOC ul { | ||||
|       padding-left: 1.3em; | ||||
|     } | ||||
|     #TOC > ul { | ||||
|       padding-left: 0; | ||||
|     } | ||||
|     #TOC a:not(:hover) { | ||||
|       text-decoration: none; | ||||
|     } | ||||
|     code{white-space: pre-wrap;} | ||||
|     span.smallcaps{font-variant: small-caps;} | ||||
|     div.columns{display: flex; gap: min(4vw, 1.5em);} | ||||
|     div.column{flex: auto; overflow-x: auto;} | ||||
|     div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} | ||||
|     /* The extra [class] is a hack that increases specificity enough to | ||||
|        override a similar rule in reveal.js */ | ||||
|     ul.task-list[class]{list-style: none;} | ||||
|     ul.task-list li input[type="checkbox"] { | ||||
|       font-size: inherit; | ||||
|       width: 0.8em; | ||||
|       margin: 0 0.8em 0.2em -1.6em; | ||||
|       vertical-align: middle; | ||||
|     } | ||||
|     .display.math{display: block; text-align: center; margin: 0.5rem auto;} | ||||
|   </style> | ||||
| </head> | ||||
| <body> | ||||
|                      | ||||
| <header id="title-block-header"> | ||||
| <h1 class="title">cipherbliss_blog</h1> | ||||
| </header> | ||||
| <h1 id="ça-déménage-1">Ça déménage</h1> | ||||
| <p>Oui ce blog fait bouger les lignes avec son générateur statique fait | ||||
| maison. La peinture est fraîche.</p> | ||||
| </body> | ||||
| </html> | ||||
| <h1 id="tags---étiquettes-de-cipherbliss">Tags - Étiquettes de | ||||
| cipherbliss</h1> | ||||
| <p>Voici les thématiques abordées sur ce site:</p> | ||||
| <p><a href="file:///tag/ai/">AI</a> <a | ||||
| href="file:///tag/archives/">archives</a> <a | ||||
| href="file:///tag/autohebergement/">autohébergement</a> <a | ||||
| href="file:///tag/backup/">backup</a> <a | ||||
| href="file:///tag/blockchain/">blockchain</a> <a | ||||
| href="file:///tag/borg/">borg</a> <a | ||||
| href="file:///tag/caisse/">caisse</a> <a | ||||
| href="file:///tag/comptabilite/">comptabilité</a> <a | ||||
| href="file:///tag/comptes/">comptes</a> <a | ||||
| href="file:///tag/data-visualisation/">data visualisation</a> <a | ||||
| href="file:///tag/design/">design</a> <a | ||||
| href="file:///tag/email/">email</a> <a | ||||
| href="file:///tag/entreprise/">entreprise</a> <a | ||||
| href="file:///tag/entreprise-individuelle/">entreprise individuelle</a> | ||||
| <a href="file:///tag/ethereum/">ethereum</a> <a | ||||
| href="file:///tag/facebook/">facebook</a> <a | ||||
| href="file:///tag/factures/">factures</a> <a | ||||
| href="file:///tag/floss/">FLOSS</a> <a | ||||
| href="file:///tag/fediverse/">fédiverse</a> <a | ||||
| href="file:///tag/gestion-de-projet/">gestion de projet</a> <a | ||||
| href="file:///tag/gestion-du-temps/">gestion du temps</a> <a | ||||
| href="file:///tag/gestionnaire-de-mot-de-passe/">gestionnaire de mot de | ||||
| passe</a> <a href="file:///tag/gimp/">gimp</a> <a | ||||
| href="file:///tag/git/">git</a> <a | ||||
| href="file:///tag/logiciellibre/">logiciellibre</a> <a | ||||
| href="file:///tag/logiciel-libre/">logiciel libre</a> <a | ||||
| href="file:///tag/mastodon/">mastodon</a> <a | ||||
| href="file:///tag/mobilizon/">mobilizon</a> <a | ||||
| href="file:///tag/mot-de-passe/">mot de passe</a> <a | ||||
| href="file:///tag/mysql/">mysql</a> <a | ||||
| href="file:///tag/nextcloud/">nextcloud</a> <a | ||||
| href="file:///tag/open-source/">open source</a> <a | ||||
| href="file:///tag/openstreetmap/">openstreetmap</a> <a | ||||
| href="file:///tag/orgmode/">orgmode</a> <a | ||||
| href="file:///tag/osm/">OSM</a> <a href="file:///tag/photos/">photos</a> | ||||
| <a href="file:///tag/pim/">pim</a> <a | ||||
| href="file:///tag/projet/">projet</a> <a | ||||
| href="file:///tag/prevision/">prévision</a> <a | ||||
| href="file:///tag/python/">python</a> <a | ||||
| href="file:///tag/reseau-social/">réseau social</a> <a | ||||
| href="file:///tag/sauvegardes/">sauvegardes</a> <a | ||||
| href="file:///tag/script/">script</a> <a href="file:///tag/ux/">UX</a> | ||||
| <a href="file:///tag/vie-privee/">vie privée</a></p> | ||||
| 
 | ||||
|                     <p class="after-article"> | ||||
|                      | ||||
|                     </p> | ||||
|                 </article> | ||||
|             </main> | ||||
|             <footer class="site-footer has-top-divider"> | ||||
|  | @ -263,6 +138,7 @@ maison. La peinture est fraîche.</p> | |||
|                         | ||||
|                          | ||||
|              | ||||
|              | ||||
| <nav> | ||||
|     <a href="/">Accueil</a> | ||||
|     <a href="https://portfolio.cipherbliss.com">Portfolio</a> | ||||
|  | @ -0,0 +1,189 @@ | |||
| 
 | ||||
|      | ||||
|     <!DOCTYPE html> | ||||
| <html> | ||||
|     <head> | ||||
|         <meta charset="UTF-8"> | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||
|         <meta property="og:image" content="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png"> | ||||
|         <meta property="og:locale" content="fr_FR"> | ||||
|         <meta property="og:description" content="Code, nouvelles technologies et entrepreneurariat par B. Lemoine"> | ||||
|         <meta property="og:url" content="https://www.cipherbliss.com"> | ||||
|         <meta property="og:site_name" content="Cipher Bliss"> | ||||
|         <link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux" href="https://www.cipherbliss.com/feed/"> | ||||
|         <link href="/style.css" rel="stylesheet"> | ||||
|         <meta charset="utf-8"> | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||
|         <title></title> | ||||
|         <meta name="author" content=""> | ||||
|         <link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux" | ||||
|             href="https://www.cipherbliss.com/feed/"> | ||||
|         <meta property="og:title" content=""> | ||||
|         <meta property="og:locale" content="fr_FR"> | ||||
|         <!-- Description de la page --> | ||||
|         <meta name="description" content=""> | ||||
|         <meta name="reply-to" content="contact@cipherbliss.com"> | ||||
|         <link rel="icon" type="image/png" href="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png"> | ||||
|     </head> | ||||
| 
 | ||||
|     <body> | ||||
|         <div id="page"> | ||||
|             <header id="masthead" class="site-header"> | ||||
|                 <div class="header-image" style="background: url(https://www.cipherbliss.com/wp-content/uploads/2016/11/bg.jpg)"> | ||||
|                     <a href="/"> | ||||
|                     <img src="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png" class="site-icon img"> | ||||
|                     </a> | ||||
|                     <h1 class="blog-title">Cipher Bliss</h1> | ||||
|                     <p class="blog-subtitle">Code, nouvelles technologies et entrepreneurariat par B. Lemoine</p> | ||||
|                 </div> | ||||
|                     <nav class="navbar is-fixed-top is-dark" role="navigation" aria-label="main navigation"> | ||||
|                         <div class="navbar-brand"> | ||||
|                             <a class="navbar-item" href="https://www.cipherbliss.com"> | ||||
|                                  | ||||
|                             </a> | ||||
| 
 | ||||
|                         </div> | ||||
| 
 | ||||
|                         <div id="navbarBasicExample" class="navbar-menu"> | ||||
|                             <div class="navbar-start"> | ||||
|                                 <a class="navbar-item" href="https://www.cipherbliss.com"> | ||||
|                                     <img src="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png" | ||||
|                                         class="img-fluid"> | ||||
|                                 </a> | ||||
|                                  | ||||
| <nav> | ||||
|     <a href="/">Accueil</a> | ||||
|     <a href="https://portfolio.cipherbliss.com">Portfolio</a> | ||||
|     <a href="/feed">Flux RSS</a> | ||||
|     <a href="/contact">Contact</a> | ||||
|     <a href="/ressources-de-café-vie-privée">Ressources</a> | ||||
| </nav> | ||||
| 
 | ||||
|                             </div> | ||||
|                             <div class="navbar-end"> | ||||
|                                 <div class="navbar-item"> | ||||
|                                     <form role="search" method="get" class="search-form" action="/"> | ||||
|                                         <label> | ||||
|                                             <input class="search-field" placeholder="Recherche" value="" name="s" | ||||
|                                                 type="search"> | ||||
|                                         </label> | ||||
|                                         <input class="is-hidden search-submit" value="Rechercher" type="submit"> | ||||
|                                     </form> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                     </nav> | ||||
|             </header> | ||||
|             <main class="body-wrap boxed-container"> | ||||
|                 <article class="content"> | ||||
|                      | ||||
| <header id="title-block-header"> | ||||
| <h1 class="title">cipherbliss_blog</h1> | ||||
| </header> | ||||
| <h1 | ||||
| id="connaître-la-couleur-des-jours-edf-tempo-en-ligne-de-commande-1">Connaître | ||||
| la couleur des jours EDF Tempo en ligne de commande</h1> | ||||
| <p>EDF expose une API pour connaître les couleurs de jour TEMPO, mais | ||||
| cette api n'est pas bien référencée sur le wouaib, ce sont donc des | ||||
| sites qui n'ont rien à voir qui vous donneront cette info avec moult | ||||
| trackers et pubs de partout.</p> | ||||
| <p>Voici l'url dont vous avez besoin:</p> | ||||
| <p>> <a | ||||
| href="https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement?option=TEMPO&dateApplicationBorneInf=%7Bdate_inférieure%7D&dateApplicationBorneSup=%7Bdate_supérieure%7D&identifiantConsommateur=src">https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement?option=TEMPO&dateApplicationBorneInf={date_inférieure}&dateApplicationBorneSup={date_supérieure}&identifiantConsommateur=src</a></p> | ||||
| <p>Cette API de commerce EDF ne fonctionne que si vous demandez des | ||||
| dates ayant 365 jours d'écart de différence, et si vous ne mettez pas de | ||||
| zéro précédant le numéro de journée au format année-mois-jour. Autre | ||||
| limitation, la couleur du jour du lendemain vous sera donnée seulement à | ||||
| partir de 11h du matin dans la journée.</p> | ||||
| <p>Fabriquez vous un petit script en python pour aller pêcher ce | ||||
| calendrier, piocher les couleurs des deux derniers jours. Il vous | ||||
| suffira d'un alias de commande pour lancer "python | ||||
| mon<sub>scripttempo</sub>.py" en ayant le dossier où le script est placé | ||||
| dans votre variable d'environnement PATH.</p> | ||||
| <div class="sourceCode" id="cb1"><pre | ||||
| class="sourceCode python"><code class="sourceCode python"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a></span> | ||||
| <span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> requests</span> | ||||
| <span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> json</span> | ||||
| <span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> datetime <span class="im">import</span> datetime, timedelta </span> | ||||
| <span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a></span> | ||||
| <span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> date_il_y_a_un_an(date):</span> | ||||
| <span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a>    date_obj <span class="op">=</span> datetime.strptime(date, <span class="st">"%Y-%m-</span><span class="sc">%d</span><span class="st">"</span>)</span> | ||||
| <span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a>    date_il_y_a_un_an <span class="op">=</span> date_obj <span class="op">-</span> timedelta(days<span class="op">=</span><span class="dv">365</span>)</span> | ||||
| <span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a>    <span class="cf">return</span> date_il_y_a_un_an.strftime(<span class="st">"%Y-%m-</span><span class="sc">%d</span><span class="st">"</span>)</span> | ||||
| <span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a></span> | ||||
| <span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> get_tempo_for_today_and_tomorrow():</span> | ||||
| <span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a>    <span class="co"># Obtenir la date d'aujourd'hui</span></span> | ||||
| <span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a>    datenow <span class="op">=</span> datetime.now()</span> | ||||
| <span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a>    sup <span class="op">=</span> (datenow <span class="op">+</span> timedelta(days<span class="op">=</span><span class="dv">1</span>))</span> | ||||
| <span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a></span> | ||||
| <span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a>    inf <span class="op">=</span> date_il_y_a_un_an(datenow.strftime(<span class="st">"%Y-%m-</span><span class="sc">%d</span><span class="st">"</span>))</span> | ||||
| <span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a></span> | ||||
| <span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a>    <span class="co"># Obtenir la date de demain</span></span> | ||||
| <span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a>    sup <span class="op">=</span> sup.strftime(<span class="st">"%Y-%m-</span><span class="sc">%d</span><span class="st">"</span>)</span> | ||||
| <span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a>    sup <span class="op">=</span> sup.replace(<span class="st">"-0"</span>, <span class="st">"-"</span>)</span> | ||||
| <span id="cb1-21"><a href="#cb1-21" aria-hidden="true" tabindex="-1"></a>    inf <span class="op">=</span> inf.replace(<span class="st">"-0"</span>, <span class="st">"-"</span>)</span> | ||||
| <span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a></span> | ||||
| <span id="cb1-23"><a href="#cb1-23" aria-hidden="true" tabindex="-1"></a>    <span class="co"># print("Date inf :", inf)</span></span> | ||||
| <span id="cb1-24"><a href="#cb1-24" aria-hidden="true" tabindex="-1"></a>    <span class="co"># print("Date sup:", sup)</span></span> | ||||
| <span id="cb1-25"><a href="#cb1-25" aria-hidden="true" tabindex="-1"></a></span> | ||||
| <span id="cb1-26"><a href="#cb1-26" aria-hidden="true" tabindex="-1"></a>    <span class="co"># URL de l'API d'EDF pour récupérer les informations sur les couleurs des jours de l'offre Tempo</span></span> | ||||
| <span id="cb1-27"><a href="#cb1-27" aria-hidden="true" tabindex="-1"></a>    url <span class="op">=</span> <span class="ss">f"https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement?option=TEMPO&dateApplicationBorneInf=</span><span class="sc">{</span>inf<span class="sc">}</span><span class="ss">&dateApplicationBorneSup=</span><span class="sc">{</span>sup<span class="sc">}</span><span class="ss">&identifiantConsommateur=src"</span></span> | ||||
| <span id="cb1-28"><a href="#cb1-28" aria-hidden="true" tabindex="-1"></a>    <span class="bu">print</span>(url)</span> | ||||
| <span id="cb1-29"><a href="#cb1-29" aria-hidden="true" tabindex="-1"></a>    <span class="co"># Effectuer la requête HTTP et récupérer la réponse JSON</span></span> | ||||
| <span id="cb1-30"><a href="#cb1-30" aria-hidden="true" tabindex="-1"></a>    response <span class="op">=</span> requests.get(url)</span> | ||||
| <span id="cb1-31"><a href="#cb1-31" aria-hidden="true" tabindex="-1"></a>    data <span class="op">=</span> json.loads(response.text)</span> | ||||
| <span id="cb1-32"><a href="#cb1-32" aria-hidden="true" tabindex="-1"></a></span> | ||||
| <span id="cb1-33"><a href="#cb1-33" aria-hidden="true" tabindex="-1"></a>    <span class="co"># Récupérer la liste des couleurs des jours pour les 30 prochains jours</span></span> | ||||
| <span id="cb1-34"><a href="#cb1-34" aria-hidden="true" tabindex="-1"></a>    calendrier <span class="op">=</span> data[<span class="st">"content"</span>][<span class="st">"options"</span>][<span class="dv">0</span>][<span class="st">"calendrier"</span>]</span> | ||||
| <span id="cb1-35"><a href="#cb1-35" aria-hidden="true" tabindex="-1"></a></span> | ||||
| <span id="cb1-36"><a href="#cb1-36" aria-hidden="true" tabindex="-1"></a>    texte_retour<span class="op">=</span><span class="st">""</span></span> | ||||
| <span id="cb1-37"><a href="#cb1-37" aria-hidden="true" tabindex="-1"></a></span> | ||||
| <span id="cb1-38"><a href="#cb1-38" aria-hidden="true" tabindex="-1"></a>    <span class="co"># # Afficher les couleurs des jours pour le prochain jour</span></span> | ||||
| <span id="cb1-39"><a href="#cb1-39" aria-hidden="true" tabindex="-1"></a>    <span class="cf">for</span> jour <span class="kw">in</span> calendrier[<span class="op">-</span><span class="dv">2</span>:]:</span> | ||||
| <span id="cb1-40"><a href="#cb1-40" aria-hidden="true" tabindex="-1"></a>        date <span class="op">=</span> jour[<span class="st">"dateApplication"</span>]</span> | ||||
| <span id="cb1-41"><a href="#cb1-41" aria-hidden="true" tabindex="-1"></a>        code_couleur <span class="op">=</span> jour[<span class="st">"statut"</span>]</span> | ||||
| <span id="cb1-42"><a href="#cb1-42" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> code_couleur <span class="op">==</span> <span class="st">"TEMPO_BLEU"</span>:</span> | ||||
| <span id="cb1-43"><a href="#cb1-43" aria-hidden="true" tabindex="-1"></a>            texte_retour<span class="op">+=</span>(<span class="ss">f"</span><span class="ch">\033</span><span class="ss">[34m</span><span class="sc">{</span>date<span class="sc">}</span><span class="ss">: journée </span><span class="sc">{</span>code_couleur<span class="sc">}</span><span class="ch">\033</span><span class="ss">[0m</span><span class="ch">\n</span><span class="ss">"</span>)</span> | ||||
| <span id="cb1-44"><a href="#cb1-44" aria-hidden="true" tabindex="-1"></a>        <span class="cf">elif</span> code_couleur <span class="op">==</span> <span class="st">"TEMPO_BLANC"</span>:</span> | ||||
| <span id="cb1-45"><a href="#cb1-45" aria-hidden="true" tabindex="-1"></a>            texte_retour<span class="op">+=</span>(<span class="ss">f"</span><span class="ch">\033</span><span class="ss">[37m</span><span class="sc">{</span>date<span class="sc">}</span><span class="ss">: journée </span><span class="sc">{</span>code_couleur<span class="sc">}</span><span class="ch">\033</span><span class="ss">[0m</span><span class="ch">\n</span><span class="ss">"</span>)</span> | ||||
| <span id="cb1-46"><a href="#cb1-46" aria-hidden="true" tabindex="-1"></a>        <span class="cf">elif</span> code_couleur <span class="op">==</span> <span class="st">"TEMPO_ROUGE"</span>:</span> | ||||
| <span id="cb1-47"><a href="#cb1-47" aria-hidden="true" tabindex="-1"></a>            texte_retour<span class="op">+=</span>(<span class="ss">f"</span><span class="ch">\033</span><span class="ss">[31m</span><span class="sc">{</span>date<span class="sc">}</span><span class="ss">: journée </span><span class="sc">{</span>code_couleur<span class="sc">}</span><span class="ch">\033</span><span class="ss">[0m</span><span class="ch">\n</span><span class="ss">"</span>)</span> | ||||
| <span id="cb1-48"><a href="#cb1-48" aria-hidden="true" tabindex="-1"></a>        <span class="cf">else</span>:</span> | ||||
| <span id="cb1-49"><a href="#cb1-49" aria-hidden="true" tabindex="-1"></a>            texte_retour<span class="op">+=</span>(<span class="ss">f"</span><span class="sc">{</span>date<span class="sc">}</span><span class="ss">: journée </span><span class="sc">{</span>code_couleur<span class="sc">}</span><span class="ss">"</span>)</span> | ||||
| <span id="cb1-50"><a href="#cb1-50" aria-hidden="true" tabindex="-1"></a></span> | ||||
| <span id="cb1-51"><a href="#cb1-51" aria-hidden="true" tabindex="-1"></a>    <span class="cf">return</span> texte_retour</span> | ||||
| <span id="cb1-52"><a href="#cb1-52" aria-hidden="true" tabindex="-1"></a></span> | ||||
| <span id="cb1-53"><a href="#cb1-53" aria-hidden="true" tabindex="-1"></a>texte <span class="op">=</span> get_tempo_for_today_and_tomorrow()</span> | ||||
| <span id="cb1-54"><a href="#cb1-54" aria-hidden="true" tabindex="-1"></a><span class="bu">print</span>(texte)</span> | ||||
| <span id="cb1-55"><a href="#cb1-55" aria-hidden="true" tabindex="-1"></a></span></code></pre></div> | ||||
| <p>Bonne réduction des pointes de conso!</p> | ||||
| 
 | ||||
|                     <p class="after-article"> | ||||
|                      | ||||
|                     </p> | ||||
|                 </article> | ||||
|             </main> | ||||
|             <footer class="site-footer has-top-divider"> | ||||
|                 <div class="container"> | ||||
|                     <div class="site-footer-inner"> | ||||
|                         | ||||
|                          | ||||
|              | ||||
|              | ||||
| <nav> | ||||
|     <a href="/">Accueil</a> | ||||
|     <a href="https://portfolio.cipherbliss.com">Portfolio</a> | ||||
|     <a href="/feed">Flux RSS</a> | ||||
|     <a href="/contact">Contact</a> | ||||
|     <a href="/ressources-de-café-vie-privée">Ressources</a> | ||||
| </nav> | ||||
| 
 | ||||
| 
 | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </footer> | ||||
|         </div> | ||||
|     </body> | ||||
|     <!-- généré avec orgmode-to-gemini-blog par Tykayn --> | ||||
| </html> | ||||
|   | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Tykayn
						Tykayn