Portal de Notícias

日々ナビ Hibinavi

O Japão do dia a dia em uma página

Portal japonês com notícias, clima das principais cidades, câmbio, alertas de terremoto, entretenimento, compras e blog — tudo atualizado automaticamente duas vezes por dia.

ver detalhes técnicos
Página inicial com notícias, clima e o horário da próxima atualização

O desafio

Reunir numa página só o que o público japonês confere todo dia (notícias, clima, câmbio e terremotos), usando serviços de dados com limite de uso, sem que o custo cresça junto com o número de visitantes.

O que foi feito

  • Página inicial em japonês com notícias do Japão, clima de cinco cidades (Tóquio, Osaka, Kyoto, Hiroshima e Nagoya), câmbio do iene e o último terremoto registrado
  • Atualização automática às 00h e 12h (horário de Brasília), com aviso no topo de quando foi a última e quando será a próxima
  • Páginas próprias para notícias de esportes e tecnologia
  • Blog com painel de publicação protegido por login Google, liberado só para e-mails autorizados
  • Tema claro e escuro, aviso de cookies e espaços de anúncio (Google AdSense)

Resultado

No ar em hibinavi.lotmhub.com.br desde novembro de 2024, atualizado sozinho duas vezes por dia com um número fixo de consultas às fontes de dados, independente de quantas pessoas acessam.

Telas do projeto

Notícias de esportes em página própria
Notícias de esportes em página própria
Blog com as publicações da redação
Blog com as publicações da redação
Tema claro da página inicial
Tema claro da página inicial
Página inicial no celular
Página inicial no celular
Clima por cidade, com seletor (Osaka)
Clima por cidade, com seletor (Osaka)
Câmbio do iene e último terremoto registrado
Câmbio do iene e último terremoto registrado
Notícias de esportes no celular
Notícias de esportes no celular

// por dentro

Como foi construído

Site estático (HTML, CSS e JavaScript puro, sem framework nem etapa de build) servido pela Vercel, com Serverless Functions em Node para a parte dinâmica. Um Vercel Cron roda duas vezes por dia, busca em paralelo notícias (NewsData.io), clima (OpenWeatherMap), câmbio (open.er-api) e terremotos (P2PQuake) e grava um único JSON no Vercel Blob; as rotas de leitura só leem esse JSON, com cache de CDN, e o navegador ainda guarda o resultado em localStorage por janela de atualização. O blog usa o mesmo Blob como armazenamento, com login Google (OAuth) e sessão assinada por HMAC.

Front-end
HTML5CSS3 (variáveis, grid, tema claro/escuro) e JavaScript purosem dependências nem build
Back-end
Vercel Serverless Functions (Node, ES modules) em /api
Dados
Vercel Blob (@vercel/blob 2.x) como cache das APIs externas e armazenamento do blog e das imagens
Integrações
NewsData.ioOpenWeatherMapopen.er-api (câmbio)P2PQuake (terremotos)Google OAuthGoogle AdSense
Infra
Vercel com Cron Jobs (03:00 e 15:00 UTC)rewrites para URLs limpas e redirecionamento 301 do domínio antigo

Performance

Custo de API fixo, independente do tráfego

Só o endpoint do Cron chama as APIs externas: 10 requisições por execução, 2 execuções por dia. As rotas públicas leem o JSON do Blob com Cache-Control s-maxage=900 e stale-while-revalidate, e o front guarda em localStorage por slot (00h/12h), então um pico de visitas não gasta cota das APIs.

Arquitetura

Agregação tolerante a falhas

As cinco fontes são buscadas em paralelo com Promise.all, e cada chamada passa por um wrapper que devolve null em vez de lançar. Se o serviço de clima ou de câmbio cair, o restante do portal é gravado e exibido normalmente; na primeira visita sem cache, o servidor popula o Blob uma única vez.

Segurança

Chaves só no servidor e Cron protegido

O navegador nunca vê as chaves do NewsData e do OpenWeatherMap: elas ficam em variáveis de ambiente lidas só pelo Cron. O endpoint /api/cron/refresh exige o header Authorization com o CRON_SECRET enviado pela Vercel.

Segurança

Login Google sem biblioteca de auth

Fluxo OAuth 2.0 implementado à mão: cookie de state contra CSRF, troca do code no servidor, checagem de iss, aud e email_verified do id_token e allowlist de e-mails. A sessão é um token assinado com HMAC-SHA256 (crypto nativo) em cookie HttpOnly, Secure e SameSite=Lax, comparado com timingSafeEqual e com validade de 12 horas.

Segurança

Upload validado direto para o Blob

A rota de upload exige sessão, aceita só data URLs de tipo image/*, limita o arquivo a 4 MB (teto do corpo das Functions) e sanitiza o nome antes de gravar no Vercel Blob.

SEO

SEO de um site sem framework

Meta tags, Open Graph e JSON-LD no HTML, canonical, sitemap.xml e robots.txt que bloqueia /api e /admin. Nas páginas geradas no cliente (posts e categorias), o JavaScript atualiza título, Open Graph e injeta JSON-LD de BreadcrumbList; os dados de APIs externas são escapados antes de entrar no DOM.

Quer um projeto como este?

Conte o que você precisa e receba uma proposta sem compromisso.

Pedir orçamento