@danhachuel/thunderbolt 0.5.88 → 0.5.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/app/main.py CHANGED
@@ -8410,6 +8410,22 @@ def render_youtube_frontend_upload_tutorial():
8410
8410
  st.markdown(tutorial_content, unsafe_allow_html=False)
8411
8411
 
8412
8412
 
8413
+ def render_youtube_data_api_key_tutorial():
8414
+ """Render the YouTube Data API key guide for public data workflows."""
8415
+ tutorial_path = ROOT / "seed" / "references" / "tutorial-youtube-data-api-key.md"
8416
+ st.title("Tutorial YouTube Data API Key (Public Data)")
8417
+ st.caption("Guia para criar e configurar uma YouTube Data API Key para consultas de dados públicos.")
8418
+ st.markdown("[Abrir documento fonte no Google Drive](https://drive.google.com/file/d/1ypzaR1v8khBxyUQmZ12ZAY0pGTD49mqt/view)")
8419
+ try:
8420
+ tutorial_content = tutorial_path.read_text(encoding="utf-8").strip()
8421
+ except OSError:
8422
+ tutorial_content = ""
8423
+ if not tutorial_content:
8424
+ st.error("O conteúdo local do tutorial não está disponível. Consulte o documento fonte no Google Drive.")
8425
+ return
8426
+ st.markdown(tutorial_content, unsafe_allow_html=False)
8427
+
8428
+
8413
8429
  def render_mcp():
8414
8430
  st.title("MCP")
8415
8431
  st.caption("Clientes externos, servidor MCP do Thunderbolt e a skill local ficam separados para evitar confundir funções diferentes.")
@@ -8812,6 +8828,7 @@ def main():
8812
8828
  ("Tutorial Apify", ":material/menu_book:", "Tutorial Apify"),
8813
8829
  ("Tutorial YouTube Video-Upload Frontend", ":material/video_library:", "Tutorial YouTube Video-Upload Frontend"),
8814
8830
  ("Tutorial OAuth do Google", ":material/key:", "Tutorial OAuth do Google"),
8831
+ ("Tutorial YouTube Data API Key (Public Data)", ":material/vpn_key:", "Tutorial YouTube Data API Key (Public Data)"),
8815
8832
  ]
8816
8833
  settings_items = [
8817
8834
  ("MCP", ":material/hub:", "MCP"),
@@ -8867,7 +8884,7 @@ def main():
8867
8884
  "AI Influencers": "/ai-influencers", "Personagens": "/ai-influencers/personagens", "Geração de Conteúdo IA": "/ai-influencers/geracao-conteudo", "Motion Control": "/ai-influencers/motion-control", "UGC Products": "/ai-influencers/ugc-products", "Redes Sociais": "/ai-influencers/redes-sociais",
8868
8885
  "Edição": "/edicao", "Limpador de Metadados": "/edicao/limpador-metadados", "Cortes": "/edicao/cortes", "Editor Python": "/edicao/editor-python", "Download Mídia": "/edicao/download-midia",
8869
8886
  "Growth": "/growth", "Analista Growth Youtube": "/growth/youtube", "Analista Growth Tiktok": "/growth/tiktok", "Analista Growth Instagram": "/growth/instagram", "Analista Facebook Pages": "/growth/facebook-pages", "Analista Bilibili": "/growth/bilibili",
8870
- "Documentação": "/documentacao", "Tutorial Meta": "/documentacao/meta", "Tutorial Supabase": "/documentacao/supabase", "Tutorial Kaggle": "/documentacao/kaggle", "Tutorial Apify": "/documentacao/apify", "Tutorial YouTube Video-Upload Frontend": "/documentacao/youtube-video-upload-frontend", "Tutorial OAuth do Google": "/documentacao/oauth-google",
8887
+ "Documentação": "/documentacao", "Tutorial Meta": "/documentacao/meta", "Tutorial Supabase": "/documentacao/supabase", "Tutorial Kaggle": "/documentacao/kaggle", "Tutorial Apify": "/documentacao/apify", "Tutorial YouTube Video-Upload Frontend": "/documentacao/youtube-video-upload-frontend", "Tutorial OAuth do Google": "/documentacao/oauth-google", "Tutorial YouTube Data API Key (Public Data)": "/documentacao/youtube-data-api-key",
8871
8888
  "Configurações": "/configuracoes", "MCP": "/configuracoes/mcp", "Notificações": "/configuracoes/notificacoes", "Logs": "/configuracoes/logs", "Configuração API": "/configuracoes/api",
8872
8889
  }
