package main import ( "encoding/json" "github.com/bitly/go-simplejson" "io/ioutil" "log" "net/http" "os" ) func main() { //获取access_token appid, secret := "XXXXXXXXX", "XXXXXXXXXX" r := getFile("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret) var dat map[string]string json.Unmarshal([]byte(r), &dat) //获取全部openid并写入文件 openids := getFile("https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + dat["access_token"]) //过滤黑名单openid uopenids, _ := simplejson.NewJson(openids) s, _ := uopenids.Get("data").Get("openid").StringArray() var inputString string c := make(chan string, len(s)) log.Println("请勿关闭,程序正在运行中…………", len(s)) for _, v := range s { go func(v string) { s1 := getFile("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + dat["access_token"] + "&openid=" + v) up, _ := simplejson.NewJson(s1) groupid, _ := up.Get("groupid").Int() if groupid != 4 { c <- v + " " } }(v) } for i := 0; i < len(s); i++ { inputString += <-c } //写入文件 defer openFiles("2015September5.txt", inputString) } func openFiles(name string, con string) { f, _ := os.OpenFile(name, os.O_APPEND|os.O_CREATE, 0666) f.WriteString(con) defer f.Close() } func getFile(url string) []byte { oid, _ := http.Get(url) defer oid.Body.Close() oids, _ := ioutil.ReadAll(oid.Body) return oids }
程序说明:拉取微信服务号的关注用户(所有),同时一一检测用户,过滤黑名单里的用户(这里最耗时,用多协程简单搞定提速N部),保存到2015September5.txt
这个版本是上个版的多线程版,上个版本没用到多协程,运行时间太慢要十几二十分钟
现在这个版本因为加了多协程goroutine运行时间只要十几秒,跟上一个版本简直天差地别
技术难度适合初级同学研究研,高手可以绕道,有兴趣的同学可以举一反三,扩展扩展
——