main/app/inc/Rules.php
2024-11-22 17:41:07 -03:00

352 lines
12 KiB
PHP

<?php
/**
* Classe responsável pelo gerenciamento de regras de manipulação de conteúdo
*
* Esta classe implementa um sistema de regras para diferentes domínios web,
* permitindo a personalização do comportamento do sistema para cada site.
* Inclui funcionalidades para remoção de paywalls, elementos específicos,
* manipulação de cookies e execução de códigos customizados.
*/
class Rules {
/**
* Array associativo contendo regras específicas para cada domínio
*
* Configurações possíveis para cada domínio:
* @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 = [
'nsctotal.com.br' => [
'userAgent' => '',
'headers' => ''
],
'globo.com' => [
'idElementRemove' => ['cookie-banner-lgpd', 'paywall-cpt', 'mc-read-more-wrapper', 'paywall-cookie-content', 'paywall-cpt'],
'classElementRemove' => ['banner-lgpd', 'article-related-link__title', 'article-related-link__picture', 'paywall-denied', 'banner-subscription'],
'scriptTagRemove' => ['tiny.js', 'signup.js', 'paywall.js'],
'cookies' => [
'piano_d' => null,
'piano_if' => null,
'piano_user_id' => null
],
'classAttrRemove' => ['wall', 'protected-content', 'cropped-block'],
'clearStorage' => true,
],
'folha.uol.com.br' => [
'idElementRemove' => ['paywall-flutuante', 'paywall', 'paywall-signup'],
'classElementRemove' => ['banner-assinatura', 'paywall-container'],
'scriptTagRemove' => ['paywall.js', 'content-gate.js'],
'cookies' => [
'paywall_visit' => null,
'folha_id' => null,
'paywall_access' => 'true'
],
'clearStorage' => true
],
'estadao.com.br' => [
'idElementRemove' => ['paywall', 'paywall-container'],
'classElementRemove' => ['paywall-content', 'signin-wall', 'pay-wall'],
'scriptTagRemove' => ['paywall.js', 'pywll.js'],
'cookies' => [
'estadao_paywall' => null
],
'clearStorage' => true
],
'exame.com' => [
'fixRelativeUrls' => true,
],
'diarinho.net' => [
'fixRelativeUrls' => true,
],
'em.com.br' => [
'fixRelativeUrls' => true,
],
'opovo.com.br' => [
'fixRelativeUrls' => true,
'classElementRemove' => ['screen-loading', 'overlay-advise'],
],
'folhadelondrina.com.br' => [
'fixRelativeUrls' => true,
],
'crusoe.com.br' => [
'cookies' => [
'crs_subscriber' => '1'
]
],
'economist.com' => [
'cookies' => [
'ec_limit' => 'allow'
],
'scriptTagRemove' => ['wrapperMessagingWithoutDetection.js'],
'customCode' => '
var artBodyContainer = document.querySelector("article.article");
var artBody = artBodyContainer.innerHTML;
checkPaywall();
function checkPaywall() {
let paywallBox = document.querySelector(".layout-article-regwall");
if (paywallBox) {
artBodyContainer.innerHTML = artBody;
}
}
'
],
'ft.com' => [
'cookies' => [
'next-flags' => null,
'next:ads' => null
],
'clearStorage' => true,
'customHeaders' => [
'Referer' => 'https://www.google.com.br/'
]
],
'nytimes.com' => [
'cookies' => [
'nyt-gdpr' => '1',
'nyt-purr' => 'cfh'
],
'clearStorage' => true
],
'correio24horas.com.br' => [
'idElementRemove' => ['paywall'],
'classElementRemove' => ['paywall'],
'classAttrRemove' => ['hide', 'is-active'],
'cookies' => [
'premium_access' => '1'
]
],
'abril.com.br' => [
'cookies' => [
'paywall_access' => 'true'
],
'classElementRemove' => ['piano-offer-overlay'],
'classAttrRemove' => ['disabledByPaywall'],
'idElementRemove' => ['piano_offer']
],
'foreignpolicy.com' => [
'idElementRemove' => ['paywall_bg'],
'classAttrRemove' => ['overlay-no-scroll', 'overlay-no-scroll'],
],
'wired.com' => [
'clearStorage' => true
],
'dgabc.com.br' => [
'customCode' => '
var email = "colaborador@dgabc.com.br";
$(".NoticiaExclusivaNaoLogado").hide();
$(".NoticiaExclusivaLogadoSemPermissao").hide();
$(".linhaSuperBanner").show();
$(".footer").show();
$(".NoticiaExclusivaLogado").show();
',
'fixRelativeUrls' => true,
],
'forbes.com' => [
'classElementRemove' => ['zephr-backdrop', 'zephr-generic-modal'],
'excludeGlobalRules' => [
'classElementRemove' => [
'paywall' => [
'premium-article',
],
],
],
],
'seudinheiro.com' => [
'idElementRemove' => ['premium-paywall'],
],
'technologyreview.com' => [
'cookies' => [
'xbc' => null,
'_pcid' => null,
'_pcus' => null,
'__tbc' => null,
'__pvi' => null,
'_pctx' => null
],
'clearStorage' => true
]
];
// Regras globais expandidas
private $globalRules = [
'classElementRemove' => [
'paywall' => [
'subscription',
'subscriber-content',
'premium-content',
'signin-wall',
'register-wall',
'paid-content',
'premium-article',
'subscription-box',
'piano-offer',
'piano-inline',
'piano-modal',
'paywall-container',
'paywall-overlay',
'paywall-wrapper',
'paywall-notification'
],
'social' => [
'social-share',
'social-buttons',
'share-container'
],
'newsletter' => [
'newsletter-popup',
'subscribe-form',
'signup-overlay'
]
],
'scriptTagRemove' => [
'tracking' => [
'ga.js',
'fbevents.js',
'pixel.js',
'chartbeat',
'analytics.js',
],
'paywall' => [
'wall.js',
'paywall.js',
'subscriber.js',
'piano.js',
'tiny.js',
'pywll.js',
'content-gate.js',
'signwall.js',
'pw.js',
'pw-',
'piano-',
'tinypass.js',
'tinypass.min.js',
'tp.min.js',
'premium.js'
],
'cookies' => [
'cookie',
'gdpr',
'lgpd'
],
'misc' => [
'push',
'sw.js',
'stats.js'
]
]
];
/**
* Obtém o domínio base removendo o prefixo www
*
* @param string $domain Domínio completo
* @return string Domínio base sem www
*/
private function getBaseDomain($domain) {
return preg_replace('/^www\./', '', $domain);
}
/**
* Divide um domínio em suas partes constituintes
*
* @param string $domain Domínio a ser dividido
* @return array Array com todas as combinações possíveis do domínio
*/
private function getDomainParts($domain) {
$domain = $this->getBaseDomain($domain);
$parts = explode('.', $domain);
$combinations = [];
for ($i = 0; $i < count($parts) - 1; $i++) {
$combinations[] = implode('.', array_slice($parts, $i));
}
usort($combinations, function($a, $b) {
return strlen($b) - strlen($a);
});
return $combinations;
}
/**
* Obtém as regras específicas para um domínio
*
* @param string $domain Domínio para buscar regras
* @return array|null Array com regras mescladas ou null se não encontrar
*/
public function getDomainRules($domain) {
$domainParts = $this->getDomainParts($domain);
foreach ($this->domainRules as $pattern => $rules) {
if ($this->getBaseDomain($domain) === $this->getBaseDomain($pattern)) {
return $this->mergeWithGlobalRules($rules);
}
}
foreach ($domainParts as $part) {
foreach ($this->domainRules as $pattern => $rules) {
if ($part === $this->getBaseDomain($pattern)) {
return $this->mergeWithGlobalRules($rules);
}
}
}
return null;
}
/**
* Mescla regras específicas do domínio com regras globais
*
* @param array $rules Regras específicas do domínio
* @return array Regras mescladas
*/
private function mergeWithGlobalRules($rules) {
$globalRules = $this->getGlobalRules();
if (isset($rules['excludeGlobalRules']) && is_array($rules['excludeGlobalRules'])) {
foreach ($rules['excludeGlobalRules'] as $ruleType => $categories) {
if (isset($globalRules[$ruleType])) {
foreach ($categories as $category => $itemsToExclude) {
if (isset($globalRules[$ruleType][$category])) {
$globalRules[$ruleType][$category] = array_diff(
$globalRules[$ruleType][$category],
$itemsToExclude
);
}
}
}
}
}
foreach ($globalRules as $ruleType => $categories) {
if (!isset($rules[$ruleType])) {
$rules[$ruleType] = [];
}
foreach ($categories as $category => $items) {
$rules[$ruleType] = array_merge($rules[$ruleType], $items);
}
}
return $rules;
}
/**
* Retorna todas as regras globais
*
* @return array Array com todas as regras globais
*/
public function getGlobalRules() {
return $this->globalRules;
}
}