Skip to content

Commit b232a87

Browse files
committed
feat: add color for log
1 parent fd77e3d commit b232a87

File tree

9 files changed

+68
-38
lines changed

9 files changed

+68
-38
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
*.exe
2+
*.exe~
23
.history
34
.vscode
45
*.zip
56
cmd/rotateproxy/db.db
6-
build
7+
build
8+
*.ps1
9+
*.db

check.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package rotateproxy
22

33
import (
44
"crypto/tls"
5-
"fmt"
65
"io"
76
"net/http"
87
"net/url"
@@ -35,7 +34,8 @@ func CheckProxyAlive(proxyURL string) (respBody string, timeout int64, avail boo
3534
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
3635
DisableKeepAlives: true,
3736
},
38-
Timeout: 20 * time.Second,
37+
// shorter timeout for better proxies
38+
Timeout: 5 * time.Second,
3939
}
4040
startTime := time.Now()
4141

@@ -58,7 +58,7 @@ func CheckProxyAlive(proxyURL string) (respBody string, timeout int64, avail boo
5858
}
5959

6060
func CheckProxyWithCheckURL(proxyURL string, checkURL string, checkURLwords string) (timeout int64, avail bool) {
61-
fmt.Printf("check %s: %s\n", proxyURL, checkURL)
61+
// InfoLog(Notice("check %s: %s", proxyURL, checkURL))
6262
proxy, _ := url.Parse(proxyURL)
6363
httpclient := &http.Client{
6464
Transport: &http.Transport{
@@ -99,9 +99,9 @@ func StartCheckProxyAlive(checkURL string, checkURLwords string) {
9999
for {
100100
select {
101101
case <-crawlDone:
102-
fmt.Println("Checking")
102+
InfoLog(Noticeln("Checkings"))
103103
checkAlive(checkURL, checkURLwords)
104-
fmt.Println("Check done")
104+
InfoLog(Noticeln("Check done"))
105105
case <-ticker.C:
106106
checkAlive(checkURL, checkURLwords)
107107
}
@@ -112,7 +112,7 @@ func StartCheckProxyAlive(checkURL string, checkURLwords string) {
112112
func checkAlive(checkURL string, checkURLwords string) {
113113
proxies, err := QueryProxyURL()
114114
if err != nil {
115-
fmt.Printf("[!] query db error: %v\n", err)
115+
ErrorLog(Warn("[!] query db error: %v", err))
116116
}
117117
for i := range proxies {
118118
proxy := proxies[i]
@@ -123,7 +123,7 @@ func checkAlive(checkURL string, checkURLwords string) {
123123
timeout, avail = CheckProxyWithCheckURL(proxy.URL, checkURL, checkURLwords)
124124
}
125125
if avail {
126-
fmt.Printf("%v 可用\n", proxy.URL)
126+
InfoLog(Notice("%v 可用", proxy.URL))
127127
SetProxyURLAvail(proxy.URL, timeout, CanBypassGFW(respBody))
128128
return
129129
}

cmd/rotateproxy/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ func main() {
6060
return
6161
}
6262

63+
// print fofa query
64+
rotateproxy.InfoLog(rotateproxy.Notice("You fofa query for rotateproxy is : %v", rule))
65+
6366
baseCfg.ListenAddr = strings.TrimSpace(baseCfg.ListenAddr)
6467

6568
if portPattern.Match([]byte(baseCfg.ListenAddr)) {

crawler.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,14 @@ func RunCrawler(fofaApiKey, fofaEmail, rule string, pageNum int, proxy string) (
5353
if err != nil {
5454
return err
5555
}
56-
fmt.Printf("start to parse proxy url from response\n")
56+
InfoLog(Noticeln("start to parse proxy url from response"))
5757
defer resp.Body.Close()
5858
var res fofaAPIResponse
5959
err = json.NewDecoder(resp.Body).Decode(&res)
6060
if err != nil {
6161
return err
6262
}
63-
fmt.Printf("get %d host\n", len(res.Results))
63+
InfoLog(Notice("get %d host", len(res.Results)))
6464
for _, value := range res.Results {
6565
host := value[0]
6666
addProxyURL(fmt.Sprintf("socks5://%s", host))
@@ -74,7 +74,7 @@ func StartRunCrawler(fofaApiKey, fofaEmail, rule string, pageCount int, proxy st
7474
for i := 1; i <= 3; i++ {
7575
err := RunCrawler(fofaApiKey, fofaEmail, rule, i, proxy)
7676
if err != nil {
77-
fmt.Printf("[!] error: %v\n", err)
77+
ErrorLog(Warn("[!] error: %v", err))
7878
}
7979
}
8080
}

db.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ func SetProxyURLAvail(url string, timeout int64, canBypassGFW bool) error {
8686

8787
func SetProxyURLUnavail(url string) error {
8888
tx := DB.Model(&ProxyURL{}).Where("url = ?", url).Updates(ProxyURL{Retry: 0, Available: false})
89+
ErrorLog(Notice("Mark %v Unavailble! ", url))
8990
return tx.Error
9091
}
9192

go.mod

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ require (
1010

1111
require (
1212
github.com/dustin/go-humanize v1.0.1 // indirect
13+
github.com/fatih/color v1.16.0
1314
github.com/glebarez/go-sqlite v1.20.3 // indirect
1415
github.com/google/uuid v1.3.0 // indirect
1516
github.com/jinzhu/inflection v1.0.0 // indirect
1617
github.com/jinzhu/now v1.1.5 // indirect
17-
github.com/mattn/go-isatty v0.0.17 // indirect
18+
github.com/mattn/go-colorable v0.1.13 // indirect
19+
github.com/mattn/go-isatty v0.0.20 // indirect
1820
github.com/remyoudompheng/bigfft v0.0.0-20230126093431-47fa9a501578 // indirect
19-
golang.org/x/sys v0.4.0 // indirect
21+
golang.org/x/sys v0.14.0 // indirect
2022
modernc.org/libc v1.22.2 // indirect
2123
modernc.org/mathutil v1.5.0 // indirect
2224
modernc.org/memory v1.5.0 // indirect

go.sum

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMn
44
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
55
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
66
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
7+
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
8+
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
79
github.com/glebarez/go-sqlite v1.20.3 h1:89BkqGOXR9oRmG58ZrzgoY/Fhy5x0M+/WV48U5zVrZ4=
810
github.com/glebarez/go-sqlite v1.20.3/go.mod h1:u3N6D/wftiAzIOJtZl6BmedqxmmkDfH3q+ihjqxC9u0=
911
github.com/glebarez/sqlite v1.7.0 h1:A7Xj/KN2Lvie4Z4rrgQHY8MsbebX3NyWsL3n2i82MVI=
@@ -21,9 +23,12 @@ github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/
2123
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
2224
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
2325
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
26+
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
27+
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
2428
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
25-
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
2629
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
30+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
31+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
2732
github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
2833
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
2934
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
@@ -46,8 +51,10 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
4651
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
4752
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
4853
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
49-
golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
5054
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
55+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
56+
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
57+
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
5158
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
5259
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
5360
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

traffic_redirect.go

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ const (
1818
)
1919

2020
var (
21-
largeBufferSize = 32 * 1024 // 32KB large buffer
21+
largeBufferSize = 32 * 1024 // 32KB large buffer
2222
ErrNotSocks5Proxy = errors.New("this is not a socks proxy server")
2323
)
2424

2525
type BaseConfig struct {
26-
ListenAddr string
27-
IPRegionFlag int // 0: all 1: cannot bypass gfw 2: bypass gfw
28-
Username string
29-
Password string
26+
ListenAddr string
27+
IPRegionFlag int // 0: all 1: cannot bypass gfw 2: bypass gfw
28+
Username string
29+
Password string
3030
SelectStrategy int // 0: random, 1: Select the one with the shortest timeout, 2: Select the two with the shortest timeout, ...
3131
}
3232

@@ -46,7 +46,6 @@ type NoAuthPreProcessor struct {
4646
cfg BaseConfig
4747
}
4848

49-
5049
// DownstreamPreProcess auth for socks5 server(local)
5150
func (p *AuthPreProcessor) DownstreamPreProcess(conn net.Conn) (err error) {
5251
buf := make([]byte, 256)
@@ -108,7 +107,7 @@ func (p *AuthPreProcessor) UpstreamPreProcess(conn net.Conn) (err error) {
108107
defer func() {
109108
if e := recover(); e != nil {
110109
err = fmt.Errorf("%v", e)
111-
fmt.Printf("close connection: %v\n", err)
110+
ErrorLog(Warn("close connection: %v", err))
112111
}
113112
}()
114113
if conn == nil {
@@ -145,7 +144,6 @@ func NewNoAuthPreProcessor(cfg BaseConfig) *NoAuthPreProcessor {
145144
return &NoAuthPreProcessor{cfg: cfg}
146145
}
147146

148-
149147
type RedirectClient struct {
150148
config *BaseConfig
151149

@@ -181,13 +179,13 @@ func (c *RedirectClient) Serve() error {
181179
return err
182180
}
183181
for IsProxyURLBlank() {
184-
fmt.Println("[*] waiting for crawl proxy...")
182+
InfoLog(Noticeln("[*] waiting for crawl proxy..."))
185183
time.Sleep(3 * time.Second)
186184
}
187185
for {
188186
conn, err := l.Accept()
189187
if err != nil {
190-
fmt.Printf("[!] accept error: %v\n", err)
188+
ErrorLog(Warn("[!] accept error: %v", err))
191189
continue
192190
}
193191
go c.HandleConn(conn)
@@ -206,20 +204,21 @@ func (c *RedirectClient) getValidSocks5Connection() (net.Conn, error) {
206204
cc, err = net.DialTimeout("tcp", key, 5*time.Second)
207205
if err != nil {
208206
closeConn(cc)
209-
fmt.Printf("[!] cannot connect to %v\n", key)
207+
markUnavail()
208+
ErrorLog(Warn("[!] cannot connect to %v", key))
210209
}
211-
fmt.Printf("[*] use %v\n", key)
210+
InfoLog(Info("[*] use %v", key))
212211
// write header for remote socks5 server
213212
err = c.preProcessor.UpstreamPreProcess(cc)
214213
if err != nil {
215214
closeConn(cc)
216215
if errors.Is(err, ErrNotSocks5Proxy) {
217216
// 将该代理设置为不可用
218217
markUnavail()
219-
fmt.Println(err)
218+
ErrorLog(Warn("Error : %v", err))
220219
continue
221220
}
222-
fmt.Printf("socks handshake with downstream failed: %v\n", err)
221+
ErrorLog(Warn("socks handshake with downstream failed: %v", err))
223222
continue
224223
}
225224
break
@@ -232,26 +231,26 @@ func (c *RedirectClient) HandleConn(conn net.Conn) {
232231
// auth for local socks5 serer
233232
err := c.preProcessor.DownstreamPreProcess(conn)
234233
if err != nil {
235-
fmt.Printf("[!] socks handshake with downstream failed: %v\n", err)
234+
ErrorLog(Warn("[!] socks handshake with downstream failed: %v", err))
236235
return
237236
}
238237
cc, err := c.getValidSocks5Connection()
239238
if err != nil {
240-
fmt.Printf("[!] getValidSocks5Connection failed: %v\n", err)
239+
ErrorLog(Warn("[!] getValidSocks5Connection failed: %v", err))
241240
return
242241
}
243242
defer closeConn(cc)
244243
err = transport(conn, cc)
245244
if err != nil {
246-
fmt.Printf("[!] transport error: %v\n", err)
245+
ErrorLog(Warn("[!] transport error: %v", err))
247246
}
248247
}
249248

250249
func closeConn(conn net.Conn) (err error) {
251250
defer func() {
252251
if e := recover(); e != nil {
253252
err = fmt.Errorf("%v", e)
254-
fmt.Printf("[*] close connection: %v\n", err)
253+
ErrorLog(Warn("[*] close connection: %v", err))
255254
}
256255
}()
257256
err = conn.Close()
@@ -260,11 +259,11 @@ func closeConn(conn net.Conn) (err error) {
260259

261260
func transport(rw1, rw2 io.ReadWriter) error {
262261
g, _ := errgroup.WithContext(context.Background())
263-
g.Go(func() error{
262+
g.Go(func() error {
264263
return copyBuffer(rw1, rw2)
265264
})
266265

267-
g.Go(func() error{
266+
g.Go(func() error {
268267
return copyBuffer(rw2, rw1)
269268
})
270269
var err error

util.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@ package rotateproxy
22

33
import (
44
"errors"
5-
"fmt"
65
"io"
6+
"log"
77
"math/rand"
8+
"os"
89
"sync"
910
"time"
11+
12+
"github.com/fatih/color"
1013
)
1114

1215
var errInvalidWrite = errors.New("invalid write result")
@@ -30,7 +33,7 @@ func RandomSyncMap(sMap sync.Map) (key, value interface{}) {
3033
func IsProxyURLBlank() bool {
3134
proxies, err := QueryAvailProxyURL()
3235
if err != nil {
33-
fmt.Printf("[!] Error: %v\n", err)
36+
ErrorLog(Warn("[!] Error: %v", err))
3437
return false
3538
}
3639
return len(proxies) == 0
@@ -92,4 +95,16 @@ func CopyBufferWithCloseErr(dst io.Writer, src io.Reader, buf []byte) (written i
9295
}
9396
}
9497
return written, err
95-
}
98+
}
99+
100+
var (
101+
Notice = color.New(color.FgBlue).SprintfFunc()
102+
Noticeln = color.New(color.FgBlue).SprintFunc()
103+
Info = color.New(color.FgGreen).SprintfFunc()
104+
Warn = color.New(color.FgRed).SprintfFunc()
105+
)
106+
107+
var (
108+
InfoLog = log.New(os.Stdout, "", log.Ldate|log.Ltime|log.Lshortfile).Println
109+
ErrorLog = log.New(os.Stdout, "", log.Ldate|log.Ltime|log.Lshortfile).Println
110+
)

0 commit comments

Comments
 (0)