Pitch: Usando a API do Tabnews no C++

Eu sei que isso não será complexo, mas é um exercício interessante para quem nunca viu C++ mexendo com API. Fiz o código a fim de que pessoas possam entender, sem muitas complicações.

Objetivo é apenas compartilhar, aqui no tabnews, o C++ usando a api do tabnews, para que iniciantes ou qualuquer público entenda como tabnews é incrível!

requisítos

o que está acontecendo

Com o CURL, eu faço uma GET na segunite url: "https://www.tabnews.com.br/api/v1/contents?...", que segundo a documentação retorna os conteúdos baseado em categorias como "old", "new" e "best. (pode-se observar no main.cpp)

Uso uma "write function", para que possa armazenar o conteúdo json, em um string, e assim poder interpreta-lo e imprimir com um "layout" bonito.

executando

Novas melhorias: TabCoins mais consistentes e outras 4 melhorias 🎉
by filipedeschamps - 2022-09-05T14:53:46.358Z
tabcoins: 1
----------------------------------------------------------------------------------------------
TikTok nega violação após hackers anunciarem ataque
by gugadeschamps - 2022-09-05T14:46:34.412Z
tabcoins: 2
----------------------------------------------------------------------------------------------
Criador do Node.js e Deno pede que Oracle libere a marca registrada do JavaScript
by gugadeschamps - 2022-09-05T13:48:06.030Z
tabcoins: 3
----------------------------------------------------------------------------------------------
3 vezes que a faculdade te ensinou a programar e você não percebeu
by obrunoanastacio - 2022-09-05T12:12:05.807Z
tabcoins: 7
----------------------------------------------------------------------------------------------
Estudo ou trabalho?
by RafaDark - 2022-09-04T22:43:50.135Z
tabcoins: 5
----------------------------------------------------------------------------------------------
Templates em Django
by jackson541 - 2022-09-04T15:08:59.153Z
tabcoins: 11
----------------------------------------------------------------------------------------------
Detecting CSS Libraries
by gorpo85 - 2022-09-04T14:08:19.626Z
tabcoins: 2
----------------------------------------------------------------------------------------------

Source Code

// TabnewsApi.hpp
#ifndef TABNEWSAPI_HPP_
#define TABNEWSAPI_HPP_

#include <iostream>
#include <cstring>
#include <curl/curl.h>

class TabnewsApi
{
public:
  TabnewsApi() noexcept;

  void request(const std::string&);
  void setMemory(std::string*);

  virtual ~TabnewsApi();
private:
  CURL *curl;
  CURLcode request_status;

  virtual void prepareCurl();
  virtual void settingCurlOpt();
  static size_t curlWrite(void*, size_t, size_t, void*);

};

#endif
// TabnewsApi.cpp
#include "TabnewsApi.hpp"

#include <stdlib.h>
#include <stdexcept>

TabnewsApi::TabnewsApi() noexcept
{
  prepareCurl();
}


void TabnewsApi::request(const std::string &url)
{
  curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

  request_status = curl_easy_perform(curl);
  if(request_status != CURLE_OK)
    throw std::runtime_error("Error<" + std::to_string(request_status) + ">: " + curl_easy_strerror(request_status));
}

void TabnewsApi::prepareCurl()
{
  curl = curl_easy_init();
  if(!curl)
    throw std::runtime_error("Error<prepareCurl>: curl not has made.\n");
  settingCurlOpt();
}
void TabnewsApi::settingCurlOpt()
{
  curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, TabnewsApi::curlWrite);
}

size_t TabnewsApi:: curlWrite(void *data, size_t size, size_t nmemb, void *stream)
{
  size_t realsize = nmemb * size;
  ((std::string *) stream)->append((char*) data, realsize);
  return realsize;
}
void TabnewsApi::setMemory(std::string *mem)
{
  curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*) mem);
}

TabnewsApi::~TabnewsApi()
{
  curl_easy_cleanup(curl);
}
#include <iostream>
#include <nlohmann/json.hpp>
#include <iomanip>
#include "TabnewsApi.hpp"

#include <sys/ioctl.h>
#include <unistd.h>

using json = nlohmann::json;

int getWindowWidth()
{
  struct winsize w;
  ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
  return w.ws_col;
}

int main()
{
  TabnewsApi api;
  std::string mem;

  api.setMemory(&mem);

  api.request("https://www.tabnews.com.br/api/v1/contents?page=1&per_page=100&strategy=new");
  json data = json::parse(mem);

  for(auto &j : data)  
  {
    std::string
      slug = j["title"].get<std::string>(),
      date = j["created_at"].get<std::string>(),
      owner = j["owner_username"].get<std::string>();
    std::cout <<
      slug << "\nby \033[35m" << owner << " - \033[0m" << date << "\n" <<
      "tabcoins: " << j["tabcoins"] << "\n" <<
      std::setfill('-') << std::setw(getWindowWidth()) << "\n";
  }

  return EXIT_SUCCESS;
}

Prevejo no futuro uma notificação do canal do filipe, "10 projetos massas usando a api do tabnews", onde ele entra em um repositório opensource com uma lista grande de projetos criados a partir da api do tabnews, e lista os 10 mais sensacionais. E pede pra ficar até o final do vídeo por que vai valer a pena ouvir o que tem a dizer no final.

Quando esse dia chegar vai ser um marco na história do tabnews hahaha

Realmente seria muito épico.