59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
package pwextractor
|
|
|
|
import (
|
|
"bytes"
|
|
_ "embed"
|
|
"fmt"
|
|
"github.com/labstack/gommon/log"
|
|
"github.com/patriciy/adblock/adblock"
|
|
"github.com/playwright-community/playwright-go"
|
|
"net/url"
|
|
"sync"
|
|
)
|
|
|
|
//go:embed blocklists/easylist.txt
|
|
var easyList []byte
|
|
|
|
//go:embed blocklists/easyprivacy.txt
|
|
var easyPrivacy []byte
|
|
|
|
var matcher *adblock.RuleMatcher
|
|
var matcherMu sync.Mutex
|
|
|
|
func init() {
|
|
allBuf := bytes.Buffer{}
|
|
allBuf.Write(easyList)
|
|
//allBuf.Write(easyPrivacy)
|
|
r := bytes.NewReader(allBuf.Bytes())
|
|
rules, err := adblock.ParseRules(r)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("Parse rules: %v", err))
|
|
}
|
|
|
|
matcher = adblock.NewMatcher()
|
|
for i, rule := range rules {
|
|
if err := matcher.AddRule(rule, i); err != nil {
|
|
panic(fmt.Sprintf("Add rule: %v", err))
|
|
}
|
|
}
|
|
}
|
|
|
|
func allowAdblock(url *url.URL) bool {
|
|
matcherMu.Lock()
|
|
defer matcherMu.Unlock()
|
|
req := adblock.Request{
|
|
URL: url.String(),
|
|
Domain: url.Host,
|
|
GenericBlock: playwright.Bool(false),
|
|
}
|
|
deny, ruleId, err := matcher.Match(&req)
|
|
if err != nil {
|
|
log.Errorf("Adblock error: %v (url %s)", err, url.String())
|
|
return true
|
|
}
|
|
if deny {
|
|
log.Infof("Adblock blocked %s (ruleId %d)", url.String(), ruleId)
|
|
}
|
|
return !deny
|
|
}
|