美文网首页
用go语言写的github加速程序

用go语言写的github加速程序

作者: 不能吃的坚果j | 来源:发表于2022-01-06 14:35 被阅读0次

作者:陈进坚
CSDN:https://blog.csdn.net/c_jian
简书:https://www.jianshu.com/u/8ba9ac5706b6
声明:有错欢迎纠正,转载请注明出处。

github地址

https://github.com/jian1098/github-speedup/releases

注意:需要管理员身份执行,如果访问变慢,再次执行程序即可

原理

通过DNS接口解析github.com的域名得到各个服务器节点的ip地址,然后将这些ip地址写入到hosts文件中,本地请求就可以直接绕过DNS服务器,直接访问网站,达到加速的效果。其中解析域名需要请求多个dns服务器,用go语言协程并发请求加快请求速度。

完整代码

package main

import (
    "bufio"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
    "os"
    "regexp"
    "strings"
    "sync"
    "time"
)

func main() {
    fmt.Println("正在解析域名...")
    //需要解析的域名
    var host = "github.com"
    var filename = "C:\\Windows\\System32\\drivers\\etc\\hosts"

    //dns服务器id
    var guid = []string{
        "29d2a14f-accc-43b8-9444-fd6b9e7902bc",
        "0e215450-a287-486e-b758-49b00e432bd4",
        "38806ef7-4638-4808-96e4-85047dfa5853",
        "53e79941-312c-4343-8739-6be3cd105805",
        "e00f2cc8-3f66-452d-b57f-804f84b774ca",
        "97a2da5b-4aa4-4811-aff7-2eb038b6f742",
        "7ddde139-f06e-40aa-b585-25d2ee6fad5f",
        "d9041619-7d90-42ea-9811-2b2fe11cb2b0",
        "02a01d5d-5111-481f-aade-e999a584d8a4",
        "80a828bd-19ed-48c3-a035-e69f6468da03",
        "fc7b8db4-f81d-4432-8d27-fa43dd13df3c",
        "91937e5b-1db0-47b5-b114-c9294694f377",
        "1f4c5976-8cf3-47e7-be10-aa9270461477",
        "3c1c826d-3444-4350-849b-0b9b9755df78",
        "7a2c1fe7-f9de-4fee-b797-bfe343d49f15",
        "eac78784-07a1-4869-be7c-3870a8dcebfc",
        "87c200e0-0059-479f-8103-e9e504f735d0",
        "dc440a55-1148-480f-90a7-9d1e0269b682",
        "08117724-8437-4ebb-88ae-93e50f660867",
        "5fb9012d-b47c-4087-84a2-0b0dfa8c94ab",
        "4250e220-157f-4831-8e6b-ad7cead81ca0",
        "1e375923-e5ee-491e-ba21-621a95ef9de9",
        "39bed414-9402-4266-aa9a-8252e958558f",
        "a0be885d-24ad-487d-bbb0-c94cd02a137d",
        "29d2a14f-accc-43b8-9444-fd6b9e7902bc",
    }
    var ipArr []string
    var wg sync.WaitGroup
    for _, val := range guid {
        data := url.Values{}
        data.Set("guid", val)
        data.Set("host", host)
        wg.Add(1)
        go func() {
            res := httpPost("http://mping.chinaz.com/Handle/AjaxHandler.ashx?action=Ping", data)
            ip := getIp(res)
            if ip != "" {
                ipArr = append(ipArr, ip+" "+host)
            }
            wg.Done()
        }()
    }
    wg.Wait()
    ipArr = arrayUnique(ipArr)

    content, err := readFile(filename, host)
    if err != nil {
        fmt.Println(err)
        return
    }

    for _, val := range ipArr {
        content += val + "\n"
    }
    //将获取到的ip写入hosts文件
    err = writeFile(filename, content)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("写入数据成功!")
    time.Sleep(time.Duration(time.Second * 3))
}

//post请求
func httpPost(link string, data url.Values) string {
    resp, err := http.PostForm(link, data)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }

    return string(body)
}

//获取ip地址
func getIp(str string) string {
    gexp := "^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$"
    arr := strings.Split(str, "'")
    var ip string
    for _, str := range arr {
        match, _ := regexp.MatchString(gexp, str)
        if match {
            ip = str
            break
        }
    }
    return ip
}

//数组去重
func arrayUnique(arr []string) []string {
    size := len(arr)
    result := make([]string, 0, size)
    temp := map[string]struct{}{}
    for i := 0; i < size; i++ {
        if _, ok := temp[arr[i]]; ok != true {
            temp[arr[i]] = struct{}{}
            result = append(result, arr[i])
        }
    }
    return result
}

//读取文件内容
func readFile(filename, hosts string) (string, error) {
    file, err := os.Open(filename)
    if err != nil {
        return "", err
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)
    var content string //用来保存文件内容
    for scanner.Scan() {
        // 读取当前行内容
        line := scanner.Text()
        if strings.Contains(line, hosts) {
            continue
        }
        content += line + "\n"
    }
    return content, nil
}

//写入文件
func writeFile(filename, content string) error {
    //覆盖写入
    err := ioutil.WriteFile(filename, []byte(content), 0664)
    if err != nil {
        return err
    }
    return nil
}

相关文章

网友评论

      本文标题:用go语言写的github加速程序

      本文链接:https://www.haomeiwen.com/subject/phfrcrtx.html