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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
package cmd
import (
"encoding/json"
"fmt"
"git.db.org.ai/dborg/internal/client"
"git.db.org.ai/dborg/internal/config"
"git.db.org.ai/dborg/internal/utils"
"github.com/spf13/cobra"
)
var xCmd = &cobra.Command{
Use: "x",
Short: "Twitter/X tools and searches",
Long: `Tools for searching Twitter/X username history and scraping tweets`,
}
var xHistoryCmd = &cobra.Command{
Use: "history [username]",
Short: "Search Twitter/X username history",
Long: `Search for Twitter/X username history and previous usernames`,
Args: cobra.ExactArgs(1),
RunE: runXHistorySearch,
}
var xTweetsCmd = &cobra.Command{
Use: "tweets [username]",
Short: "Scrape tweets by username (Free OSINT)",
Long: `Discovers tweet IDs from Internet Archive and fetches tweet content. Free and unauthenticated endpoint.`,
Args: cobra.ExactArgs(1),
RunE: runXTweetsSearch,
}
var xFirstCmd = &cobra.Command{
Use: "first [username]",
Short: "Get first 20 followers of a Twitter/X account",
Long: `Retrieves the first 20 followers of a Twitter/X account`,
Args: cobra.ExactArgs(1),
RunE: runXFirstFollowers,
}
var xNFLCmd = &cobra.Command{
Use: "nfl [username]",
Short: "Get notable followers of a Twitter/X account",
Long: `Retrieves the notable followers (influential accounts) following a Twitter/X account`,
Args: cobra.ExactArgs(1),
RunE: runXNotableFollowers,
}
func init() {
rootCmd.AddCommand(xCmd)
xCmd.AddCommand(xHistoryCmd)
xCmd.AddCommand(xTweetsCmd)
xCmd.AddCommand(xFirstCmd)
xCmd.AddCommand(xNFLCmd)
}
func runXHistorySearch(cmd *cobra.Command, args []string) error {
apiKey, _ := cmd.Flags().GetString("api-key")
cfg := config.New().WithAPIKey(apiKey)
c, err := client.New(cfg)
if err != nil {
return err
}
response, err := c.SearchTwitterHistory(args[0])
if err != nil {
return err
}
if response.Error != "" {
return fmt.Errorf("API error: %s", response.Error)
}
if len(response.PreviousUsernames) > 0 {
return utils.PrintJSON(response.PreviousUsernames)
} else if response.Response != "" {
fmt.Println(response.Response)
} else if response.Data != nil {
return utils.PrintJSON(response.Data)
} else {
fmt.Println("No username history found")
}
return nil
}
func runXTweetsSearch(cmd *cobra.Command, args []string) error {
cfg := config.New()
c, err := client.NewUnauthenticated(cfg)
if err != nil {
return err
}
err = c.FetchTweetsStream(args[0], func(result json.RawMessage) error {
fmt.Println(string(result))
return nil
})
if err != nil {
return err
}
return nil
}
func runXFirstFollowers(cmd *cobra.Command, args []string) error {
apiKey, _ := cmd.Flags().GetString("api-key")
cfg := config.New().WithAPIKey(apiKey)
c, err := client.New(cfg)
if err != nil {
return err
}
response, err := c.GetFirstFollowers(args[0])
if err != nil {
return err
}
return utils.PrintJSON(response)
}
func runXNotableFollowers(cmd *cobra.Command, args []string) error {
apiKey, _ := cmd.Flags().GetString("api-key")
cfg := config.New().WithAPIKey(apiKey)
c, err := client.New(cfg)
if err != nil {
return err
}
response, err := c.GetNotableFollowers(args[0])
if err != nil {
return err
}
return utils.PrintJSON(response)
}
|