Un bot Twitter (sur la vaccination) avec les commandes de symfony 5 et la crontab

Introduction

Aujourd’hui nous allons voir comment mettre en place un Bot pour Twitter !

Notre objectif sera de récupérer le nombre officiel de personnes vaccinées contrela Covid 19 (sur https://www.data.gouv.fr/fr/datasets/donnees-relatives-aux-personnes-vaccinees-contre-la-covid-19/) et de publier une fois par jour (à 20h00) les données sur un compte Twitter (https://twitter.com/VaccinBot).

Ce tuto sera plus minimaliste que les précédents, le sujet étant simple à traiter.

Compte “Developer” Twitter

Pour suivre ce tuto, vous devez possĂ©der un compte “Developer” sur Twitter. L’opĂ©ration nĂ©cessite de rĂ©pondre Ă  un certains nombres de critĂšres, et rĂ©pondre Ă  un certain nombre de questions (Ă©ventuellement par mail).

Je vous laisse réaliser cette opération seule sur https://developer.twitter.com/en et créer votre application (en lecture écriture !).

Nouveau projet Symfony, Bundle et librairies

Pour ce projet nous aurons besoin de :

Installons Symfony, HttpClient et TwitterOAuth.

symfony new VaccinBot
composer require symfony/http-client
composer require abraham/twitteroauth

Consumer Key et Access Token pour l’API de Twitter

Pour utiliser l’API de Twitter nous devons utiliser 4 variables:

  • TWITTER_CONSUMER_KEY
  • TWITTER_CONSUMER_SECRET
  • TWITTER_ACCESS_TOKEN
  • TWITTER_ACCESS_TOKEN_SECRET

Vous trouverez ces valeurs dans votre tableau de bord “Developer Twitter”.

Commençons par créer un fichier .env.local dans notre répertoire.

touch .env.local

Éditons-le :

# TWITTER CHANNEL
TWITTER_CONSUMER_KEY='vos_valeurs'
TWITTER_CONSUMER_SECRET='vos_valeurs'
TWITTER_ACCESS_TOKEN='vos_valeurs'
TWITTER_ACCESS_TOKEN_SECRET='vos_valeurs'

Et ajoutons ces variables dans notre fichier ./config/services.yaml pour y avoir accĂšs dans notre application

parameters:
    TWITTER_CONSUMER_KEY: '%env(TWITTER_CONSUMER_KEY)%'
    TWITTER_CONSUMER_SECRET: '%env(TWITTER_CONSUMER_SECRET)%'
    TWITTER_ACCESS_TOKEN: '%env(TWITTER_ACCESS_TOKEN)%'
    TWITTER_ACCESS_TOKEN_SECRET: '%env(TWITTER_ACCESS_TOKEN_SECRET)%'

Récupérer les données du Gouvernement

Nous récupérons les données sur le site du gouvernement :

Nous utiliserons le jeu de donnĂ©e “suivi-vaccins-covid19-national.json“, dont le lien stable est :

Pour faire notre appel API, mettons en place un service dĂ©diĂ© dans ./src/Service/GetData.php qui retournera directement une “string”, ce string sera le contenu du post Twitter !

<?php

namespace App\Service;

use DateTime;
use Symfony\Contracts\HttpClient\HttpClientInterface;

class GetDataService
{
    private $client;

    public function __construct(HttpClientInterface $client)
    {
        $this->client = $client;
    }

    public function fromGouv(): string
    {

        $response = $this->client->request(
            'GET',
            'https://www.data.gouv.fr/fr/datasets/r/b39196f2-97c4-42f4-8dee-5eb07e823377'
        );

        $lastData = array_key_last($response->toArray());

        $date = new DateTime($response->toArray()[$lastData]['date']);
        $nombre = $response->toArray()[$lastData]['total_vaccines'];

        return 'Au ' . $date->format('d/m/Y') . ', il y a ' . $nombre . ' personnes de vaccinées en France !';
    }
}

Envoyer un Tweet

Nous allons avoir besoin d’envoyer un tweet (c’est un peu le but non), crĂ©ons-nous un service dĂ©diĂ© Ă  cette fonction dans ./src/Service/TwitterApiService.php.

Nous utiliserons ici nos variables de connexion pour l’API de Twitter, et utiliserons la libraire “TwitterOAuth“.

<?php

namespace App\Service;

use Abraham\TwitterOAuth\TwitterOAuth;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

class TwitterApiService
{
    private $getParams;

    public function __construct(ParameterBagInterface $getParams)
    {
        $this->getParams = $getParams;
    }

    public function post(string $content)
    {
        $consumerKey = $this->getParams->get('TWITTER_CONSUMER_KEY');
        $consumerSecret = $this->getParams->get('TWITTER_CONSUMER_SECRET');
        $accesToken = $this->getParams->get('TWITTER_ACCESS_TOKEN');
        $accesTokenSecret = $this->getParams->get('TWITTER_ACCESS_TOKEN_SECRET');
        $connection = new TwitterOAuth($consumerKey, $consumerSecret, $accesToken, $accesTokenSecret);
        $connection->post("statuses/update", ["status" => $content]);
    }
}

Création de la commande

CrĂ©ons un fichier ./src/Command/VaccinBot.php, et mettons en place la commande “php bin/console bot:post“.

<?php

namespace App\Command;


use App\Service\GetDataService;
use App\Service\TwitterApiService;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class VaccinBot extends Command
{
    private $getData;
    private $twitterApi;
    protected static $defaultName = 'bot:post';

    public function __construct(GetDataService $getData, TwitterApiService $twitterApi)
    {
        parent::__construct();
        $this->getData = $getData;
        $this->twitterApi = $twitterApi;
    }

    protected function configure()
    {
        
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $content = $this->getData->fromGouv();
        $this->twitterApi->post($content);
        return Command::SUCCESS;
    }
}

Testons notre commande dans le terminal.

php bin/console bot:post

Et vérifions sur notre compte Twitter !

Programmons l’exĂ©cution de notre commande (Exemple sous Ubuntu 20.04)

Nous souhaitons envoyer notre tweet tous les jours Ă  18:00 par exemple. Ajoutons notre commande dans la crontab.

Éditons le fichier /etc/crontab

sudo nano /etc/crontab

Et ajoutons l’exĂ©cution de commande tous les jours Ă  18:00.

0 18 * * * root cd /foo/bar/VaccinBot && php bin/console bot:post

Et voilà 😉

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.