Skip to content

Instantly share code, notes, and snippets.

@doylecnn
Last active June 19, 2017 09:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save doylecnn/a2529b713cbd3bd8926ab07b922c259e to your computer and use it in GitHub Desktop.
Save doylecnn/a2529b713cbd3bd8926ab07b922c259e to your computer and use it in GitHub Desktop.
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