Last active
June 19, 2017 09:36
-
-
Save doylecnn/a2529b713cbd3bd8926ab07b922c259e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"crypto/md5" | |
"flag" | |
"fmt" | |
"io" | |
"io/ioutil" | |
"log" | |
"math" | |
"net/http" | |
"strconv" | |
"strings" | |
"time" | |
) | |
const url = "http://www.qlcoder.com/train/handsomerank?_token=%s&user=%s&checkcode=%d" | |
var voteStart int | |
var threadCount int | |
var helpFlag bool | |
var name string | |
var token string | |
func init() { | |
flag.StringVar(&name, "n", "", "user name, must input") | |
flag.StringVar(&token, "t", "", "token, must input") | |
flag.IntVar(&voteStart, "s", 1, "vote start num [1,1000]") | |
flag.IntVar(&threadCount, "N", 4, "coccurrence num []") | |
flag.BoolVar(&helpFlag, "h", false, "show help message") | |
} | |
type pair struct { | |
I int | |
J int | |
} | |
var in chan int = make(chan int, 20) | |
var out chan pair = make(chan pair, 40) | |
var exit chan struct{} = make(chan struct{}) | |
func main() { | |
flag.Parse() | |
if helpFlag || threadCount < 1 || threadCount > 10 || voteStart < 1 || voteStart > 1001 || len(name) == 0 || len(token) == 0 { | |
fmt.Println("-n\tuser name") | |
fmt.Println("-t\ttoken") | |
fmt.Println("-s\tvote start num. default: 1") | |
fmt.Println("-N\tcoccurrence num. default: 4") | |
fmt.Println("-h\tshow help message") | |
return | |
} | |
var template = fmt.Sprintf("%s%s", time.Now().Format("20060102"), name) | |
for i := 0; i < threadCount; i++ { | |
go func() { | |
h := md5.New() | |
for { | |
select { | |
case <-exit: | |
return | |
case i := <-in: | |
log.Println("try", i) | |
for j := 0; ; j++ { | |
h.Reset() | |
io.WriteString(h, fmt.Sprintf("%s%d%d", template, i, j)) | |
md5_result := h.Sum(nil) | |
r := md5_result[0:3:3] | |
if r[0]|r[1]|r[2] == 0 { | |
out <- pair{i, j} | |
break | |
} | |
} | |
} | |
} | |
}() | |
} | |
go func() { | |
for i := voteStart; i < 1001; i++ { | |
in <- i | |
} | |
}() | |
var list [1002]int | |
var current = voteStart | |
var errTemp = fmt.Sprintf("验证码错误<br>\"%s", template) | |
for v := range out { | |
log.Printf("%v", v) | |
list[v.I] = v.J | |
for j := list[current]; j > 0 && current < 1001; current, j = current+1, list[current+1] { | |
uri := fmt.Sprintf(url, token, name, j) | |
log.Printf("%d, %s\n", current, uri) | |
r, err := http.Get(uri) | |
if err != nil { | |
log.Panicln(err) | |
} | |
body, err := ioutil.ReadAll(r.Body) | |
if err != nil { | |
log.Panicln(err) | |
} | |
r.Body.Close() | |
text := string(body) | |
if strings.HasPrefix(text, errTemp) { | |
fmt.Printf("%s\n", text) | |
var tmp = text[len(errTemp):] | |
log.Printf("%s\n", tmp) | |
if idx := strings.Index(tmp, "\""); idx > -1 { | |
tmp = tmp[:idx-int(math.Trunc(math.Log10(float64(j))))-1] | |
log.Printf("%s\n", tmp) | |
if s, err := strconv.Atoi(tmp); err == nil { | |
log.Printf("current vote number is %d. please stop current process, and restart with %d\n", s, s) | |
current = 9999 | |
break | |
} else { | |
log.Panicln(err) | |
} | |
} | |
} else if strings.HasPrefix(text, "恭喜你") { | |
fmt.Println(text) | |
current = 9999 | |
break | |
} | |
fmt.Printf("piao: %d status:%d\n", current, r.StatusCode) | |
} | |
if current > 1000 { | |
break | |
} | |
} | |
close(exit) | |
close(in) | |
close(out) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment