Comment récupérer les résultats d'un formulaire framaforms en base?

Bonjour,

framaforms dispose t-il d’une API ou d’un moyen permettant de récupérer les résultats des formulaires en base ?

Télécharger les résultats au format CSV c’est bien, mais je préfèrerai les stocker automatiquement dans une base PostgreSQL pour éviter toute action manuelle, est-ce possible ? Si oui, comment ?

Bien cordialement,

Hello,

A tester, voici ce que j’ai trouvé. Framaforms possède une API accessible via l’URL https://api.framaforms.org/v1/forms/[ID_FORMULAIRE]/results qui permet de récupérer les résultats des formulaires.

[ID_FORMULAIRE] est l’identifiant du formulaire que tu souhaites récupérer les résultats.

Pour récupérer les résultats de ton formulaire, tu peux utiliser la méthode GET de l’API. Cette requête retournera un objet JSON contenant les résultats du formulaire.

Pour stocker les résultats des formulaires automatiquement dans ta base PostgreSQL, tu peux utiliser l’API de Framaforms pour récupérer les résultats à intervalles réguliers. Par exemple, tu peux utiliser un cron job pour exécuter la requête suivante toutes les minutes :

curl https://api.framaforms.org/v1/forms/[ID_FORMULAIRE]/results > /tmp/results.json

Une fois que tu as récupéré les résultats de tes formulaires, tu peux les insérer dans ta base PostgreSQL en utilisant une requête SQL. Par exemple, tu peux utiliser cette requête suivante pour insérer les résultats dans une table appelée results :

SQL

INSERT INTO results (id, created_at, answers)
VALUES (
(SELECT MAX(id) + 1 FROM results),
NOW(),
JSON_EXTRACT(results.json, ‹ $.answers ›)
)
FROM (
SELECT *
FROM stdin
AS results
)

Voici un autre exemple de script PHP qui peut être utilisé pour récupérer les résultats des formulaires et les insérer dans une base PostgreSQL :

<?php // Définition des paramètres $form_id = 123456789; $db_host = 'localhost'; $db_name = 'framaforms'; $db_user = 'framaforms'; $db_password = 'framaforms'; // Connexion à la base PostgreSQL $db = new PDO("pgsql:host=$db_host;dbname=$db_name;user=$db_user;password=$db_password"); // Récupération des résultats du formulaire $results = json_decode(file_get_contents('https://api.framaforms.org/v1/forms/' . $form_id . '/results')); // Insertion des résultats dans la base PostgreSQL foreach ($results as $result) { $query = 'INSERT INTO results (id, created_at, answers) VALUES (?, ?, ?);'; $stmt = $db->prepare($query); $stmt->execute([ $result->id, $result->created_at, json_encode($result->answers) ]); } // Fermeture de la connexion à la base PostgreSQL $db = null; ?>

En espérant que ca va arranger les choses pour toi

Hello CrokCousin,

merci beaucoup pour ta réponse détaillée ! :slightly_smiling_face:
Je la teste et je reviens vers toi.

1 « J'aime »

Bon… impossible de faire quoi que ce soit avec les l’indentation du php :upside_down_face:

Entourer le code php entre une ligne ```php et ``` (Extended Syntax | Markdown Guide)

```php
<? php
    // Comment
   $var = 1;
?>
```
<?php
    // Définition des paramètres
    $form_id = 123456789;
    $db_host = 'localhost';
    $db_name = 'framaforms';
    $db_user = 'framaforms';
    $db_password = 'framaforms';
    // Connexion à la base PostgreSQL
    $db = new PDO("pgsql:host=$db_host;dbname=$db_name;user=$db_user;password=$db_password");
    // Récupération des résultats du formulaire
    $results = json_decode(file_get_contents('https://api.framaforms.org/v1/forms/' . $form_id . '/results'));
    // Insertion des résultats dans la base PostgreSQL
    foreach ($results as $result)
    {
        $query = 'INSERT INTO results (id, created_at, answers) VALUES (?, ?, ?);';
        $stmt = $db->prepare($query);
        $stmt->execute([ $result->id, $result->created_at, json_encode($result->answers) ]);
    }
    // Fermeture de la connexion à la base PostgreSQL $db = null; 
?>

@CrokCousin Merci à toi de vouloir aider sur ce sujet, mais le fait qu’il n’existe pas d’API pour Framaforms (il est assez facile de vérifier qu’il n’existe pas de service api.framaforms.org), contrairement à ce que tu avances, me fait largement douter de ton humanité. :robot:

Merci PaliPalo pour ton code ! :slight_smile:

Je ne serais donc pas un vrai humain… mais un gars en chocolat qui tape son clavier avec le bon vouloir de faire des recherches pour aider son prochain?

J’ai fais des recherches et c’est ce que j’ai trouvé… j’ai dis à la personne qui a demandé que de « tester » et de « voir » si c’était bon ou pas…

En ce cas, toutes mes excuses et je te remercie sincèrement de l’aide que tu produis sur ce forum, mais je te demanderai toutefois d’expliquer où tu as trouvé l’information erronée suivante, ou à la limite ce qui t’a mené à affirmer ceci, cela simplement afin ce qu’on fasse en sorte de corriger cette erreur.

Framaforms possède une API accessible via l’URL https://api.framaforms.org/v1/forms/[ID_FORMULAIRE]/results

Au final, il serait peut-être encore plus simple de télécharger le CSV de manière automatisée et de l’importer dans la base de données PostgreSQL.

Pour le téléchargement, un script en Perl pourrait faire l’affaire; en utilisant LWP:UserAgent et HTTP:Cookies pour faire des requêtes HTTP et gérer les cookies. Principalement, pour retenir le SESSIONID et les autres cookies qui sont retournés après authentification (vu que les résultats des formulaires ne sont pas publiquement accessibles, il faut s’identifier) En scrutant les requêtes faites par le navigateur et un peu d’ingéniosité, c’est possible (touche F12, onglet « Réseau » dans Firefox :grin:)