mirror of
https://github.com/manualdousuario/marreta.git
synced 2025-04-08 22:59:08 +00:00
352 lines
12 KiB
PHP
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;
|
|
}
|
|
}
|