simplifica o sistema de regras globais e por dominio

This commit is contained in:
Renan Bernordi 2024-12-03 23:39:06 -03:00
parent a51e309196
commit 0ba05af969
3 changed files with 106 additions and 107 deletions

View file

@ -6,90 +6,61 @@
* Este arquivo define regras que são aplicadas por padrão a todos os sites, * Este arquivo define regras que são aplicadas por padrão a todos os sites,
* organizadas em categorias para melhor manutenção e compreensão. * organizadas em categorias para melhor manutenção e compreensão.
* *
* Estrutura das regras globais:
*
* classElementRemove: Classes HTML que devem ser removidas, agrupadas por categoria
* - paywall: Classes relacionadas a paywalls e conteúdo premium
* - social: Classes de elementos de compartilhamento social
* - newsletter: Classes de popups e formulários de newsletter
*
* scriptTagRemove: Scripts que devem ser removidos, agrupados por categoria
* - tracking: Scripts de analytics e rastreamento
* - paywall: Scripts relacionados a paywalls e conteúdo premium
* - cookies: Scripts de gerenciamento de cookies e GDPR/LGPD
* - misc: Scripts diversos como push notifications
*
* Nota: Estas regras podem ser sobrescritas ou desativadas para domínios específicos * Nota: Estas regras podem ser sobrescritas ou desativadas para domínios específicos
* usando a configuração 'excludeGlobalRules' em domain_rules.php * usando a configuração 'excludeGlobalRules' em domain_rules.php
*/ */
return [ return [
'classElementRemove' => [ 'classElementRemove' => [
'paywall' => [ 'subscription',
'subscription', 'subscriber-content',
'subscriber-content', 'premium-content',
'premium-content', 'signin-wall',
'signin-wall', 'register-wall',
'register-wall', 'paid-content',
'paid-content', 'premium-article',
'premium-article', 'subscription-box',
'subscription-box', 'piano-offer',
'piano-offer', 'piano-inline',
'piano-inline', 'piano-modal',
'piano-modal', 'paywall-container',
'paywall-container', 'paywall-overlay',
'paywall-overlay', 'paywall-wrapper',
'paywall-wrapper', 'paywall-notification',
'paywall-notification' 'leaky_paywall_message_wrap',
], 'subscribe-form',
'social' => [ 'signup-overlay'
'social-share',
'social-buttons',
'share-container'
],
'newsletter' => [
'newsletter-popup',
'subscribe-form',
'signup-overlay'
]
], ],
'scriptTagRemove' => [ 'scriptTagRemove' => [
'tracking' => [ 'gtm.js',
'gtm.js', 'ga.js',
'ga.js', 'fbevents.js',
'fbevents.js', 'pixel.js',
'pixel.js', 'chartbeat',
'chartbeat', 'analytics.js',
'analytics.js', 'cmp.js',
'cmp.js', 'wall.js',
], 'paywall.js',
'paywall' => [ 'subscriber.js',
'wall.js', 'piano.js',
'paywall.js', 'tiny.js',
'subscriber.js', 'pywll.js',
'piano.js', 'content-gate.js',
'tiny.js', 'signwall.js',
'pywll.js', 'pw.js',
'content-gate.js', 'pw-',
'signwall.js', 'piano-',
'pw.js', 'tinypass.js',
'pw-', 'tinypass.min.js',
'piano-', 'tp.min.js',
'tinypass.js', 'premium.js',
'tinypass.min.js', 'amp-access-0.1.js',
'tp.min.js', 'zephrBarriersScripts',
'premium.js', 'leaky-paywall',
'amp-access-0.1.js', 'cookie',
'zephrBarriersScripts', 'gdpr',
], 'lgpd',
'cookies' => [ 'push',
'cookie', 'sw.js',
'gdpr', 'stats.js'
'lgpd'
],
'misc' => [
'push',
'sw.js',
'stats.js'
]
] ]
]; ];

View file

