/
ddg.go
66 lines (57 loc) · 1.96 KB
/
ddg.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package main
import (
"fmt"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/launcher"
"github.com/go-rod/rod/lib/proto"
"path/filepath"
"time"
)
// getDuckDuckGoAds searches for ads on DuckDuckGo for a given encoded string
func getDuckDuckGoAds(encoded string, userAgent string) ([]string, error) {
var ads []string
// Search for chromium path
path, _ := launcher.LookPath()
u := launcher.New().Bin(path).MustLaunch()
// Create a new Rod browser instance
browser := rod.New().ControlURL(u).MustConnect().MustIncognito()
page := browser.MustPage()
defer browser.MustClose()
if err := page.SetUserAgent(&proto.NetworkSetUserAgentOverride{UserAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"}); err != nil {
return nil, err
}
wait := page.MustWaitNavigation()
// Open DuckDuckGo search page and search for encoded string
page.MustNavigate(seURLs["DuckDuckGo"] + encoded).MustWaitNavigation()
time.Sleep(3 * time.Second)
wait()
// Get ad links from the search results
adList, err := page.Elements("li[data-layout=\"ad\"] a[data-testid=\"result-extras-url-link\"]")
if err != nil {
return nil, err
}
// Open ads link in a new page to get URL
for _, ad := range adList {
href, err := ad.Attribute("href")
if err != nil {
return nil, err
}
adPage := browser.MustPage()
defer adPage.Close()
if userAgent != "" {
if err := page.SetUserAgent(&proto.NetworkSetUserAgentOverride{UserAgent: userAgent}); err != nil {
return nil, err
}
}
wait := adPage.MustWaitNavigation()
adPage.MustNavigate(*href)
wait()
ads = append(ads, adPage.MustInfo().URL)
}
// Capture a screenshot if ads are found and screenshot path is provided
if len(ads) > 0 && len(*screenshotPath) > 0 {
filename := fmt.Sprintf("duckduckgo-%s-%d.png", encoded, time.Now().UnixNano())
page.MustWaitStable().MustScreenshotFullPage(filepath.Join(*screenshotPath, filename))
}
return ads, nil
}