package com.yll.common;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.util.RuntimeUtil;
import cn.hutool.http.HttpUtil;
import org.jsoup.Jsoup;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class Solve {
public static final String STATIC_IP = "https://sites.ipaddress.com/assets-cdn.github.com/";
public static final String DOMAIN = "https://sites.ipaddress.com/fastly.net/";
public static final String IP = "https://sites.ipaddress.com/github.com/";
public static final String DEFAULT_HOSTS = "C:\\Windows\\System32\\drivers\\etc\\HOSTS";
public static final String BAK_HOSTS = "D:\\HOSTS";
public static final String ADMIN = "@echo off\n"
+ "%1 mshta vbscript:CreateObject(\"Shell.Application\").ShellExecute(\"cmd.exe\",\"/c %~s0 ::\",\"\",\"runas\",1)(window.close)&&exit\n"
+ "cd /d \"%~dp0\"\n";
private static final String MOVE = "MOVE %s %s";
private static final String BEGIN = "######################GITHUB_BEGIN######################";
private static final String END = "######################GITHUB_END########################";
public static void main(String[] args) {
try {
System.out.println("=======================================");
System.out.println("==========开始获取最新GitHub配置==========");
System.out.println("=======================================");
Map<String, List<String>> config = new TreeMap<>();
//Key = github.com
String ipHtml = HttpUtil.get(IP);
String ip = Jsoup.parse(ipHtml).getElementById("tabpanel-dns-a").getElementsByTag("a").text();
config.put("github.com", Collections.singletonList(ip));
//Key = github.global.ssl.fastly.net
String domainIpHtml = HttpUtil.get(DOMAIN);
String domainIp = Jsoup.parse(domainIpHtml).getElementById("tabpanel-dns-a").getElementsByTag("a").text()
.split(" ")[0];
config.put("github.global.ssl.fastly.net", Collections.singletonList(domainIp));
//Key = assets-cdn.github.com
String staticResourceIpHtml = HttpUtil.get(STATIC_IP);
String[] staticResourceIp = Jsoup.parse(staticResourceIpHtml).getElementById("tabpanel-dns-a")
.getElementsByTag("a").text().split(" ");
config.put("assets-cdn.github.com", Arrays.asList(staticResourceIp));
config.forEach((k, v) -> v.forEach(val -> System.out.println(val + " " + k)));
System.out.println("=======================================");
System.out.println("==========获取最新GitHub配置完成==========");
System.out.println("=======================================");
System.out.println();
Scanner scanner = new Scanner(System.in);
showHost(scanner);
System.out.println("是否写入host文件?(Y/N)");
String next = scanner.next();
List<String> latestHost = latestHost(config);
if ("Y".equals(next)) {
bakHost();
File file = createHostFile(latestHost);
moveHost(file);
} else {
return;
}
showHost(scanner);
} catch (IORuntimeException | InterruptedException | IOException e) {
e.printStackTrace();
}
}
private static void showHost(Scanner scanner) {
System.out.println("是否查看host文件?(Y/N)");
String open = scanner.next();
if ("Y".equals(open)) {
RuntimeUtil.exec("rundll32 url.dll FileProtocolHandler file://" + DEFAULT_HOSTS);
}
System.out.println("是否打印host文件?(Y/N)");
String print = scanner.next();
if ("Y".equals(print)) {
FileUtil.readLines(DEFAULT_HOSTS, StandardCharsets.UTF_8).forEach(System.out::println);
}
}
private static void bakHost() {
FileUtil.copy(new File(DEFAULT_HOSTS),new File(BAK_HOSTS+"-"+ new Date().getTime()+".bak"),true);
System.out.println("已备份到目录(不覆盖):"+BAK_HOSTS);
}
private static void moveHost(File hosts) throws IOException, InterruptedException {
System.out.println(">>开始将GitHub配置写入host文件");
File file = FileUtil.writeString(ADMIN + String.format(MOVE, hosts, DEFAULT_HOSTS), "admin.bat",
StandardCharsets.UTF_8);
Process exec = RuntimeUtil.exec(file.getAbsolutePath());
exec.waitFor();
System.out.println(">>写入完毕!");
}
private static File createHostFile(List<String> latestHost) {
return FileUtil.writeLines(latestHost, "HOSTS", StandardCharsets.UTF_8);
}
private static List<String> latestHost(Map<String, List<String>> config) {
List<String> list = new ArrayList<>();
List<String> hostConfigList = FileUtil.readLines(DEFAULT_HOSTS, StandardCharsets.UTF_8);
int start = 0;
int end = 0;
for (int i = 0; i < hostConfigList.size(); i++) {
if (hostConfigList.get(i).contains(BEGIN)) {
start = i;
}
if (hostConfigList.get(i).contains(END)) {
end = i;
break;
}
}
list.addAll(ListUtil.sub(hostConfigList, 0, start));
list.addAll(ListUtil.sub(hostConfigList, end + 1, hostConfigList.size()));
list.add(BEGIN);
config.forEach((k, v) -> v.forEach(val -> list.add(val + " " + k)));
list.add(END);
return list;
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yll</groupId>
<artifactId>enable_github</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.18</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.16.1</version>
</dependency>
</dependencies>
<build>
<finalName>githubAccelerate</finalName><!-- 导出jar的名字 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.yll.Solve</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
结果