File size: 4,080 Bytes
3d1dcee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?php
// MESTRE XCAKE - COFRE DE CHAVES DE API v2.0

// AVISO DE SEGURANÇA: Insira suas chaves de API reais aqui.
// Elas estão seguras pois este código roda exclusivamente no servidor.
$api_keys = [
    'gemini' => 'AIzaSyBRGR_80aOangxTYu45I0S6g_WemsadDnI', // Sua chave Gemini API aqui
    'pexels_images' => 'Ig8Ko8Y2e9TXMYKaopPpVVKtAIh4e1pDD0hQth3gMajaWFggIDlESw0F', // Chave para imagens
    'pexels_videos' => 'Ig8Ko8Y2e9TXMYKaopPpVVKtAIh4e1pDD0hQth3gMajaWFggIDlESw0F'  // Pode ser a mesma chave para vídeos
];

header('Content-Type: application/json');

// Recebe a requisição do frontend
$request_body = file_get_contents('php://input');
$request_data = json_decode($request_body, true);

if (!$request_data || !isset($request_data['service'])) {
    http_response_code(400);
    echo json_encode(['error' => 'Requisição inválida.']);
    exit();
}

$service = $request_data['service'];

// --- Roteador de Serviços ---
switch ($service) {
    case 'gemini_chat':
        handle_gemini_chat($request_data, $api_keys['gemini']);
        break;
    case 'pexels_image':
        handle_pexels_search($request_data, $api_keys['pexels_images'], 'https://api.pexels.com/v1/search');
        break;
    case 'pexels_video':
        handle_pexels_search($request_data, $api_keys['pexels_videos'], 'https://api.pexels.com/videos/search');
        break;
    default:
        http_response_code(400);
        echo json_encode(['error' => 'Serviço desconhecido.']);
        exit();
}

/**
 * Lida com as chamadas para a API Gemini.
 */
function handle_gemini_chat($data, $api_key) { // Corrigido $api_key
    if (strpos($api_key, 'SUA_CHAVE') !== false || empty($api_key)) {
        http_response_code(500);
        echo json_encode(['error' => ['message' => 'A chave da API Gemini não foi configurada ou é inválida no servidor (api_proxy.php).']]);
        exit();
    }

    // Usando o alias mais recente para o modelo Flash.
    // Em Setembro de 2025, 'gemini-2.5-flash-latest' aponta para a versão mais recente do Gemini 2.5 Flash,
    // como 'gemini-2.5-flash-002' ou posterior.
   $geminiUrl = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=' . $api_key;
    
    // Apenas repassa o corpo da requisição já formatado pelo frontend
    $post_data = $data['payload'] ?? [];
    
    // Corrigido: usando $geminiUrl e garantindo que $post_data é um JSON válido.
    echo forward_request($geminiUrl, json_encode($post_data), ['Content-Type: application/json']);
}

/**
 * Lida com as chamadas para a API Pexels (imagens ou vídeos).
 */
function handle_pexels_search($data, $api_key, $api_url_base) {
    if (strpos($api_key, 'SUA_CHAVE') !== false || empty($api_key)) {
        http_response_code(500);
        echo json_encode(['error' => ['message' => 'A chave da API Pexels não foi configurada ou é inválida no servidor (api_proxy.php).']]);
        exit();
    }
    
    $query = $data['query'] ?? 'abstract';
    $api_url = $api_url_base . '?query=' . urlencode($query) . '&per_page=1';
    
    echo forward_request($api_url, null, ['Authorization: ' . $api_key]);
}


/**
 * Função genérica para encaminhar requisições usando cURL.
 */
function forward_request($url, $post_fields = null, $headers = []) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
    if ($post_fields) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
    }
    
    $response = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    if (curl_errno($ch)) {
        http_response_code(500);
        // Não exponha o erro detalhado do cURL ao cliente por segurança
        return json_encode(['error' => 'Erro de comunicação interna do servidor: ' . curl_error($ch)]); // Adicionado erro para debug no servidor
    }
    
    curl_close($ch);
    
    http_response_code($http_code);
    return $response;
}
?>