package main
import (
"bufio"
"crypto/tls"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"os"
"path/filepath"
"strings"
"time"
)
type RespData struct {
Mobile string
Msg string
Meta struct {
Result string `json:result`
} `json:meta`
Data struct {
Area string `json:area`
Operator string `json:operator`
} `json:data`
}
var (
client *http.Client
)
func init() {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}} //忽略https的证书检查
client = &http.Client{Transport: tr}
}
func main() {
log.Println("请输入含有手机号的文本文件路径(最终结果也将放在此目录中)!当手机号较多时将会消耗较多系统资源")
stdInput := bufio.NewReader(os.Stdin)
filePath, _ := stdInput.ReadString('\n')
filePath = strings.ReplaceAll(filePath, "\n", "")
filePath = strings.ReplaceAll(filePath, "\r", "")
filePath = strings.Trim(filePath, " ")
if filePath == "" {
log.Fatal("您未输入文件路径!告辞")
}
mobiles := ReadMobilesFromFile(filePath)
mobileAreaChan := make(chan *RespData, len(mobiles))
for _, mobile := range mobiles {
go MobileAreaInfo(mobileAreaChan, mobile)
}
fileDir := filepath.Dir(filePath)
currentTime := time.Now()
mobileAreaFile := filepath.Join(fileDir, currentTime.Format("2006-01-02"))
os.Remove(mobileAreaFile)
fileObj, err := os.Create(mobileAreaFile)
if err != nil {
log.Fatal(err)
}
defer fileObj.Close()
writer := bufio.NewWriter(fileObj)
for i := 0; i < len(mobiles); i++ {
data := <-mobileAreaChan
line := fmt.Sprintf("手机号=%s 归属地=%s 运营商=%s 错误信息=%s\n", data.Mobile, data.Data.Area, data.Data.Operator, data.Msg)
fmt.Println(line)
writer.WriteString(line)
}
writer.Flush()
}
//从文件中读取手机号
func ReadMobilesFromFile(fileName string) []string {
file, openErr := os.Open(fileName)
if openErr != nil {
log.Fatal(openErr)
}
defer file.Close()
ret := []string{}
rd := bufio.NewReader(file)
for {
line, readErr := rd.ReadString('\n')
if readErr != nil && readErr == io.EOF {
break
} else if readErr != nil {
log.Fatal(readErr)
}
line = strings.Replace(line, "\n", "", -1)
line = strings.Replace(line, "\r", "", -1)
ret = append(ret, line)
}
return ret
}
//手机号归属地信息
func MobileAreaInfo(areaChan chan *RespData, mobile string) {
var respData *RespData = new(RespData)
respData.Mobile = mobile
req, err := http.NewRequest("GET", fmt.Sprintf("https://www.baifubao.com/callback?cmd=1059&phone=%s", mobile), nil)
if err != nil {
respData.Msg = err.Error()
areaChan <- respData
return
}
resp, err := client.Do(req)
if err != nil {
respData.Msg = err.Error()
areaChan <- respData
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
respData.Msg = fmt.Sprintf("响应状态码%d错误", resp.StatusCode)
areaChan <- respData
return
}
bodyData, _ := ioutil.ReadAll(resp.Body)
bodyStr := string(bodyData)
bodyStr = strings.Replace(bodyStr, "/*fgg_again*/(", "", -1)
bodyStr = strings.TrimSuffix(bodyStr, ")")
json.Unmarshal([]byte(bodyStr), respData)
areaChan <- respData
}
批量获取手机号归属地
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- java获取手机号归属地 一般想获取手机号归属地等信息个人是无法获取的,但是可以通过调用第三方接口获取,具体百度搜...