documentação e headers

This commit is contained in:
Renan Bernordi 2024-12-05 00:37:40 -03:00
parent b5bd84dbd7
commit e729291991
3 changed files with 107 additions and 31 deletions

View file

@ -89,7 +89,7 @@ return [
'next-flags' => null,
'next:ads' => null
],
'customHeaders' => [
'headers' => [
'Referer' => 'https://www.google.com.br/'
]
],

View file

@ -2,48 +2,56 @@
/**
* Classe para gerenciar requisições HTTP usando cURL
* Esta classe fornece uma interface simplificada para realizar requisições HTTP
*/
class Curl
{
/**
* @var array Configurações padrão do cURL
* Armazena as opções básicas que serão utilizadas em todas as requisições
*/
protected $defaultOptions = [];
/**
* @var array Headers HTTP customizados
* @var array Cabeçalhos HTTP personalizados
* Armazena os headers que serão enviados com as requisições
*/
protected $headers = [];
/**
* @var array Cookies para a requisição
* Armazena os cookies que serão enviados com as requisições
*/
protected $cookies = [];
/**
* @var string User agent atual
* @var string Agente do usuário atual
* Identifica o cliente que está fazendo a requisição
*/
protected $userAgent;
/**
* @var array Configurações de proxy
* Armazena as configurações para uso de proxy nas requisições
*/
protected $proxy = [];
/**
* @var int Número máximo de tentativas
* Define quantas vezes a requisição será tentada em caso de falha
*/
protected $maxRetries = 3;
/**
* @var int Delay entre tentativas (microssegundos)
* @var int Intervalo entre tentativas (em microssegundos)
* Define o tempo de espera entre tentativas consecutivas
*/
protected $retryDelay = 500000; // 0.5 segundos
/**
* Construtor
* Inicializa uma nova instância da classe Curl
*
* @param array $options Opções iniciais do cURL
* @param array $options Opções iniciais do cURL para personalização
*/
public function __construct(array $options = [])
{
@ -62,7 +70,8 @@ class Curl
}
/**
* Define headers padrão
* Define os cabeçalhos HTTP padrão
* Configura os headers básicos que serão utilizados em todas as requisições
*/
protected function setDefaultHeaders()
{
@ -75,7 +84,10 @@ class Curl
}
/**
* Define o user agent
* Define o agente do usuário para as requisições
*
* @param string $userAgent String que identifica o cliente
* @return $this Retorna a instância atual para encadeamento de métodos
*/
public function setUserAgent($userAgent)
{
@ -86,14 +98,17 @@ class Curl
}
/**
* Adiciona headers customizados
* Define cabeçalhos HTTP personalizados
*
* @param array $headers Array associativo com os cabeçalhos
* @return $this Retorna a instância atual para encadeamento de métodos
*/
public function setHeaders(array $headers)
{
// Reset headers to default first
// Redefine os headers para o padrão primeiro
$this->setDefaultHeaders();
// Add new headers
// Adiciona os novos headers
foreach ($headers as $name => $value) {
if (!is_string($name) || !is_string($value)) {
continue;
@ -105,6 +120,9 @@ class Curl
/**
* Define cookies para a requisição
*
* @param array $cookies Array associativo com os cookies
* @return $this Retorna a instância atual para encadeamento de métodos
*/
public function setCookies(array $cookies)
{
@ -118,7 +136,13 @@ class Curl
}
/**
* Configura proxy para a requisição
* Configura um proxy para as requisições
*
* @param string $host Endereço do servidor proxy
* @param int $port Porta do servidor proxy
* @param string|null $username Nome de usuário para autenticação no proxy
* @param string|null $password Senha para autenticação no proxy
* @return $this Retorna a instância atual para encadeamento de métodos
*/
public function setProxy($host, $port, $username = null, $password = null)
{
@ -134,7 +158,10 @@ class Curl
}
/**
* Define o número máximo de tentativas
* Define o número máximo de tentativas para uma requisição
*
* @param int $maxRetries Número máximo de tentativas
* @return $this Retorna a instância atual para encadeamento de métodos
*/
public function setMaxRetries($maxRetries)
{
@ -143,7 +170,10 @@ class Curl
}
/**
* Define o delay entre tentativas
* Define o intervalo entre tentativas de requisição
*
* @param int $microseconds Tempo em microssegundos
* @return $this Retorna a instância atual para encadeamento de métodos
*/
public function setRetryDelay($microseconds)
{
@ -153,31 +183,36 @@ class Curl
/**
* Prepara as opções do cURL para a requisição
*
* @param string $url URL da requisição
* @param array $additionalOptions Opções adicionais do cURL
* @return array Retorna array com todas as opções configuradas
* @throws InvalidArgumentException Se a URL não for uma string válida
*/
protected function prepareOptions($url, array $additionalOptions = [])
{
if (!is_string($url)) {
throw new InvalidArgumentException('URL must be a string');
throw new InvalidArgumentException('A URL deve ser uma string');
}
$options = [];
// Add default options
// Adiciona opções padrão
foreach ($this->defaultOptions as $key => $value) {
if (is_int($key)) {
$options[$key] = $value;
}
}
// Set URL
// Define a URL
$options[CURLOPT_URL] = $url;
// Set User Agent
// Define o User Agent
if ($this->userAgent) {
$options[CURLOPT_USERAGENT] = $this->userAgent;
}
// Convert headers array to cURL format
// Converte array de headers para o formato do cURL
$headerLines = [];
foreach ($this->headers as $name => $value) {
$headerLines[] = $name . ': ' . $value;
@ -186,7 +221,7 @@ class Curl
$options[CURLOPT_HTTPHEADER] = $headerLines;
}
// Set Cookies
// Define os Cookies
if (!empty($this->cookies)) {
$cookieStr = implode('; ', array_filter($this->cookies, 'is_string'));
if (!empty($cookieStr)) {
@ -194,7 +229,7 @@ class Curl
}
}
// Set Proxy
// Define o Proxy
if (!empty($this->proxy)) {
$options[CURLOPT_PROXY] = $this->proxy['host'] . ':' . $this->proxy['port'];
if (!empty($this->proxy['username']) && !empty($this->proxy['password'])) {
@ -202,7 +237,7 @@ class Curl
}
}
// Add additional options
// Adiciona opções adicionais
foreach ($additionalOptions as $key => $value) {
if (is_int($key)) {
$options[$key] = $value;
@ -214,6 +249,11 @@ class Curl
/**
* Executa uma requisição HTTP
*
* @param string $url URL da requisição
* @param array $options Opções adicionais do cURL
* @return array Retorna array com o conteúdo e informações da requisição
* @throws Exception Se a requisição falhar após todas as tentativas
*/
protected function execute($url, array $options = [])
{
@ -227,7 +267,7 @@ class Curl
if (!curl_setopt_array($ch, $curlOptions)) {
$error = curl_error($ch);
curl_close($ch);
throw new Exception("Failed to set cURL options: " . $error);
throw new Exception("Falha ao definir opções do cURL: " . $error);
}
$content = curl_exec($ch);
@ -256,6 +296,10 @@ class Curl
/**
* Executa uma requisição GET
*
* @param string $url URL da requisição
* @param array $options Opções adicionais do cURL
* @return array Retorna array com o conteúdo e informações da requisição
*/
public function get($url, array $options = [])
{
@ -264,6 +308,10 @@ class Curl
/**
* Executa uma requisição HEAD
*
* @param string $url URL da requisição
* @param array $options Opções adicionais do cURL
* @return array Retorna array com o conteúdo e informações da requisição
*/
public function head($url, array $options = [])
{
@ -273,6 +321,11 @@ class Curl
/**
* Executa uma requisição POST
*
* @param string $url URL da requisição
* @param mixed $data Dados a serem enviados no corpo da requisição
* @param array $options Opções adicionais do cURL
* @return array Retorna array com o conteúdo e informações da requisição
*/
public function post($url, $data = null, array $options = [])
{
@ -287,6 +340,11 @@ class Curl
/**
* Executa uma requisição PUT
*
* @param string $url URL da requisição
* @param mixed $data Dados a serem enviados no corpo da requisição
* @param array $options Opções adicionais do cURL
* @return array Retorna array com o conteúdo e informações da requisição
*/
public function put($url, $data = null, array $options = [])
{
@ -301,6 +359,10 @@ class Curl
/**
* Executa uma requisição DELETE
*
* @param string $url URL da requisição
* @param array $options Opções adicionais do cURL
* @return array Retorna array com o conteúdo e informações da requisição
*/
public function delete($url, array $options = [])
{

View file

@ -172,9 +172,20 @@ class URLAnalyzer
try {
// Seleciona um user agent de forma rotativa
$currentUserAgentKey = $userAgentKeys[$attempts % $totalUserAgents];
$content = $this->fetchContent($url, $currentUserAgentKey);
if (!empty($content)) {
return $content;
$result = $this->fetchContent($url, $currentUserAgentKey);
// Se o HTTP code não for 200
if ($result['http_code'] !== 200) {
try {
$content = $this->fetchFromWaybackMachine($url);
if (!empty($content)) {
return $content;
}
} catch (Exception $e) {
$errors[] = "Wayback Machine: " . $e->getMessage();
}
} else if (!empty($result['content'])) {
return $result['content'];
}
} catch (Exception $e) {
$errors[] = $e->getMessage();
@ -184,7 +195,7 @@ class URLAnalyzer
usleep(500000); // 0.5 segundo de espera entre tentativas
}
// Se todas as tentativas falharem, tenta buscar do Wayback Machine
// Se todas as tentativas falharem, tenta buscar do Wayback Machine uma última vez
try {
$content = $this->fetchFromWaybackMachine($url);
if (!empty($content)) {
@ -244,7 +255,7 @@ class URLAnalyzer
*
* @param string $url URL para requisição
* @param string $userAgentKey Chave do user agent a ser utilizado
* @return string Conteúdo obtido
* @return array Array com o conteúdo e código HTTP
* @throws Exception Em caso de erro na requisição
*/
private function fetchContent($url, $userAgentKey)
@ -266,8 +277,8 @@ class URLAnalyzer
}
// Adiciona headers específicos do domínio
if ($domainRules !== null && isset($domainRules['customHeaders'])) {
$this->curl->setHeaders($domainRules['customHeaders']);
if ($domainRules !== null && isset($domainRules['headers'])) {
$this->curl->setHeaders($domainRules['headers']);
}
// Adiciona cookies específicos do domínio
@ -277,7 +288,10 @@ class URLAnalyzer
try {
$response = $this->curl->get($url);
return $response['content'];
return [
'content' => $response['content'],
'http_code' => $response['info']['http_code']
];
} catch (Exception $e) {
throw new Exception("Erro ao obter conteúdo: " . $e->getMessage());
}