diff --git a/README.md b/README.md index ebaf87b58..e69de29bb 100644 --- a/README.md +++ b/README.md @@ -1,179 +0,0 @@ -# GitHub520 -

- -
HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。
兴趣是最好的老师,这里能够帮你找到编程的兴趣! -

- -[raw.hellogithub.com](https://raw.hellogithub.com/) 服务器续费了 3 年到 2024.12 共花了:1500+💰 - -有余粮的朋友[点击扫码赞助](https://cdn.jsdelivr.net/gh/521xueweihan/img_logo@main/logo/receiving_code.png),感谢🙏 - -## 一、介绍 -对 GitHub 说"爱"太难了:访问慢、图片加载不出来。 - -*注:* 本项目还处于测试阶段,仅在本机测试通过,如有问题欢迎提 [issues](https://github.com/521xueweihan/GitHub520/issues/new) - ---- - -本项目无需安装任何程序,通过修改本地 hosts 文件,试图解决: -- GitHub 访问速度慢的问题 -- GitHub 项目中的图片显示不出的问题 - -花 5 分钟时间,让你"爱"上 GitHub。 - -## 二、使用方法 - -### 2.1 复制下面的内容 -```bash -# GitHub520 Host Start -140.82.114.25 alive.github.com -140.82.114.26 live.github.com -185.199.108.154 github.githubassets.com -140.82.114.22 central.github.com -185.199.108.133 desktop.githubusercontent.com -185.199.108.153 assets-cdn.github.com -185.199.108.133 camo.githubusercontent.com -185.199.108.133 github.map.fastly.net -151.101.1.194 github.global.ssl.fastly.net -140.82.114.3 gist.github.com -185.199.108.153 github.io -140.82.114.4 github.com -192.0.66.2 github.blog -140.82.114.5 api.github.com -185.199.108.133 raw.githubusercontent.com -185.199.108.133 user-images.githubusercontent.com -185.199.108.133 favicons.githubusercontent.com -185.199.108.133 avatars5.githubusercontent.com -185.199.108.133 avatars4.githubusercontent.com -185.199.108.133 avatars3.githubusercontent.com -185.199.108.133 avatars2.githubusercontent.com -185.199.108.133 avatars1.githubusercontent.com -185.199.108.133 avatars0.githubusercontent.com -185.199.108.133 avatars.githubusercontent.com -140.82.113.10 codeload.github.com -52.216.50.209 github-cloud.s3.amazonaws.com -52.217.131.145 github-com.s3.amazonaws.com -3.5.1.132 github-production-release-asset-2e65be.s3.amazonaws.com -3.5.17.197 github-production-user-asset-6210df.s3.amazonaws.com -52.217.140.201 github-production-repository-file-5c1aeb.s3.amazonaws.com -185.199.108.153 githubstatus.com -140.82.114.18 github.community -52.224.38.193 github.dev -140.82.113.22 collector.github.com -13.107.42.16 pipelines.actions.githubusercontent.com -185.199.108.133 media.githubusercontent.com -185.199.108.133 cloud.githubusercontent.com -185.199.108.133 objects.githubusercontent.com -13.107.213.51 vscode.dev - - -# Update time: 2022-11-22T12:05:53+08:00 -# Update url: https://raw.hellogithub.com/hosts -# Star me: https://github.com/521xueweihan/GitHub520 -# GitHub520 Host End - -``` - -上面内容会自动定时更新,保证最新有效。数据更新时间:2022-11-22T12:05:53+08:00(内容无变动不会更新) - -- 文件:`https://raw.hellogithub.com/hosts` -- JSON:`https://raw.hellogithub.com/hosts.json` - -### 2.1 手动方式 - -#### 2.1.1 修改 hosts 文件 -hosts 文件在每个系统的位置不一,详情如下: -- Windows 系统:`C:\Windows\System32\drivers\etc\hosts` -- Linux 系统:`/etc/hosts` -- Mac(苹果电脑)系统:`/etc/hosts` -- Android(安卓)系统:`/system/etc/hosts` -- iPhone(iOS)系统:`/etc/hosts` - -修改方法,把第一步的内容复制到文本末尾: - -1. Windows 使用记事本。 -2. Linux、Mac 使用 Root 权限:`sudo vi /etc/hosts`。 -3. iPhone、iPad 须越狱、Android 必须要 root。 - -#### 2.1.2 激活生效 -大部分情况下是直接生效,如未生效可尝试下面的办法,刷新 DNS: - -1. Windows:在 CMD 窗口输入:`ipconfig /flushdns` - -2. Linux 命令:`sudo nscd restart`,如报错则须安装:`sudo apt install nscd` 或 `sudo /etc/init.d/nscd restart` - -3. Mac 命令:`sudo killall -HUP mDNSResponder` - -**Tips:** 上述方法无效可以尝试重启机器。 - -### 2.2 自动方式 - -**Tip**:推荐 [SwitchHosts](https://github.com/oldj/SwitchHosts) 工具管理 hosts - -以 SwitchHosts 为例,看一下怎么使用的,配置参考下面: - -- Title: 随意 - -- Type: `Remote` - -- URL: `https://raw.hellogithub.com/hosts` - -- Auto Refresh: 最好选 `1 hour` - -如图: - -![](./img/switch-hosts.png) - -这样每次 hosts 有更新都能及时进行更新,免去手动更新。 - -### 2.3 One-liner (适用于类Unix系统) - -`sed -i "/# GitHub520 Host Start/Q" /etc/hosts && curl https://raw.hellogithub.com/hosts >> /etc/hosts` -自动更新`/etc/hosts`文件,可以添加到cron定时执行。使用前确保Github520内容在该文件最后部分。 - -### 2.4 AdGuard Home 用户(自动方式) - -在 **过滤器>DNS 封锁清单>添加阻止列表>添加一个自定义列表**,配置如下: - -- 名称: 随意 - -- URL: `https://raw.hellogithub.com/hosts`(和上面 SwitchHosts 使用的一样) - -如图: - -![](./img/AdGuard-rules.png) - -更新间隔在 **设置>常规设置>过滤器更新间隔(设置一小时一次即可)**,记得勾选上 **使用过滤器和 Hosts 文件以拦截指定域名** - -![](./img/AdGuard-rules2.png) - -**Tip**:不要添加在 **DNS 允许清单** 内,只能添加在 **DNS 封锁清单** 才管用。另外,AdGuard for Mac、AdGuard for Windows、AdGuard for Android、AdGuard for IOS 等等 **AdGuard 家族软件** 添加方法均类似。 - -### 2.5 Chrome 插件方式 - -[FasterHosts](https://github.com/gauseen/faster-hosts) 是个 Chrome 插件,主要原理是拦截浏览器的某些请求,将 `domain` 替换成访问速度较快的那个。hosts 资源来自 [GitHub520](https://github.com/521xueweihan/GitHub520),每 1 小时更新一次。 - -> 1. 下载 [FasterHosts](https://github.com/gauseen/faster-hosts/archive/master.zip) 然后解压,找到 `extension` 子目录 -> 2. 打开 Chrome,输入: `chrome://extensions/` -> 3. 打开「开发者模式」 -> 4. 选择「加载已解压的扩展程序」,然后定位到刚才解压的文件夹里面的 `extension` 目录,确定 -> 5. 这就安装好了,关闭「开发者模式」 - -## 三、效果对比 -之前的样子: - -![](./img/old.png) - -修改完 hosts 的样子: - -![](./img/new.png) - - -## TODO -- [x] 定时自动更新 hosts 内容 -- [x] hosts 内容无变动不会更新 -- [ ] 寻到最优 IP 解析结果 - - -## 声明 -知识共享许可协议
本作品采用 署名-非商业性使用-禁止演绎 4.0 国际 进行许可。 diff --git a/README_template.md b/README_template.md index 87d16eea0..1ad193d80 100644 --- a/README_template.md +++ b/README_template.md @@ -126,7 +126,7 @@ hosts 文件在每个系统的位置不一,详情如下: ## TODO - [x] 定时自动更新 hosts 内容 - [x] hosts 内容无变动不会更新 -- [ ] 寻到最优 IP 解析结果 +- [x] 寻到最优 IP 解析结果 ## 声明 diff --git a/fetch_ips.py b/fetch_ips.py index 755fa7366..033c443b6 100644 --- a/fetch_ips.py +++ b/fetch_ips.py @@ -8,56 +8,34 @@ import os import re import json -import traceback +from typing import Any, Optional from datetime import datetime, timezone, timedelta -from collections import Counter -import requests +from pythonping import ping +from requests_html import HTMLSession from retry import retry -RAW_URL = [ - "alive.github.com", - "live.github.com", - "github.githubassets.com", - "central.github.com", - "desktop.githubusercontent.com", - "assets-cdn.github.com", - "camo.githubusercontent.com", - "github.map.fastly.net", - "github.global.ssl.fastly.net", - "gist.github.com", - "github.io", - "github.com", - "github.blog", - "api.github.com", - "raw.githubusercontent.com", - "user-images.githubusercontent.com", - "favicons.githubusercontent.com", - "avatars5.githubusercontent.com", - "avatars4.githubusercontent.com", - "avatars3.githubusercontent.com", - "avatars2.githubusercontent.com", - "avatars1.githubusercontent.com", - "avatars0.githubusercontent.com", - "avatars.githubusercontent.com", - "codeload.github.com", - "github-cloud.s3.amazonaws.com", - "github-com.s3.amazonaws.com", - "github-production-release-asset-2e65be.s3.amazonaws.com", - "github-production-user-asset-6210df.s3.amazonaws.com", - "github-production-repository-file-5c1aeb.s3.amazonaws.com", - "githubstatus.com", - "github.community", - "github.dev", - "collector.github.com", - "pipelines.actions.githubusercontent.com", - "media.githubusercontent.com", - "cloud.githubusercontent.com", - "objects.githubusercontent.com", - "vscode.dev"] - -IPADDRESS_PREFIX = ".ipaddress.com" +GITHUB_URLS = [ + 'alive.github.com', 'api.github.com', 'assets-cdn.github.com', + 'avatars.githubusercontent.com', 'avatars0.githubusercontent.com', + 'avatars1.githubusercontent.com', 'avatars2.githubusercontent.com', + 'avatars3.githubusercontent.com', 'avatars4.githubusercontent.com', + 'avatars5.githubusercontent.com', 'camo.githubusercontent.com', + 'central.github.com', 'cloud.githubusercontent.com', 'codeload.github.com', + 'collector.github.com', 'desktop.githubusercontent.com', + 'favicons.githubusercontent.com', 'gist.github.com', + 'github-cloud.s3.amazonaws.com', 'github-com.s3.amazonaws.com', + 'github-production-release-asset-2e65be.s3.amazonaws.com', + 'github-production-repository-file-5c1aeb.s3.amazonaws.com', + 'github-production-user-asset-6210df.s3.amazonaws.com', 'github.blog', + 'github.com', 'github.community', 'github.githubassets.com', + 'github.global.ssl.fastly.net', 'github.io', 'github.map.fastly.net', + 'githubstatus.com', 'live.github.com', 'media.githubusercontent.com', + 'objects.githubusercontent.com', 'pipelines.actions.githubusercontent.com', + 'raw.githubusercontent.com', 'user-images.githubusercontent.com', + 'vscode.dev' +] HOSTS_TEMPLATE = """# GitHub520 Host Start {content} @@ -68,7 +46,7 @@ HOSTS_TEMPLATE = """# GitHub520 Host Start # GitHub520 Host End\n""" -def write_file(hosts_content: str, update_time: str): +def write_file(hosts_content: str, update_time: str) -> bool: output_doc_file_path = os.path.join(os.path.dirname(__file__), "README.md") template_path = os.path.join(os.path.dirname(__file__), "README_template.md") @@ -78,7 +56,8 @@ def write_file(hosts_content: str, update_time: str): old_content = old_readme_fb.read() old_hosts = old_content.split("```bash")[1].split("```")[0].strip() old_hosts = old_hosts.split("# Update time:")[0].strip() - hosts_content_hosts = hosts_content.split("# Update time:")[0].strip() + hosts_content_hosts = hosts_content.split("# Update time:")[ + 0].strip() if old_hosts == hosts_content_hosts: print("host not change") return False @@ -92,69 +71,82 @@ def write_file(hosts_content: str, update_time: str): return True -def write_host_file(hosts_content: str): +def write_host_file(hosts_content: str) -> None: output_file_path = os.path.join(os.path.dirname(__file__), 'hosts') with open(output_file_path, "w") as output_fb: output_fb.write(hosts_content) -def write_json_file(hosts_list: list): +def write_json_file(hosts_list: list) -> None: output_file_path = os.path.join(os.path.dirname(__file__), 'hosts.json') with open(output_file_path, "w") as output_fb: json.dump(hosts_list, output_fb) -def make_ipaddress_url(raw_url: str): - """ - 生成 ipaddress 对应的 url - :param raw_url: 原始 url - :return: ipaddress 的 url - """ - return f'https://www.ipaddress.com/site/{raw_url}' +def get_best_ip(ip_list: list) -> str: + ping_timeout = 2 + best_ip = '' + min_ms = ping_timeout * 1000 + for ip in ip_list: + ping_result = ping(ip, timeout=ping_timeout) + if ping_result.rtt_avg_ms == ping_timeout * 1000: + # 超时认为 IP 失效 + continue + else: + if ping_result.rtt_avg_ms < min_ms: + min_ms = ping_result.rtt_avg_ms + best_ip = ip + return best_ip @retry(tries=3) -def get_ip(session: requests.session, raw_url: str): - url = make_ipaddress_url(raw_url) +def get_ip(session: Any, github_url: str) -> Optional[str]: + url = f'https://www.ipaddress.com/site/{github_url}' + headers = { + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)' + ' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/1' + '06.0.0.0 Safari/537.36'} try: - headers = { - 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)' - ' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/1' - '06.0.0.0 Safari/537.36'} rs = session.get(url, headers=headers, timeout=5) + table = rs.html.find('.panel-item.table.table-stripes.table-v', + first=True) pattern = r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b" - ip_list = re.findall(pattern, rs.text) - ip_counter_obj = Counter(ip_list).most_common(1) - if ip_counter_obj: - return raw_url, ip_counter_obj[0][0] - raise Exception("ip address empty") + ip_list = re.findall(pattern, table.text) + best_ip = get_best_ip(ip_list) + if best_ip: + return best_ip + else: + raise Exception(f"url: {github_url}, ipaddress empty") except Exception as ex: - print("get: {}, error: {}".format(url, ex)) + print(f"get: {url}, error: {ex}") raise Exception -def main(): - session = requests.session() +def main(verbose=False) -> None: + session = HTMLSession() content = "" content_list = [] - for raw_url in RAW_URL: + for index, github_url in enumerate(GITHUB_URLS): try: - host_name, ip = get_ip(session, raw_url) - content += ip.ljust(30) + host_name + "\n" - content_list.append((ip, host_name,)) - except Exception as e: - traceback.print_exc(e) + ip = get_ip(session, github_url) + content += ip.ljust(30) + github_url + "\n" + content_list.append((ip, github_url,)) + except Exception: continue + if verbose: + print(f'process url: {index + 1}/{len(GITHUB_URLS)}') if not content: return update_time = datetime.utcnow().astimezone( timezone(timedelta(hours=8))).replace(microsecond=0).isoformat() - hosts_content = HOSTS_TEMPLATE.format(content=content, update_time=update_time) + hosts_content = HOSTS_TEMPLATE.format(content=content, + update_time=update_time) has_change = write_file(hosts_content, update_time) if has_change: write_json_file(content_list) - print(hosts_content) + if verbose: + print(hosts_content) if __name__ == '__main__': diff --git a/hosts b/hosts index 084b99f52..9941eb5e7 100644 --- a/hosts +++ b/hosts @@ -3,6 +3,7 @@ 140.82.114.26 live.github.com 185.199.108.154 github.githubassets.com 140.82.114.22 central.github.com +<<<<<<< HEAD 185.199.108.133 desktop.githubusercontent.com 185.199.108.153 assets-cdn.github.com 185.199.108.133 camo.githubusercontent.com @@ -41,6 +42,45 @@ # Update time: 2022-11-22T12:05:53+08:00 +======= +185.199.109.133 desktop.githubusercontent.com +185.199.110.153 assets-cdn.github.com +185.199.109.133 camo.githubusercontent.com +185.199.109.133 github.map.fastly.net +151.101.65.194 github.global.ssl.fastly.net +140.82.114.3 gist.github.com +185.199.110.153 github.io +140.82.114.4 github.com +192.0.66.2 github.blog +140.82.114.5 api.github.com +185.199.109.133 raw.githubusercontent.com +185.199.109.133 user-images.githubusercontent.com +185.199.109.133 favicons.githubusercontent.com +185.199.109.133 avatars5.githubusercontent.com +185.199.109.133 avatars4.githubusercontent.com +185.199.109.133 avatars3.githubusercontent.com +185.199.109.133 avatars2.githubusercontent.com +185.199.109.133 avatars1.githubusercontent.com +185.199.109.133 avatars0.githubusercontent.com +185.199.109.133 avatars.githubusercontent.com +140.82.113.10 codeload.github.com +52.217.136.161 github-cloud.s3.amazonaws.com +52.217.131.145 github-com.s3.amazonaws.com +52.216.54.1 github-production-release-asset-2e65be.s3.amazonaws.com +52.217.13.236 github-production-user-asset-6210df.s3.amazonaws.com +52.217.140.201 github-production-repository-file-5c1aeb.s3.amazonaws.com +185.199.111.153 githubstatus.com +140.82.114.18 github.community +140.82.113.22 collector.github.com +13.107.42.16 pipelines.actions.githubusercontent.com +185.199.109.133 media.githubusercontent.com +185.199.109.133 cloud.githubusercontent.com +185.199.109.133 objects.githubusercontent.com +13.107.213.51 vscode.dev + + +# Update time: 2022-11-22T05:08:07+08:00 +>>>>>>> 2161298a (feat: 增加ip可用性校验,默认择快选取) # Update url: https://raw.hellogithub.com/hosts # Star me: https://github.com/521xueweihan/GitHub520 # GitHub520 Host End diff --git a/hosts.json b/hosts.json index 9a063a102..e69de29bb 100644 --- a/hosts.json +++ b/hosts.json @@ -1 +0,0 @@ -[["140.82.114.25", "alive.github.com"], ["140.82.114.26", "live.github.com"], ["185.199.108.154", "github.githubassets.com"], ["140.82.114.22", "central.github.com"], ["185.199.108.133", "desktop.githubusercontent.com"], ["185.199.108.153", "assets-cdn.github.com"], ["185.199.108.133", "camo.githubusercontent.com"], ["185.199.108.133", "github.map.fastly.net"], ["151.101.1.194", "github.global.ssl.fastly.net"], ["140.82.114.3", "gist.github.com"], ["185.199.108.153", "github.io"], ["140.82.114.4", "github.com"], ["192.0.66.2", "github.blog"], ["140.82.114.5", "api.github.com"], ["185.199.108.133", "raw.githubusercontent.com"], ["185.199.108.133", "user-images.githubusercontent.com"], ["185.199.108.133", "favicons.githubusercontent.com"], ["185.199.108.133", "avatars5.githubusercontent.com"], ["185.199.108.133", "avatars4.githubusercontent.com"], ["185.199.108.133", "avatars3.githubusercontent.com"], ["185.199.108.133", "avatars2.githubusercontent.com"], ["185.199.108.133", "avatars1.githubusercontent.com"], ["185.199.108.133", "avatars0.githubusercontent.com"], ["185.199.108.133", "avatars.githubusercontent.com"], ["140.82.113.10", "codeload.github.com"], ["52.216.50.209", "github-cloud.s3.amazonaws.com"], ["52.217.131.145", "github-com.s3.amazonaws.com"], ["3.5.1.132", "github-production-release-asset-2e65be.s3.amazonaws.com"], ["3.5.17.197", "github-production-user-asset-6210df.s3.amazonaws.com"], ["52.217.140.201", "github-production-repository-file-5c1aeb.s3.amazonaws.com"], ["185.199.108.153", "githubstatus.com"], ["140.82.114.18", "github.community"], ["52.224.38.193", "github.dev"], ["140.82.113.22", "collector.github.com"], ["13.107.42.16", "pipelines.actions.githubusercontent.com"], ["185.199.108.133", "media.githubusercontent.com"], ["185.199.108.133", "cloud.githubusercontent.com"], ["185.199.108.133", "objects.githubusercontent.com"], ["13.107.213.51", "vscode.dev"]] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 83e22b5c7..d997081d0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ -requests==2.23.0 +requests-html==0.10.0 +pythonping==1.1.4 retry==0.9.2