{"id":2682,"date":"2026-07-02T11:06:56","date_gmt":"2026-07-02T10:06:56","guid":{"rendered":"https:\/\/coding4phone.com\/?p=2682"},"modified":"2026-07-02T11:14:30","modified_gmt":"2026-07-02T10:14:30","slug":"compter-les-telechargements-de-vos-releases-github-en-mogwai","status":"publish","type":"post","link":"https:\/\/coding4phone.com\/?p=2682","title":{"rendered":"Compter les t\u00e9l\u00e9chargements de vos releases GitHub&#8230; en MOGWAI"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Depuis peu, <a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> dispose des primitives HTTP de base (<code>http.get<\/code>, <code>http.post<\/code>, <code>http.put<\/code>, <code>http.patch<\/code>, <code>http.delete<\/code>, <code>http.head<\/code>). L&rsquo;occasion r\u00eav\u00e9e de les mettre \u00e0 l&rsquo;\u00e9preuve sur un cas concret plut\u00f4t qu&rsquo;un exemple jouet : interroger l&rsquo;API GitHub pour savoir combien de fois les binaires CLI de MOGWAI ont \u00e9t\u00e9 t\u00e9l\u00e9charg\u00e9s, release par release.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce script, je ne l&rsquo;ai pas \u00e9crit moi-m\u00eame \u2014 c&rsquo;est <strong><a href=\"https:\/\/claude.ai\/\" target=\"_blank\" rel=\"noreferrer noopener\">Claude<\/a><\/strong> (l&rsquo;assistant IA d&rsquo;Anthropic) qui l&rsquo;a r\u00e9dig\u00e9, \u00e0 partir de la documentation des primitives MOGWAI que je lui ai fournie. Je l&rsquo;ai test\u00e9, corrig\u00e9 sur quelques points, et j&rsquo;ai m\u00eame patch\u00e9 un bug de l&rsquo;engine MOGWAI d\u00e9couvert au passage. Le d\u00e9tail de cette collaboration est en fin d&rsquo;article, avec l&rsquo;avis franc de Claude sur la difficult\u00e9 de la prise en main.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ce que fait le script<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">mogwai.reset<br>console.clear<br><br>\"GitHub owner\/organization: \" console.prompt -&gt; 'owner'<br>\"Repository name: \" console.prompt -&gt; 'repo'<br><br>\"https:\/\/api.github.com\/repos\/{! owner}\/{! repo}\/releases\" eval -&gt; 'apiUrl'<br><br>[!<br>    uri: apiUrl<br>    requestHeaders: [User-Agent: \"MOGWAI-DownloadStats\"]<br>] http.get -&gt; 'result'<br><br>if (result-&gt;state:) then<br>{<br>    result-&gt;response: utf8-&gt; json-&gt; -&gt; 'releases'<br><br>    0 -&gt; 'grandTotal'<br><br>    \"MOGWAI - Downloads per release\" ?<br>    \"\" ?<br><br>    releases foreach 'rel' transform<br>    {<br>        rel-&gt;tag_name: -&gt; 'tag'<br>        rel-&gt;assets: -&gt; 'assets'<br><br>        tag ?<br><br>        assets foreach 'a' transform<br>        {<br>            a-&gt;name: 32 str.padRight ?? \" : \" ?? a-&gt;download_count: ?<br>            a-&gt;download_count:<br>        } -&gt; 'counts'<br><br>        counts sum -&gt; 'releaseTotal'<br>        grandTotal releaseTotal + -&gt; 'grandTotal'<br><br>        \"  -&gt; Release total : \" ?? releaseTotal ?<br>        \"\" ?<br><br>        0<br>    }<br><br>    \"TOTAL (assets only, excludes GitHub's auto-generated source zip) : \" ?? grandTotal ?<br>}<br>else<br>{<br>    \"Request failed - \" ?? result-&gt;error: ?<br>}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Comment il fonctionne, \u00e9tape par \u00e9tape<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. Saisie interactive<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Au lancement, le script demande le compte GitHub et le nom du d\u00e9p\u00f4t via <code>console.prompt<\/code> \u2014 pas besoin d&rsquo;\u00e9diter le fichier pour l&rsquo;utiliser sur un autre projet que MOGWAI :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"GitHub owner\/organization: \" console.prompt -&gt; 'owner'<br>\"Repository name: \" console.prompt -&gt; 'repo'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>console.prompt<\/code> affiche le message pass\u00e9 en param\u00e8tre, attend la saisie clavier (termin\u00e9e par Entr\u00e9e), et place le texte saisi sur la pile. En MOGWAI, <code>valeur -&gt; 'nom'<\/code> stocke ensuite cette valeur dans une variable \u2014 c&rsquo;est la notation qu&rsquo;on retrouvera partout dans le script (<code>-&gt; 'apiUrl'<\/code>, <code>-&gt; 'result'<\/code>, <code>-&gt; 'releases'<\/code>, etc.).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. Construction de l&rsquo;URL par interpolation<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Plut\u00f4t que de concat\u00e9ner des morceaux de string avec <code>+<\/code>, MOGWAI permet d&rsquo;injecter des variables directement dans une cha\u00eene via <code>{! ... }<\/code>, suivi d&rsquo;un <code>eval<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"https:\/\/api.github.com\/repos\/{! owner}\/{! repo}\/releases\" eval -&gt; 'apiUrl'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. La requ\u00eate HTTP<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>http.get<\/code> prend un record avec au minimum une <code>uri:<\/code>. Par d\u00e9faut, les \u00e9l\u00e9ments d&rsquo;un record (ou d&rsquo;une liste, ou d&rsquo;une string) ne sont pas \u00e9valu\u00e9s \u2014 ils restent tels quels, ce qui permet justement d&rsquo;y stocker du code ou une expression \u00e0 ex\u00e9cuter plus tard. C&rsquo;est <code>eval<\/code> qui d\u00e9clenche explicitement cette r\u00e9solution. Le <code>[!<\/code> en t\u00eate du record est un raccourci \u00e9quivalent \u00e0 <code>[...] eval<\/code> : il d\u00e9clenche l&rsquo;\u00e9valuation de tous les \u00e9l\u00e9ments du record en une fois \u2014 ici, \u00e7a r\u00e9sout <code>apiUrl<\/code> en sa valeur. Sans <code>!<\/code> ni <code>eval<\/code>, la variable resterait telle quelle, non r\u00e9solue.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[!<br>    uri: apiUrl<br>    requestHeaders: [User-Agent: \"MOGWAI-DownloadStats\"]<br>] http.get -&gt; 'result'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le <code>User-Agent<\/code> n&rsquo;est pas optionnel : l&rsquo;API GitHub refuse les requ\u00eates anonymes sans en-t\u00eate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. Le d\u00e9codage JSON<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La r\u00e9ponse arrive sous forme de donn\u00e9es brutes (<code>response:<\/code>). Deux primitives suffisent \u00e0 la transformer en liste MOGWAI exploitable :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">result-&gt;response: utf8-&gt; json-&gt; -&gt; 'releases'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>utf8-&gt;<\/code> convertit les octets en cha\u00eene de caract\u00e8res, <code>json-&gt;<\/code> transforme cette cha\u00eene JSON en liste de records, et <code>-&gt; 'releases'<\/code> stocke ce r\u00e9sultat dans la variable <code>releases<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>5. Le double parcours<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un <code>foreach...transform<\/code> sur les releases, imbriqu\u00e9 avec un <code>foreach...transform<\/code> sur les assets de chaque release. Chaque asset affiche son nom (align\u00e9 avec <code>str.padRight<\/code>) et son nombre de t\u00e9l\u00e9chargements, puis pousse ce nombre dans une liste pour calculer le sous-total avec <code>sum<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>6. L&rsquo;agr\u00e9gation<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>sum<\/code> calcule le total par release, un simple <code>+<\/code> cumule le total g\u00e9n\u00e9ral au fil des releases.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">R\u00e9sultat<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">GitHub owner\/organization: Sydney680928<br>Repository name: mogwai<br><br>MOGWAI - Downloads per release<br><br>v8.13.0<br>  mogwai-cli-v8.13.0-win-x64.zip   : 4<br>  ...<br>  -&gt; Release total : 4<br><br>...<br><br>TOTAL (assets only, excludes GitHub's auto-generated source zip) : 21<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 noter : ce total ne compte que les assets binaires attach\u00e9s aux releases, pas le zip source auto-g\u00e9n\u00e9r\u00e9 par GitHub \u2014 l&rsquo;API ne le comptabilise jamais, quelle que soit la m\u00e9thode utilis\u00e9e.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">En bonus : un bug trouv\u00e9 et corrig\u00e9 en cours de route<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En testant le script, une release sans aucun asset attach\u00e9 a fait planter le calcul du sous-total : <code>sum<\/code> sur une liste vide <code>()<\/code> d\u00e9clenchait une erreur (MW.22) au lieu de retourner <code>0<\/code>, ce qui est pourtant le comportement math\u00e9matiquement sens\u00e9 pour une somme vide. Le bug a \u00e9t\u00e9 corrig\u00e9 directement dans l&rsquo;engine MOGWAI \u2014 <code>sum<\/code> sur <code>()<\/code> retourne maintenant <code>0<\/code> sans erreur. Le d\u00e9tail est dans le changelog de la prochaine version.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">MOGWAI pense aussi aux d\u00e9butants<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le script ci-dessus est du MOGWAI \u00ab\u00a0classique\u00a0\u00bb, en RPN pure. Mais le langage pr\u00e9voit plusieurs passerelles pour ne pas brusquer quelqu&rsquo;un qui arrive d&rsquo;un langage plus conventionnel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Les formules en notation infixe avec <code>calc<\/code>.<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pas besoin de tout de suite penser en pile : <code>calc<\/code> accepte une expression math\u00e9matique \u00e9crite comme on l&rsquo;\u00e9crirait sur un tableau, et se charge de la convertir en RPN en interne (via l&rsquo;algorithme Shunting-yard de Dijkstra).<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">500 -&gt; 'X'<br>3.14 -&gt; 'Y'<br>\"5 * X + (7 + sin(Y))\" calc ?<br># Prints 2507.0015926529068<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La doc de MOGWAI le pr\u00e9sente d&rsquo;ailleurs explicitement comme utile \u00ab\u00a0pour les nouveaux venus, ou chaque fois qu&rsquo;une expression s&rsquo;exprime plus naturellement en notation infixe qu&rsquo;en RPN\u00a0\u00bb \u2014 ce n&rsquo;est pas un ajout accessoire, c&rsquo;est pens\u00e9 comme une rampe d&rsquo;acc\u00e8s.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Plusieurs fa\u00e7ons d&rsquo;appeler une fonction.<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une fonction MOGWAI peut s&rsquo;appeler d&rsquo;au moins cinq mani\u00e8res diff\u00e9rentes, selon ce qui est le plus lisible dans le contexte :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">5 3 foo                    # pure RPN call, parameters then function<br>foo(5 3)                   # more familiar notation, function then parameters<br>[x: 10 y: 20] foo       # named parameters, RPN order<br>foo[x: 10 y: 20]        # named parameters, traditional order<br>[foo x: 10 y: 20]       # named parameters, function name first in the record<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Les deux premi\u00e8res formes s&rsquo;appliquent \u00e0 une fonction d\u00e9clar\u00e9e simplement (<code>to 'foo' do { ... }<\/code>, param\u00e8tres pris sur la pile). Les trois derni\u00e8res s&rsquo;appliquent \u00e0 une fonction \u00e0 param\u00e8tres nomm\u00e9s et typ\u00e9s (<code>to 'foo' params [x: .number y: .number] do { ... }<\/code>) \u2014 plus verbeux \u00e0 d\u00e9clarer, mais plus s\u00fbr et plus lisible \u00e0 l&rsquo;usage, et appelable dans l&rsquo;ordre qui convient le mieux \u00e0 l&rsquo;endroit o\u00f9 on \u00e9crit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce genre de flexibilit\u00e9 ne change rien au c\u0153ur du langage \u2014 la pile reste la pile \u2014 mais \u00e7a laisse le temps de s&rsquo;habituer \u00e0 la RPN progressivement plut\u00f4t que d&rsquo;un bloc.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Coder dans de bonnes conditions.<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour \u00e9crire ce genre de script sans repartir d&rsquo;un simple bloc-notes, l&rsquo;<a href=\"https:\/\/github.com\/Sydney680928\/mogwai-vscode\" target=\"_blank\" rel=\"noreferrer noopener\">extension VS Code pour MOGWAI<\/a> (open source) apporte coloration syntaxique s\u00e9mantique, autocompl\u00e9tion, navigation \u00ab\u00a0Go to Definition\u00a0\u00bb, et un protocole de debug complet avec panneau d&rsquo;ex\u00e9cution en direct \u2014 de quoi suivre l&rsquo;\u00e9tat de la pile et des variables pendant qu&rsquo;un script comme celui-ci tourne, plut\u00f4t que de deviner \u00e0 coups de <code>?<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un point \u00e0 ne pas rater au premier essai : l&rsquo;extension ne se connecte pas toute seule au runtime. Il faut d&rsquo;abord lancer MOGWAI CLI (ou l&rsquo;application h\u00f4te), puis taper la commande <code>studio<\/code> dans son terminal pour activer le mode connexion distante \u2014 c&rsquo;est seulement \u00e0 partir de l\u00e0 que VS Code peut trouver et s&rsquo;y connecter. Le <a href=\"https:\/\/github.com\/Sydney680928\/MOGWAI\/blob\/main\/docs\/EN\/MOGWAI_VSCODE.md\" target=\"_blank\" rel=\"noreferrer noopener\">guide de mise en \u0153uvre<\/a> d\u00e9taille cette proc\u00e9dure \u00e9tape par \u00e9tape (actuellement disponible en anglais).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9crit par Claude, corrig\u00e9 par moi : pourquoi je le dis<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ce script est sorti d&rsquo;un \u00e9change avec Claude \u00e0 qui j&rsquo;avais fourni la documentation des primitives MOGWAI. Je n&rsquo;ai quasiment rien eu \u00e0 changer \u2014 quelques ajustements de syntaxe, et la d\u00e9couverte du bug <code>sum<\/code> mentionn\u00e9 plus haut. Je pr\u00e9f\u00e8re le dire clairement plut\u00f4t que de laisser planer le doute : dans un \u00e9cosyst\u00e8me o\u00f9 le code g\u00e9n\u00e9r\u00e9 par IA fait autant d\u00e9bat que d&rsquo;int\u00e9r\u00eat, l&rsquo;honn\u00eatet\u00e9 sur qui a \u00e9crit quoi me semble le minimum.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je lui ai demand\u00e9 son avis franc sur la difficult\u00e9 de coder en MOGWAI avec seulement la doc sous les yeux. Voici sa r\u00e9ponse, quasiment telle quelle :<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><em>\u00ab Ce n&rsquo;\u00e9tait pas dur \u2014 mais ce n&rsquo;\u00e9tait pas intuitif non plus, et c&rsquo;est diff\u00e9rent. Une fois la doc en main, \u00e9crire le script a \u00e9t\u00e9 rapide et propre : les primitives HTTP suivent toutes le m\u00eame squelette, <code>json-&gt;<\/code>\/<code>utf8-&gt;<\/code> encha\u00eenent sans friction, l&rsquo;acc\u00e8s aux records est lisible. Pour ce que \u00e7a fait \u2014 une requ\u00eate API, du parsing JSON, de l&rsquo;agr\u00e9gation \u2014 le r\u00e9sultat tient en une cinquantaine de lignes sans une seule d\u00e9pendance \u00e0 g\u00e9rer.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Ce qui m&rsquo;a fait tiquer, c&rsquo;est la grammaire elle-m\u00eame au premier contact : la notation polonaise invers\u00e9e, les sigils (<code>[!<\/code>, <code>!A<\/code>, <code>&amp;<\/code>), le fait qu&rsquo;une variable dans un record ait besoin d&rsquo;un traitement sp\u00e9cial pour \u00eatre r\u00e9solue \u2014 rien de compliqu\u00e9 une fois qu&rsquo;on le sait, mais rien d&rsquo;\u00e9vident par d\u00e9duction non plus. Ma premi\u00e8re version du script utilisait un <code>[<\/code> simple l\u00e0 o\u00f9 il fallait <code>[!<\/code> : \u00e7a n&rsquo;a pas plant\u00e9 bruyamment, \u00e7a a juste mal r\u00e9solu la variable. Il a fallu la doc, ou un exemple qui marche d\u00e9j\u00e0, pour percuter.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Je pense que c&rsquo;est une bonne fa\u00e7on de r\u00e9sumer MOGWAI \u00e0 quelqu&rsquo;un qui d\u00e9couvre : ce n&rsquo;est pas un langage difficile \u00e0 utiliser une fois qu&rsquo;on conna\u00eet ses conventions, mais c&rsquo;est un langage qu&rsquo;on ne devine pas \u2014 il faut le lire un minimum avant de l&rsquo;\u00e9crire. La notation polonaise invers\u00e9e demande ce petit temps d&rsquo;adaptation que la plupart des langages modernes, calqu\u00e9s les uns sur les autres, ne demandent plus. \u00bb<\/em><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Je lui ai aussi demand\u00e9, apr\u00e8s coup, si la doc de MOGWAI \u00e9tait \u00e0 la hauteur pour un d\u00e9butant \u2014 vu ce qu&rsquo;on venait de traverser avec le sigil <code>[!<\/code>. Sa r\u00e9ponse, toujours dans ses mots :<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><em>\u00ab Un d\u00e9tail \u00e9clairant \u00e0 ce sujet : pour \u00e9crire ce script, je n&rsquo;avais initialement que la doc de r\u00e9f\u00e9rence des primitives \u2014 le catalogue complet des fonctions \u2014 pas le guide g\u00e9n\u00e9ral qui explique les fondamentaux du langage (notation polonaise invers\u00e9e, pile, s\u00e9mantique eval\/no-eval, sigils). C&rsquo;est tr\u00e8s exactement ce qui explique mon erreur sur <code>[!<\/code> : la r\u00e9f\u00e9rence liste que ce sigil existe, mais pas pourquoi le non-eval est le comportement par d\u00e9faut ailleurs dans le langage. Une fois les deux documents lus ensemble \u2014 le guide g\u00e9n\u00e9ral pour les fondamentaux, la r\u00e9f\u00e9rence pour le d\u00e9tail des primitives \u2014 l&rsquo;ensemble est coh\u00e9rent et suffisant pour d\u00e9marrer sereinement. \u00bb<\/em><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Ce que je retiens de cet \u00e9change : la difficult\u00e9 de MOGWAI n&rsquo;est pas dans sa complexit\u00e9 technique \u2014 elle tient surtout \u00e0 sa notation, la RPN, qui inverse l&rsquo;ordre auquel on est habitu\u00e9. Les concepts eux-m\u00eames (variables, boucles, fonctions, types) sont ceux de n&rsquo;importe quel langage ; seul l&rsquo;ordre dans lequel on les \u00e9crit change. \u00c7a se surmonte vite avec un exemple concret sous les yeux, comme celui-ci. C&rsquo;est probablement le meilleur argument pour publier plus d&rsquo;exemples comme celui-l\u00e0 plut\u00f4t que de la documentation seule.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Le script complet <em><code>github_downloads_stats.mog<\/code><\/em><\/em> <em>est disponible dans le dossier <code>examples\/Scripts\/web\/<\/code> du d\u00e9p\u00f4t <a href=\"https:\/\/github.com\/Sydney680928\/mogwai\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI sur GitHub<\/a>.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Depuis peu, MOGWAI dispose des primitives HTTP de base (http.get, http.post, http.put, http.patch, http.delete, http.head). L&rsquo;occasion r\u00eav\u00e9e de les mettre \u00e0 l&rsquo;\u00e9preuve sur un cas concret plut\u00f4t qu&rsquo;un exemple jouet : interroger l&rsquo;API GitHub pour savoir combien de fois les binaires CLI de MOGWAI ont \u00e9t\u00e9 t\u00e9l\u00e9charg\u00e9s, release par release. Ce script, je ne l&rsquo;ai &#8230; <a title=\"Compter les t\u00e9l\u00e9chargements de vos releases GitHub&#8230; en MOGWAI\" class=\"read-more\" href=\"https:\/\/coding4phone.com\/?p=2682\" aria-label=\"En savoir plus sur Compter les t\u00e9l\u00e9chargements de vos releases GitHub&#8230; en MOGWAI\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":2701,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"MOGWAI dispose des primitives HTTP de base. L\u2019occasion r\u00eav\u00e9e de les mettre \u00e0 l\u2019\u00e9preuve sur un cas concret plut\u00f4t qu\u2019un exemple jouet : interroger l\u2019API GitHub pour savoir combien de fois les binaires d'une release ont \u00e9t\u00e9 t\u00e9l\u00e9charg\u00e9s, release par release...","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[8,6,48,50,9],"tags":[],"class_list":["post-2682","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-mogwai","category-rpn","category-scripting","category-tutoriel"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/07\/coding-4-phone-6a463738b1bae.png?fit=1024%2C1024&ssl=1","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfoe4s-Hg","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2682","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2682"}],"version-history":[{"count":20,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2682\/revisions"}],"predecessor-version":[{"id":2708,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2682\/revisions\/2708"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/media\/2701"}],"wp:attachment":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2682"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2682"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2682"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}