CoddityTeam / movaicode

Concours mensuel du Pire Développeur de France
123 stars 10 forks source link

OCR API #78

Closed Oli8 closed 2 years ago

Oli8 commented 3 years ago

On crée une image avec le texte écrit pour chaque entrée de la liste de chaîne. On envoie ensuite ces images a une API de reconnaissance de caractere et utilisons le résultat du procédé pour determiner si la chaine était cadeau. *nécessite un compte ocrrestful pour tester

class CountCadeau {
  const API_SECRET = '...';
  const API_ID = '...';
  private $words = [];
  private $handles = [];

  public function __construct(array $words) {
    $this->words = $words;
  }

  public function run(): int {
    $this->create_images();
    $this->process_images();
    return $this->count_cadeau();
  }

  private function create_images() {
    foreach ($this->words as $word) {
      self::create_image($word);
    }
  }

  private function process_images() {
    $this->handles = array_map(
      fn($word) => self::send_for_processing($word),
      $this->words
    );
  }

  private function count_cadeau(): int {
    return array_reduce($this->handles, function(int $acc, string $handle) {
      if (self::get_result($handle) === 'cadeau') {
        $acc++;
      }
      return $acc;
    }, 0);
  }

  private static function create_image(string $text) {
    $img = imagecreate(200, 30);

    $bg = imagecolorallocate($img, 255, 255, 255);
    $text_color = imagecolorallocate($img, 0, 0, 120);

    imagestring($img, 5, 0, 0, $text, $text_color);

    imagepng($img, "./$text.png");
    imagedestroy($img);
  }

  private static function send_for_processing(string $image_filename): string {
    $cmd = 'curl -X POST --data-binary @'. $image_filename
           . '.png -H "secret:' . self::API_SECRET
           .'" -H "content-type:image/png" https://api.ocrestful.com/'
           . self::API_ID . '/res';
    exec($cmd, $result);

    return json_decode($result[0])->handle;
  }

  private static function get_result(string $handle): string {
    $cmd = 'curl -X GET  https://api.ocrestful.com/'
           . self::API_ID . '/res/'. $handle .  ' -H "secret:'
           . self::API_SECRET . '"';
    exec($cmd, $result);

    $data = json_decode($result[0])->children;
    return implode(' ', self::find_text_tontent($data));
  }

  private static function find_text_tontent($process_result, array $found=[]): array {
    foreach($process_result as $key => $value) {
      if (is_array($value) || is_object($value)) {
        $found = self::find_text_tontent($value, $found);
      }
      else if($key === "textContent") {
        $found[] = $value;
      }
    }

    return $found;
  }
}

$words = ["cadeau", "pourri", "cadeau", "revendre", "écharpe",
          "transformer", "smartbox", "pyrénéens", "goldeneye64", "cadeau"];
echo (new CountCadeau($words))->run(); // => 3
mehdi-dalil commented 3 years ago

image

Oli8 commented 3 years ago

@mehdi-dalil pk y'a écrit "PAGE 1" alors qu'on voit qu'il a déjà passé des dizaines de pages ?

mehdi-dalil commented 3 years ago

parce que le script qui gère la pagination est écrit en php

louismarslen commented 3 years ago

Olivier, tu es le grand gagnant interne du MOVAI CODE 2, nos humbles félicitations pour cette performance !

N'hésite pas à venir me réclamer ta récompense 😊

louismarslen commented 2 years ago

Je fais un peu de ménage dans les issues -> d'ailleurs go participer à l'édition 5