@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
|
-
|
|
44
|
-
"
|
|
45
|
-
"
|
|
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
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
121
|
-
4. A autenticação é concluída
|
|
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
|
|
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
|
-
|
|
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)
|