@ -15,24 +15,27 @@ class Rules
* *
* Configurações possíveis para cada domínio: * Configurações possíveis para cada domínio:
* @var array * @var array
*
* - idElementRemove: IDs de elementos HTML que devem ser removidos
* - classElementRemove: Classes de elementos HTML que devem ser removidos
* - scriptTagRemove: Scripts que devem ser removidos
* - cookies: Cookies que devem ser definidos ou removidos
* - classAttrRemove: Classes que devem ser removidas de elementos
* - clearStorage: Se deve limpar o storage do navegador
* - customCode: Código JavaScript personalizado para execução
* - excludeGlobalRules: Array de regras globais a serem excluídas
* - userAgent: User Agent personalizado
* - headers: Headers HTTP personalizados
* - fixRelativeUrls: Habilita correção de URLs relativas
*/ */
private $domainRules = DOMAIN_RULES; private $domainRules = DOMAIN_RULES;
// Regras globais expandidas // Regras globais expandidas
private $globalRules = GLOBAL_RULES; private $globalRules = GLOBAL_RULES;
/**
* Lista de tipos de regras suportados
* @var array
*/
private $supportedRuleTypes = [
'userAgent',
'headers',
'idElementRemove',
'classElementRemove',
'scriptTagRemove',
'cookies',
'classAttrRemove',
'customCode'
];
/** /**
* Obtém o domínio base removendo o prefixo www * Obtém o domínio base removendo o prefixo www
* *
@ -103,32 +106,57 @@ class Rules
private function mergeWithGlobalRules($rules) private function mergeWithGlobalRules($rules)
{ {
$globalRules = $this->getGlobalRules(); $globalRules = $this->getGlobalRules();
$mergedRules = $rules;
// Processa excludeGlobalRules primeiro
$excludedRules = [];
if (isset($rules['excludeGlobalRules']) && is_array($rules['excludeGlobalRules'])) { if (isset($rules['excludeGlobalRules']) && is_array($rules['excludeGlobalRules'])) {
foreach ($rules['excludeGlobalRules'] as $ruleType => $categories) { foreach ($rules['excludeGlobalRules'] as $ruleType => $excluded) {
if (isset($globalRules[$ruleType])) { if (isset($excluded) && is_array($excluded)) {
foreach ($categories as $category => $itemsToExclude) { foreach ($excluded as $category => $items) {
if (isset($globalRules[$ruleType][$category])) { $excludedRules[$ruleType] = array_merge(
$globalRules[$ruleType][$category] = array_diff( $excludedRules[$ruleType] ?? [],
$globalRules[$ruleType][$category], (array)$items
$itemsToExclude );
);
}
} }
} }
} }
} }
foreach ($globalRules as $ruleType => $categories) { // Mescla cada tipo de regra suportado
if (!isset($rules[$ruleType])) { foreach ($this->supportedRuleTypes as $ruleType) {
$rules[$ruleType] = []; if (isset($globalRules[$ruleType])) {
} if (!isset($mergedRules[$ruleType])) {
foreach ($categories as $category => $items) { $mergedRules[$ruleType] = [];
$rules[$ruleType] = array_merge($rules[$ruleType], $items); }
// Garante que estamos trabalhando com arrays
$domainTypeRules = (array)$mergedRules[$ruleType];
$globalTypeRules = (array)$globalRules[$ruleType];
// Aplica exclusões se existirem para este tipo
if (isset($excludedRules[$ruleType])) {
$globalTypeRules = array_diff($globalTypeRules, $excludedRules[$ruleType]);
}
// Mescla as regras
if (in_array($ruleType, ['cookies', 'headers'])) {
// Para cookies e headers, preserva as chaves
$mergedRules[$ruleType] = array_merge($globalTypeRules, $domainTypeRules);
} else {
// Para outros tipos, mescla como arrays simples
$mergedRules[$ruleType] = array_values(array_unique(array_merge(
$domainTypeRules,
$globalTypeRules
)));
}
} }
} }
return $rules; // Remove excludeGlobalRules do resultado final
unset($mergedRules['excludeGlobalRules']);
return $mergedRules;
} }
/** /**

View file

@ -804,7 +804,7 @@ class URLAnalyzer
foreach ($elements as $element) { foreach ($elements as $element) {
if ($element instanceof DOMElement) { if ($element instanceof DOMElement) {
$style = $element->getAttribute('style'); $style = $element->getAttribute('style');
$style = preg_replace('/(max-height|height|overflow|position|display)\s*:\s*[^;]+;?/', '', $style); $style = preg_replace('/(max-height|height|overflow|position|display|visibility)\s*:\s*[^;]+;?/', '', $style);
$element->setAttribute('style', $style); $element->setAttribute('style', $style);
} }
} }