Add DuckDuckGo integration for search functionality
Implemented a DuckDuckGo search module with configurable SafeSearch and regional settings. Added a CLI tool to perform searches via DuckDuckGo using browser automation, supporting flags for customization.
This commit is contained in:
102
sites/duckduckgo/cmd/duckduckgo/main.go
Normal file
102
sites/duckduckgo/cmd/duckduckgo/main.go
Normal file
@@ -0,0 +1,102 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"gitea.stevedudenhoeffer.com/steve/go-extractor/cmd/browser/pkg/browser"
|
||||
|
||||
"github.com/urfave/cli/v3"
|
||||
|
||||
"gitea.stevedudenhoeffer.com/steve/go-extractor/sites/duckduckgo"
|
||||
)
|
||||
|
||||
type DuckDuckGoFlags []cli.Flag
|
||||
|
||||
var Flags = DuckDuckGoFlags{
|
||||
&cli.StringFlag{
|
||||
Name: "region",
|
||||
Aliases: []string{"r"},
|
||||
},
|
||||
&cli.StringFlag{
|
||||
Name: "safesearch",
|
||||
Aliases: []string{"s"},
|
||||
},
|
||||
}
|
||||
|
||||
func (f DuckDuckGoFlags) ToConfig(cmd *cli.Command) duckduckgo.Config {
|
||||
var res = duckduckgo.DefaultConfig
|
||||
|
||||
if r := cmd.String("region"); r != "" {
|
||||
res.Region = r
|
||||
}
|
||||
|
||||
if s := cmd.String("safesearch"); s != "" {
|
||||
switch s {
|
||||
case "on":
|
||||
res.SafeSearch = duckduckgo.SafeSearchOn
|
||||
case "moderate":
|
||||
res.SafeSearch = duckduckgo.SafeSearchModerate
|
||||
case "off":
|
||||
res.SafeSearch = duckduckgo.SafeSearchOff
|
||||
default:
|
||||
panic("invalid safe search value")
|
||||
}
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func deferClose(cl io.Closer) {
|
||||
if cl != nil {
|
||||
_ = cl.Close()
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
var flags []cli.Flag
|
||||
|
||||
flags = append(flags, Flags...)
|
||||
|
||||
cli := &cli.Command{
|
||||
Name: "duckduckgo",
|
||||
Usage: "Search DuckDuckGo",
|
||||
Flags: flags,
|
||||
Action: func(ctx context.Context, command *cli.Command) error {
|
||||
c := Flags.ToConfig(command)
|
||||
defer deferClose(nil)
|
||||
|
||||
query := strings.TrimSpace(strings.Join(command.Args().Slice(), " "))
|
||||
|
||||
if query == "" {
|
||||
return cli.Exit("usage: duckduckgo <query>", 1)
|
||||
}
|
||||
|
||||
b, err := browser.FromCommand(ctx, command)
|
||||
defer deferClose(b)
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create browser: %w", err)
|
||||
}
|
||||
|
||||
res, err := c.Search(ctx, b, query)
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to search: %w", err)
|
||||
}
|
||||
|
||||
fmt.Println(res)
|
||||
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
err := cli.Run(context.Background(), os.Args)
|
||||
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user