8873
8890
 
@@ -8989,6 +9006,7 @@ def main():
8989
9006
  "Tutorial Supabase": render_supabase_tutorial,
8990
9007
  "Tutorial YouTube Video-Upload Frontend": render_youtube_frontend_upload_tutorial,
8991
9008
  "Tutorial OAuth do Google": render_google_oauth_tutorial,
9009
+ "Tutorial YouTube Data API Key (Public Data)": render_youtube_data_api_key_tutorial,
8992
9010
  "Configurações": lambda: render_edit_placeholder("Configurações", "Seleccione uma opção no menu expansível."),
8993
9011
  "MCP": render_mcp,
8994
9012
  "Contas Google": render_google_accounts,
@@ -40,9 +40,9 @@ def _authorization_error_message(email: str, exc: Exception) -> str:
40
40
  if "redirect_uri_mismatch" in detail.lower():
41
41
  return (
42
42
  f"A autorização da conta {email} foi rejeitada pelo Google (redirect_uri_mismatch). "
43
- f"Use um cliente OAuth do tipo Desktop app ou adicione exactamente {loopback_redirect_uri()} "
44
- "em Google Cloud > APIs e serviços > Credenciais > URIs de redireccionamento autorizados. "
45
- "Não use uma URI sem a porta, com localhost diferente ou sem a barra final."
43
+ "Este fluxo usa um callback local loopback; crie ou seleccione uma credencial OAuth do tipo "
44
+ "Aplicativo para computador (Desktop app), não Aplicativo da Web. "
45
+ f"A porta predefinida é {loopback_redirect_uri()} e pode mudar automaticamente se estiver ocupada."
46
46
  )
47
47
  return f"A autorização da conta {email} falhou: {detail}"
48
48
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danhachuel/thunderbolt",
3
- "version": "0.5.88",
3
+ "version": "0.5.90",
4
4
  "description": "Thunderbolt — interface local para operação de canais faceless e motor MoneyPrinterTurbo",
5
5
  "license": "MIT",
6
6
  "main": "scripts/cli.mjs",
@@ -4,7 +4,7 @@ Este tutorial explica como criar um projecto no Google Cloud, activar a YouTube
4
4
 
5
5
  ## Pré-requisitos
6
6
 
