Skip to content

Commit 2e0787c

Browse files
committed
feat(client): 增加 CDN 服务商返回值并优化匹配逻辑
- 在 Checkvolcengine、CheckTencent、CheckAliyun、CheckBaidu 和 CheckHuawei函数中添加 iscdn 返回值- 更新 Check 函数逻辑,根据 iscdn 判断是否匹配到 CDN - 修复部分情况下结果类型和匹配状态不一致的问题 - 优化结果输出格式,统一未找到的情况的输出信息 - 更新版本号至 v1.5
1 parent 69f3591 commit 2e0787c

File tree

4 files changed

+62
-52
lines changed

4 files changed

+62
-52
lines changed

client/cdncheck.go

Lines changed: 57 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ func (c *Client) GetCityByIp(input net.IP) string {
9393
}
9494

9595
// 调用火山云接口,判断IP是否归属火山云
96-
func (c *Client) Checkvolcengine(input net.IP) (cdn string, isp string) {
96+
func (c *Client) Checkvolcengine(input net.IP) (cdn string, isp string, iscdn bool) {
9797
if c.config.VolcengineKey == "" {
98-
return "", ""
98+
return "", "", false
9999
}
100100
ip := input.String()
101101
region := "cn-beijing"
@@ -115,28 +115,30 @@ func (c *Client) Checkvolcengine(input net.IP) (cdn string, isp string) {
115115
response, err := svc.DescribeCdnIP(describeCdnIPInput)
116116
if err != nil {
117117
slog.Error("火山云接口查询异常:", err)
118-
return "", ""
118+
return "", "", false
119119
}
120120
patternStr := `CdnIp: (.*?),`
121121
Platform, err := gregex.MatchString(patternStr, response.String())
122122
if err != nil {
123-
return "", ""
123+
slog.Error("火山云json解析出错", err)
124+
return "", "", false
124125
}
125126
if Platform[1] == "True" {
126127
patternStr = `Location: "(.*?)"`
127128
result, reerr := gregex.MatchString(patternStr, response.String())
128129
if reerr != nil {
129-
return "火山云", ""
130+
slog.Error("火山云json解析错误", reerr)
131+
return "", "", false
130132
}
131-
return "火山云", result[1]
133+
return "火山云", result[1], true
132134
}
133-
return "", ""
135+
return "", "", false
134136
}
135137

136138
// 调用腾讯云DescribeCdnIp接口,判断ip是否属于腾讯云
137-
func (c *Client) CheckTencent(input net.IP) (cdn string, isp string) {
139+
func (c *Client) CheckTencent(input net.IP) (cdn string, isp string, iscdn bool) {
138140
if c.config.TencentId == "" {
139-
return "", ""
141+
return "", "", false
140142
}
141143
ip := input.String()
142144
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
@@ -156,28 +158,29 @@ func (c *Client) CheckTencent(input net.IP) (cdn string, isp string) {
156158
//fmt.Print(response.ToJsonString())
157159
if err != nil {
158160
slog.Error("腾讯接口查询异常:", err)
159-
return "", ""
161+
return "", "", false
160162
}
161163
patternStr := `"Platform":"(.*?)"`
162164
Platform, err := gregex.MatchString(patternStr, response.ToJsonString())
163165
if err != nil {
164-
return "", ""
166+
return "", "", false
165167
}
166168
if Platform[1] == "yes" {
167169
patternStr = `"Location":"(.*?)"`
168170
result, reerr := gregex.MatchString(patternStr, response.ToJsonString())
169171
if reerr != nil {
170-
return "腾讯云", ""
172+
slog.Error("腾讯云json解析错误", reerr)
173+
return "", "", false
171174
}
172-
return "腾讯云", result[1]
175+
return "腾讯云", result[1], true
173176
}
174-
return "", ""
177+
return "", "", false
175178
}
176179

177180
// 调用阿里云DescribeIpInfo接口,判断ip是否属于阿里云
178-
func (c *Client) CheckAliyun(input net.IP) (cdn string, isp string) {
181+
func (c *Client) CheckAliyun(input net.IP) (cdn string, isp string, iscdn bool) {
179182
if c.config.AlibabaId == "" {
180-
return "", ""
183+
return "", "", false
181184
}
182185
ip := input.String()
183186
config := &ali_openapi.Config{
@@ -191,30 +194,32 @@ func (c *Client) CheckAliyun(input net.IP) (cdn string, isp string) {
191194
client, err := ali_cdn20180510.NewClient(config)
192195
if err != nil {
193196
slog.Error("阿里云接口查询异常:", err)
194-
return "", ""
197+
return "", "", false
195198
}
196199
describeIpInfoRequest := &ali_cdn20180510.DescribeIpInfoRequest{IP: ali_tea.String(ip)}
197200
runtime := &ali_util.RuntimeOptions{}
198201
response, err := client.DescribeIpInfoWithOptions(describeIpInfoRequest, runtime)
199202
if err != nil {
200-
return "", ""
203+
slog.Error("阿里云接口查询异常:", err)
204+
return "", "", false
201205
}
202206
//fmt.Printf("%s",response.Body.String())
203207
json, err := gjson.DecodeToJson(response.Body.String())
204208
if err != nil {
205-
return "", ""
209+
slog.Error("阿里云json解析出错", err)
210+
return "", "", false
206211
}
207212
if json.Get("CdnIp").String() == "True" {
208-
return "阿里云", json.Get("ISP").String()
213+
return "阿里云", json.Get("ISP").String(), true
209214
} else {
210-
return "", ""
215+
return "", "", false
211216
}
212217
}
213218

214219
// 调用百度云describeIp接口,判断ip是否属于百度云
215-
func (c *Client) CheckBaidu(input net.IP) (cdn string, isp string) {
220+
func (c *Client) CheckBaidu(input net.IP) (cdn string, isp string, iscdn bool) {
216221
if c.config.BaiduId == "" {
217-
return "", ""
222+
return "", "", false
218223
}
219224
ip := input.String()
220225
req := &bd_bce.BceRequest{}
@@ -227,34 +232,37 @@ func (c *Client) CheckBaidu(input net.IP) (cdn string, isp string) {
227232
client, err := bd_bce.NewBceClientWithAkSk(c.config.BaiduId, c.config.BaiduKey, "https://cdn.baidubce.com")
228233
if err != nil {
229234
slog.Error("百度云接口查询异常:", err)
230-
return "", ""
235+
return "", "", false
231236
}
232237
resp := &bd_bce.BceResponse{}
233238
err = client.SendRequest(req, resp)
234239
if err != nil {
235-
return "", ""
240+
slog.Error("百度云接口查询异常:", err)
241+
return "", "", false
236242
}
237243
respBody := resp.Body()
238244
defer respBody.Close()
239245
body, err := ioutil.ReadAll(respBody)
240246
if err != nil {
241-
return "", ""
247+
slog.Error("百度云json解析失败", err)
248+
return "", "", false
242249
}
243250
json, err := gjson.DecodeToJson(string(body))
244251
if err != nil {
245-
return "", ""
252+
slog.Error("百度云json解析失败", err)
253+
return "", "", false
246254
}
247255
if json.Get("cdnIP").String() == "true" {
248-
return "百度云", json.Get("isp").String()
256+
return "百度云", json.Get("isp").String(), true
249257
} else {
250-
return "", ""
258+
return "", "", false
251259
}
252260
}
253261

254262
// 调用华为云接口,判断IP是否属于华为云
255-
func (c *Client) CheckHuawei(input net.IP) (cdn string, isp string) {
263+
func (c *Client) CheckHuawei(input net.IP) (cdn string, isp string, iscdn bool) {
256264
if c.config.HuaweiID == "" {
257-
return "", ""
265+
return "", "", false
258266
}
259267
ip := input.String()
260268

@@ -274,25 +282,28 @@ func (c *Client) CheckHuawei(input net.IP) (cdn string, isp string) {
274282
response, err := client.ShowIpInfo(request)
275283
if err != nil {
276284
slog.Error("华为云接口查询异常:", err)
277-
return "", ""
285+
return "", "", false
278286
}
279287
json, err := gjson.DecodeToJson(response)
280288
if err != nil {
281-
return "", ""
289+
return "", "", false
282290
}
283291
//归属
284292
if json.Get("belongs").String() == "true" {
285-
return "华为云", json.Get("ip").String()
293+
return "华为云", json.Get("ip").String(), true
286294
}
287-
return "", ""
295+
return "", "", false
288296
}
289297

290298
// Check checks if ip belongs to one of CDN, WAF and Cloud . It is generic method for Checkxxx methods
291299
func (c *Client) Check(inputIp string) (result config.Result) {
292300
result.Ip = inputIp
301+
result.IsMatch = false
293302
ip := net.ParseIP(inputIp)
294303
if ip == nil {
295-
result.IsMatch = false
304+
result.IsMatch = true
305+
result.Type = "ip-非法"
306+
//不是cdn
296307
return
297308
}
298309
//检查ip是否在缓存中
@@ -312,44 +323,44 @@ func (c *Client) Check(inputIp string) (result config.Result) {
312323
result.Location = location
313324

314325
//腾讯
315-
if cdn, isp := c.CheckTencent(ip); cdn != "" {
326+
if cdn, isp, iscdn := c.CheckTencent(ip); iscdn {
316327
result.Location = location + " " + isp
317-
result.IsMatch = true
328+
result.IsMatch = iscdn
318329
result.Type = "tencent cdn-官方接口查询"
319330
result.Value = cdn
320331
InsertIPToCache(inputIp, result.Location, cdn)
321332
return
322333
}
323-
if cdn, isp := c.Checkvolcengine(ip); cdn != "" {
334+
if cdn, isp, iscdn := c.Checkvolcengine(ip); iscdn {
324335
result.Location = location + " " + isp
325-
result.IsMatch = true
336+
result.IsMatch = iscdn
326337
result.Type = "火山云 cdn-官方接口查询"
327338
result.Value = cdn
328339
InsertIPToCache(inputIp, result.Location, cdn)
329340
return
330341
}
331342
//阿里
332-
if cdn, isp := c.CheckAliyun(ip); cdn != "" {
343+
if cdn, isp, iscdn := c.CheckAliyun(ip); iscdn {
333344
result.Location = location + " " + isp
334-
result.IsMatch = true
345+
result.IsMatch = iscdn
335346
result.Type = "Aliyun cdn-官方接口查询"
336347
result.Value = cdn
337348
InsertIPToCache(inputIp, result.Location, cdn)
338349
return
339350
}
340351
//百度
341-
if cdn, isp := c.CheckBaidu(ip); cdn != "" {
352+
if cdn, isp, iscdn := c.CheckBaidu(ip); iscdn {
342353
result.Location = location + " " + isp
343-
result.IsMatch = true
354+
result.IsMatch = iscdn
344355
result.Type = "Baidu cdn-官方接口查询"
345356
result.Value = cdn
346357
InsertIPToCache(inputIp, result.Location, cdn)
347358
return
348359
}
349360
//华为
350-
if cdn, isp := c.CheckHuawei(ip); cdn != "" {
361+
if cdn, isp, iscdn := c.CheckHuawei(ip); iscdn {
351362
result.Location = location + " " + isp
352-
result.IsMatch = true
363+
result.IsMatch = iscdn
353364
result.Type = "华为云 cdn-官方接口查询"
354365
result.Value = cdn
355366
InsertIPToCache(inputIp, result.Location, cdn)
@@ -376,7 +387,6 @@ func (c *Client) Check(inputIp string) (result config.Result) {
376387
result.Value = value
377388
return
378389
}
379-
result.IsMatch = false
380390
return
381391
}
382392

cmd/consts.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ var Banner = `
1212
/ /___/ / / / __/ /__/ ,< / /___/ /_/ / / / /
1313
\____/_/ /_/\___/\___/_/|_|\____/\__,_/_/ /_/
1414
CheckCdn-查询IP是否为CDN节点
15-
by ChenDark v1.4 https://github.com/YouChenJun
15+
by ChenDark v1.5 https://github.com/YouChenJun
1616
`

cmd/runner.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,10 @@ func Run(config *RunnerConfig) {
7777
// 启动goroutine来处理结果
7878
go func() {
7979
for result := range resultChan {
80-
if result.Type != "" {
80+
if result.IsMatch {
8181
fmt.Println(result)
8282
}
83-
if result.Type == "" {
83+
if !result.IsMatch {
8484
_, err := writer.WriteString(result.Ip + "\n")
8585
if err != nil {
8686
slog.Error("写入输出文件时出错: %v", err)

config/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ type BATconfig struct {
3131

3232
type Result struct {
3333
Ip string
34-
IsMatch bool //是否匹配到cdn
34+
IsMatch bool //是否匹配到cdn true为匹配为cdn
3535
Location string //ip位置
3636
Type string //cdn、waf、cloud
3737
Value string //值
@@ -41,7 +41,7 @@ func (r Result) String() string {
4141
if r.IsMatch {
4242
return fmt.Sprintf("匹配ip成功!ip:%s location:%s type:%s value:%s", r.Ip, r.Location, r.Type, r.Value)
4343
}
44-
return fmt.Sprintf("未找到! ip:%s location:%s type:%s value:%s", r.Ip, r.Location, r.Type, r.Value)
44+
return fmt.Sprintf("未找到!ip:%s location:%s type:%s value:%s", r.Ip, r.Location, r.Type, r.Value)
4545
}
4646

4747
// readConfig 从指定的 YAML 文件中读取配置信息并填充到 BATconfig 结构体中

0 commit comments

Comments
 (0)