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
- libcurl (https://github.com/curl/curl)
- json (https://github.com/nlohmann/json)
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;
}