7
- Antes de começar, certifique-se de que tem uma conta Google, acesso ao [Google Cloud Console](https://console.cloud.google.com/) e o Thunderbolt instalado e em execução localmente. A aplicação em execução é necessária para confirmar a URI de redireccionamento OAuth utilizada pelo projecto.
7
+ Antes de começar, certifique-se de que tem uma conta Google, acesso ao [Google Cloud Console](https://console.cloud.google.com/) e o Thunderbolt instalado e em execução localmente. A aplicação em execução é necessária para concluir o callback OAuth local.
8
8
 
9
9
  ## Passo 1 — Aceder ao Google Cloud Console
10
10
 
@@ -68,30 +68,11 @@ Na página da tela de consentimento OAuth, abra o separador **Público-alvo** e,
68
68
 
69
69
  ## Passo 6 — Criar as credenciais OAuth
70
70
 
71
- No menu lateral, abra **APIs e Serviços → Credenciais** e clique em **+ Criar credenciais → ID do cliente OAuth**. Em **Tipo de aplicativo**, seleccione **Aplicativo da Web** e atribua um nome, por exemplo, `Thunderbolt Web Client`.
71
+ No menu lateral, abra **APIs e Serviços → Credenciais** e clique em **+ Criar credenciais → ID do cliente OAuth**. Em **Tipo de aplicativo**, seleccione **Aplicativo para computador** (também apresentado como **Desktop app**) e atribua um nome, por exemplo, `Thunderbolt Desktop Client`.
72
72
 
73
- ### Origens JavaScript autorizadas
73
+ > **Importante:** o Thunderbolt usa `InstalledAppFlow` com um callback local loopback. Não seleccione **Aplicativo da Web**. Essa credencial exige URIs fixas e causa `Erro 400: redirect_uri_mismatch` neste fluxo.
74
74
 
75
- Clique em **Adicionar URI** e introduza a origem onde o frontend é executado, por exemplo:
76
-
77
- ```text
78
- http://localhost:3000
79
- ```
80
-
81
- Se existir um ambiente de produção, adicione também a origem HTTPS correspondente, por exemplo `https://seudominio.com`.
82
-
83
- ### URIs de redireccionamento autorizadas
84
-
85
- Esta é a parte mais crítica. Clique em **Adicionar URI** e introduza a URI exacta utilizada pelo Thunderbolt para o callback OAuth. Exemplos de desenvolvimento local:
86
-
87
- ```text
88
- http://localhost:3000/api/auth/google/callback
89
- http://localhost:5173/oauth2callback
90
- ```
91
-
92
- > **A URI tem de ser exactamente igual à configurada no código do Thunderbolt.** Uma barra final diferente, o uso de `http` em vez de `https` ou uma porta diferente causa o erro `redirect_uri_mismatch`.
93
-
94
- Se não souber qual é a URI utilizada, consulte a configuração ou o ficheiro de ambiente do Thunderbolt e confirme também os logs da aplicação.
75
+ Uma credencial **Desktop app** não precisa de **Origens JavaScript autorizadas** nem de adicionar manualmente uma URI de redireccionamento. O Thunderbolt inicia o callback local em `http://127.0.0.1:8765/`; se essa porta estiver ocupada, escolhe automaticamente outra porta loopback livre.
95
76
 
96
77
  Clique em **Criar**. Na janela apresentada, copie o **ID do cliente (Client ID)** e a **Chave secreta do cliente (Client Secret)** e guarde-os num local seguro.
97
78
 
@@ -99,34 +80,26 @@ Clique em **Criar**. Na janela apresentada, copie o **ID do cliente (Client ID)*
99
80
 
100
81
  ## Passo 7 — Configurar o Thunderbolt
101
82
 
102
- O projecto utiliza variáveis de ambiente para as credenciais OAuth. Localize o ficheiro de ambiente do Thunderbolt, normalmente `.env`, `.env.local` ou o ficheiro de configuração equivalente, e adicione:
83
+ Na aba **Configurações → Configuração API → API Keys Upload → Contas Google**, crie ou edite a conta Google e cole o **Client ID** e o **Client Secret** da credencial **Desktop app**. Guarde a conta e clique em **Autorizar/Reautorizar**.
103
84
 
104
- ```env
105
- GOOGLE_CLIENT_ID=seu_client_id_aqui
106
- GOOGLE_CLIENT_SECRET=sua_client_secret_aqui
107
- GOOGLE_REDIRECT_URI=http://localhost:3000/api/auth/google/callback
108
- ```
109
-
110
- Substitua `seu_client_id_aqui` e `sua_client_secret_aqui` pelos valores copiados no passo anterior. Confirme que `GOOGLE_REDIRECT_URI` é exactamente igual à URI registada no Google Cloud Console.
85
+ Não é necessário configurar `GOOGLE_REDIRECT_URI` nem adicionar uma URI de callback de `localhost` no Google Cloud Console: o callback loopback é criado pelo `InstalledAppFlow` durante a autorização.
111
86
 
112
87
  ## Passo 8 — Testar a autenticação
113
88
 
114
- Reinicie o servidor do Thunderbolt para carregar as novas variáveis de ambiente. Abra a interface e tente iniciar sessão com o Google.
89
+ Abra a interface do Thunderbolt e tente autorizar a conta Google.
115
90
 
116
91
  O fluxo esperado é:
117
92
 
118
93
  1. O Google apresenta a tela de consentimento com o nome do app e os escopos solicitados.
119
94
  2. O utilizador autoriza o acesso.
120
- 3. O Google redirecciona para a URI de callback do Thunderbolt.
121
- 4. A autenticação é concluída com sucesso na aplicação.
95
+ 3. O Google redirecciona para o callback local do Thunderbolt.
96
+ 4. A autenticação é concluída e o token é guardado no storage local da conta.
122
97
 
123
98
  ## Solução de problemas
124
99
 
125
100
  ### Erro `redirect_uri_mismatch`
126
101
 
127
- Este erro significa que a URI enviada pelo Thunderbolt não corresponde exactamente à URI registada no Google Cloud Console.
128
-
129
- Verifique a URI utilizada nos logs ou no código do Thunderbolt. Depois, abra **Credenciais**, seleccione o ID do cliente e adicione a URI exacta em **URIs de redireccionamento autorizadas**. Aguarde um a dois minutos para a configuração se propagar, limpe o cache do navegador e tente novamente.
102
+ Este erro ocorre normalmente quando foi criada uma credencial **Aplicativo da Web** para o fluxo local. Abra **APIs e Serviços → Credenciais**, crie uma nova credencial **ID do cliente OAuth → Aplicativo para computador (Desktop app)**, substitua o Client ID e o Client Secret na conta Google do Thunderbolt e tente novamente. Não tente corrigir este fluxo adicionando uma URI de `localhost` numa credencial Web.
130
103
 
131
104
  ### Erro `invalid_request` ou `access_denied`
132
105
 
@@ -134,7 +107,7 @@ Confirme se o seu e-mail foi adicionado como utilizador de teste no passo 5. Ver
134
107
 
135
108
  ### Mensagem “Acesso bloqueado: solicitação inválida”
136
109
 
137
- Na maioria dos casos, esta mensagem está relacionada com uma URI de redireccionamento incorrecta. Reveja cuidadosamente os passos 6 e 7, verificando protocolo, domínio, porta, caminho e barras finais.
110
+ Confirme primeiro que a credencial é **Aplicativo para computador (Desktop app)** e não **Aplicativo da Web**. Depois confirme que a conta Google foi adicionada como utilizador de teste e que a YouTube Data API v3 está activa.
138
111
 
139
112
  ## Escopos importantes para o YouTube
140
113
 
@@ -0,0 +1,96 @@
1
+ # Tutorial YouTube Data API Key (Public Data)
2
+
3
+ Este tutorial explica como criar uma **YouTube Data API Key** no Google Cloud e configurá-la no Thunderbolt para consultar dados públicos do YouTube, como vídeos, canais e estatísticas públicas.
4
+
5
+ > **Fonte:** [Tutorial YouTube Data API Key (Public Data) no Google Drive](https://drive.google.com/file/d/1ypzaR1v8khBxyUQmZ12ZAY0pGTD49mqt/view)
6
+
7
+ ## Quando usar uma API Key
8
+
9
+ Uma API Key é suficiente para operações com dados públicos, como pesquisar vídeos, consultar canais públicos e obter estatísticas públicas. Ela **não concede acesso a dados privados** da conta nem substitui o OAuth 2.0 para playlists privadas, inscrições privadas ou uploads.
10
+
11
+ ## Passo 1 — Aceder ao Google Cloud Console
12
+
13
+ Abra o [Google Cloud Console](https://console.cloud.google.com/) e faça login com a conta Google que irá gerir a credencial.
14
+
15
+ ## Passo 2 — Criar ou seleccionar um projecto
16
+
17
+ No topo da página, abra o selector de projectos junto ao logótipo do Google Cloud. Seleccione **Novo projecto**, dê-lhe um nome, como `Thunderbolt YouTube`, mantenha a organização e a localização predefinidas quando aplicável e clique em **Criar**. Depois de alguns instantes, seleccione o projecto criado.
18
+
19
+ ## Passo 3 — Activar a YouTube Data API v3
20
+
21
+ No menu lateral, abra **APIs e Serviços → Biblioteca**. Pesquise por **YouTube Data API v3**, abra o resultado correspondente e clique em **Activar**.
22
+
23
+ > **Importante:** a API não é activada automaticamente em projectos novos. Sem este passo, a API Key não poderá fazer chamadas à YouTube Data API v3.
24
+
25
+ ## Passo 4 — Criar a credencial API Key
26
+
27
+ No menu lateral, abra **APIs e Serviços → Credenciais** e clique em **+ Criar credenciais → Chave de API**. O Google irá gerar a chave e apresentá-la numa janela. Copie-a e guarde-a num local seguro; depois clique em **Concluído**.
28
+
29
+ No Thunderbolt, a chave deve ser configurada em **Configurações → Configuração API → API Keys Upload → API Innertube**, no campo `INNERTUBE_API_KEY`. Esta é a chave global usada pelos fluxos que consultam dados públicos do YouTube.
30
+
31
+ ## Passo 5 — Restringir a chave (recomendado)
32
+
33
+ A restrição reduz o impacto de uma eventual exposição da chave. Na lista de credenciais do Google Cloud, clique no ícone de edição junto à chave criada e, em **Restrições de API**, seleccione **Restringir chave**. Em **Seleccionar APIs**, marque **YouTube Data API v3** e clique em **Guardar**.
34
+
35
+ Se a chave for usada apenas por uma aplicação local, reveja também as restrições de aplicação disponíveis no Google Cloud e escolha uma configuração compatível com o ambiente onde o Thunderbolt é executado.
36
+
37
+ ## Passo 6 — Configurar e testar no Thunderbolt
38
+
39
+ 1. Abra **Configurações**.
40
+ 2. Abra **Configuração API**.
41
+ 3. Seleccione **API Keys Upload**.
42
+ 4. Abra **API Innertube**.
43
+ 5. Cole a YouTube Data API Key no campo `INNERTUBE_API_KEY`.
44
+ 6. Guarde a configuração.
45
+ 7. Execute uma funcionalidade que consulte dados públicos, como pesquisa ou importação de um canal público.
46
+
47
+ A API Key não deve ser colocada nos campos Client ID ou Client Secret das **Contas Google**. Esses campos pertencem ao fluxo OAuth 2.0, que é independente da API Key.
48
+
49
+ ## O que é possível fazer com a chave
50
+
51
+ Com a YouTube Data API v3 e uma API Key, o Thunderbolt pode consultar, conforme o fluxo utilizado:
52
+
53
+ - Vídeos e respectivos metadados públicos.
54
+ - Canais e informações públicas do canal.
55
+ - Estatísticas públicas de vídeos e canais.
56
+ - Pesquisas de conteúdos públicos.
57
+ - Playlists públicas.
58
+
59
+ Para criar playlists, fazer uploads, consultar dados privados ou agir em nome da conta Google, utilize o tutorial **OAuth do Google** e autorize a conta através de uma credencial **Aplicativo para computador (Desktop app)**.
60
+
61
+ ## Cota diária
62
+
63
+ A YouTube Data API v3 aplica uma quota diária por projecto. Cada operação consome unidades de quota diferentes; operações de pesquisa costumam consumir mais unidades do que consultas simples. A quota predefinida é frequentemente apresentada pelo Google como aproximadamente **10.000 unidades por dia**, mas o valor efectivo e as regras podem variar por projecto.
64
+
65
+ Consulte o consumo em **APIs e Serviços → YouTube Data API v3 → Quotas** no Google Cloud Console. Evite chamadas repetidas desnecessárias e mantenha a chave restrita à API necessária.
66
+
67
+ ## Segurança e manutenção
68
+
69
+ Nunca publique a API Key em repositórios, capturas de ecrã, mensagens ou páginas públicas. Se a chave for exposta, abra a lista de credenciais no Google Cloud, revogue ou elimine a chave comprometida e crie uma nova. Depois, actualize o valor guardado no Thunderbolt.
70
+
71
+ A API Key não substitui o Client Secret OAuth e não deve ser partilhada com outras pessoas. Use uma chave separada para cada ambiente quando isso facilitar a auditoria e a revogação.
72
+
73
+ ## Solução de problemas
74
+
75
+ ### A API devolve `SERVICE_DISABLED`
76
+
77
+ Confirme que o projecto seleccionado é o mesmo projecto associado à API Key e que **YouTube Data API v3** está activa em **APIs e Serviços → Biblioteca**.
78
+
79
+ ### A API devolve `API_KEY_INVALID`
80
+
81
+ Confirme que copiou a chave completa, sem espaços ou aspas adicionais, e que o valor foi guardado no campo `INNERTUBE_API_KEY` correcto.
82
+
83
+ ### A API devolve `quotaExceeded`
84
+
85
+ Consulte a quota do projecto no Google Cloud Console, reduza pesquisas repetidas e aguarde a reposição da quota. Se a utilização legítima justificar, consulte as opções de quota apresentadas pelo Google.
86
+
87
+ ### Preciso de dados privados ou uploads
88
+
89
+ Uma API Key só identifica o projecto e permite chamadas autorizadas para dados públicos. Para dados privados, uploads ou operações em nome de uma conta, configure o OAuth 2.0 através do **Tutorial OAuth do Google**.
90
+
91
+ ## Referências
92
+
93
+ - [Google Cloud Console](https://console.cloud.google.com/)
94
+ - [YouTube Data API v3](https://developers.google.com/youtube/v3)
95
+ - [Documentação de quotas da YouTube Data API](https://developers.google.com/youtube/v3/determine_quota_cost)
96
+ - [Documento fonte no Google Drive](https://drive.google.com/file/d/1ypzaR1v8khBxyUQmZ12ZAY0pGTD49mqt/view)