@ -0,0 +1,51 @@ | |||||
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions | |||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions | |||||
name: GitHub520 | |||||
on: | |||||
push: | |||||
schedule: | |||||
- cron: '0 */2 * * *' | |||||
jobs: | |||||
build: | |||||
runs-on: ubuntu-latest | |||||
strategy: | |||||
matrix: | |||||
python-version: [3.7] | |||||
steps: | |||||
- uses: actions/checkout@v2 | |||||
- name: Set up Python ${{ matrix.python-version }} | |||||
uses: actions/setup-python@v2 | |||||
with: | |||||
python-version: ${{ matrix.python-version }} | |||||
- name: Install dependencies | |||||
run: | | |||||
python -m pip install --upgrade pip | |||||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi | |||||
- name: update readme | |||||
env: | |||||
gitee_token: ${{ secrets.GITEE_TOKEN }} | |||||
gitee_gist_id: ${{ secrets.GITEE_GIST_ID }} | |||||
gitee_gist_file_name: ${{ secrets.GITEE_GIST_FILE_NAME }} | |||||
run: | | |||||
# fetch new ip content and update readme file | |||||
python fetch_ips.py | |||||
- name: commit | |||||
id: commit | |||||
run: | | |||||
git config --global user.email sunxuebangong@gmail.com | |||||
git config --global user.name action_bot | |||||
git add . | |||||
git commit -m "update readme content" | |||||
continue-on-error: true | |||||
- name: Check on failures | |||||
if: steps.commit.outputs.status == 'failure' | |||||
run: exit 1 | |||||
- name: Push changes | |||||
uses: ad-m/github-push-action@master | |||||
with: | |||||
github_token: ${{ secrets.GITHUB_TOKEN }} |
@ -0,0 +1,131 @@ | |||||
# Byte-compiled / optimized / DLL files | |||||
__pycache__/ | |||||
*.py[cod] | |||||
*$py.class | |||||
# C extensions | |||||
*.so | |||||
# Distribution / packaging | |||||
.Python | |||||
build/ | |||||
develop-eggs/ | |||||
dist/ | |||||
downloads/ | |||||
eggs/ | |||||
.eggs/ | |||||
lib/ | |||||
lib64/ | |||||
parts/ | |||||
sdist/ | |||||
var/ | |||||
wheels/ | |||||
pip-wheel-metadata/ | |||||
share/python-wheels/ | |||||
*.egg-info/ | |||||
.installed.cfg | |||||
*.egg | |||||
MANIFEST | |||||
# PyInstaller | |||||
# Usually these files are written by a python script from a template | |||||
# before PyInstaller builds the exe, so as to inject date/other infos into it. | |||||
*.manifest | |||||
*.spec | |||||
# Installer logs | |||||
pip-log.txt | |||||
pip-delete-this-directory.txt | |||||
# Unit test / coverage reports | |||||
htmlcov/ | |||||
.tox/ | |||||
.nox/ | |||||
.coverage | |||||
.coverage.* | |||||
.cache | |||||
nosetests.xml | |||||
coverage.xml | |||||
*.cover | |||||
*.py,cover | |||||
.hypothesis/ | |||||
.pytest_cache/ | |||||
# Translations | |||||
*.mo | |||||
*.pot | |||||
# Django stuff: | |||||
*.log | |||||
local_settings.py | |||||
db.sqlite3 | |||||
db.sqlite3-journal | |||||
# Flask stuff: | |||||
instance/ | |||||
.webassets-cache | |||||
# Scrapy stuff: | |||||
.scrapy | |||||
# Sphinx documentation | |||||
docs/_build/ | |||||
# PyBuilder | |||||
target/ | |||||
# Jupyter Notebook | |||||
.ipynb_checkpoints | |||||
# IPython | |||||
profile_default/ | |||||
ipython_config.py | |||||
# pyenv | |||||
.python-version | |||||
# pipenv | |||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. | |||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies | |||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not | |||||
# install all needed dependencies. | |||||
#Pipfile.lock | |||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow | |||||
__pypackages__/ | |||||
# Celery stuff | |||||
celerybeat-schedule | |||||
celerybeat.pid | |||||
# SageMath parsed files | |||||
*.sage.py | |||||
# Environments | |||||
.env | |||||
.venv | |||||
env/ | |||||
venv/ | |||||
ENV/ | |||||
env.bak/ | |||||
venv.bak/ | |||||
# Spyder project settings | |||||
.spyderproject | |||||
.spyproject | |||||
# Rope project settings | |||||
.ropeproject | |||||
# mkdocs documentation | |||||
/site | |||||
# mypy | |||||
.mypy_cache/ | |||||
.dmypy.json | |||||
dmypy.json | |||||
# Pyre type checker | |||||
.pyre/ | |||||
.idea/ | |||||
.DS_Store |
@ -0,0 +1,136 @@ | |||||
# GitHub520 | |||||
<p align="center"> | |||||
<img src="https://vip1.loli.net/2020/05/19/fLSBE29NxoFtOcd.gif"/> | |||||
<br><strong><a href="https://github.com/521xueweihan/HelloGitHub" target="_blank">HelloGitHub</a></strong> 分享 GitHub 上有趣、入门级的开源项目。<br>兴趣是最好的老师,这里能够帮你找到编程的兴趣! | |||||
</p> | |||||
## 一、介绍 | |||||
对 GitHub 说"爱"太难了:访问慢、图片加载不出来。 | |||||
*注:* 本项目还处于测试阶段,仅在本机测试通过,如有问题欢迎提 [issues](https://github.com/521xueweihan/GitHub520/issues/new) | |||||
--- | |||||
本项目无需安装任何程序,通过修改本地 hosts 文件,试图解决: | |||||
- GitHub 访问速度慢的问题 | |||||
- GitHub 项目中的图片显示不出的问题 | |||||
花 5 分钟时间,让你"爱"上 GitHub。 | |||||
## 二、使用方法 | |||||
### 2.1 复制下面的内容 | |||||
```bash | |||||
# GitHub520 Host Start | |||||
185.199.108.154 github.githubassets.com | |||||
199.232.96.133 camo.githubusercontent.com | |||||
199.232.96.133 github.map.fastly.net | |||||
199.232.69.194 github.global.ssl.fastly.net | |||||
140.82.112.4 gist.github.com | |||||
185.199.108.153 github.io | |||||
140.82.114.4 github.com | |||||
140.82.113.6 api.github.com | |||||
199.232.96.133 raw.githubusercontent.com | |||||
199.232.96.133 user-images.githubusercontent.com | |||||
199.232.96.133 favicons.githubusercontent.com | |||||
199.232.96.133 avatars5.githubusercontent.com | |||||
199.232.96.133 avatars4.githubusercontent.com | |||||
199.232.96.133 avatars3.githubusercontent.com | |||||
199.232.96.133 avatars2.githubusercontent.com | |||||
199.232.96.133 avatars1.githubusercontent.com | |||||
199.232.96.133 avatars0.githubusercontent.com | |||||
140.82.113.9 codeload.github.com | |||||
52.216.128.147 github-cloud.s3.amazonaws.com | |||||
52.216.109.163 github-com.s3.amazonaws.com | |||||
52.216.107.188 github-production-release-asset-2e65be.s3.amazonaws.com | |||||
52.216.207.115 github-production-user-asset-6210df.s3.amazonaws.com | |||||
52.216.146.43 github-production-repository-file-5c1aeb.s3.amazonaws.com | |||||
# Star me GitHub url: https://github.com/521xueweihan/GitHub520 | |||||
# GitHub520 Host End | |||||
``` | |||||
上面内容会自动定时更新,保证最新有效。数据更新时间:2021-01-02T14:26:43+08:00(内容无变动不会更新) | |||||
### 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 rcnscd restart` | |||||
3. Mac 命令:`sudo killall -HUP mDNSResponder` | |||||
**Tips:** 上述方法无效可以尝试重启机器。 | |||||
### 2.2 自动方式 | |||||
**Tip**:推荐 [SwitchHosts](https://github.com/oldj/SwitchHosts) 工具管理 hosts | |||||
以 SwitchHosts 为例,看一下怎么使用的,配置参考下面: | |||||
- Title: 随意 | |||||
- Type: `Remote` | |||||
- URL: `https://gitee.com/xueweihan/codes/6g793pm2k1hacwfbyesl464/raw?blob_name=GitHub520.yml` | |||||
- Auto Refresh: 最好选 `1 hour` | |||||
如图: | |||||
![](./img/switch-hosts.png) | |||||
这样每次 hosts 有更新都能及时进行更新,免去手动更新。 | |||||
### 2.3 AdGuard Home 用户(自动方式) | |||||
在 **过滤器>DNS 封锁清单>添加阻止列表>添加一个自定义列表**,配置如下: | |||||
- 名称: 随意 | |||||
- URL: `https://gitee.com/xueweihan/codes/6g793pm2k1hacwfbyesl464/raw?blob_name=GitHub520.yml`(和上面 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 家族软件** 添加方法均类似。 | |||||
## 三、效果对比 | |||||
之前的样子: | |||||
![](./img/old.png) | |||||
修改完 hosts 的样子: | |||||
![](./img/new.png) | |||||
## TODO | |||||
- [x] 定时自动更新 hosts 内容 | |||||
- [x] hosts 内容无变动不会更新 | |||||
- [ ] 寻到最优 IP 解析结果 | |||||
## 声明 | |||||
<a rel="license" href="https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh"><img alt="知识共享许可协议" style="border-width: 0" src="https://licensebuttons.net/l/by-nc-nd/4.0/88x31.png"></a><br>本作品采用 <a rel="license" href="https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh">署名-非商业性使用-禁止演绎 4.0 国际</a> 进行许可。 |
@ -0,0 +1,110 @@ | |||||
# GitHub520 | |||||
<p align="center"> | |||||
<img src="https://vip1.loli.net/2020/05/19/fLSBE29NxoFtOcd.gif"/> | |||||
<br><strong><a href="https://github.com/521xueweihan/HelloGitHub" target="_blank">HelloGitHub</a></strong> 分享 GitHub 上有趣、入门级的开源项目。<br>兴趣是最好的老师,这里能够帮你找到编程的兴趣! | |||||
</p> | |||||
## 一、介绍 | |||||
对 GitHub 说"爱"太难了:访问慢、图片加载不出来。 | |||||
*注:* 本项目还处于测试阶段,仅在本机测试通过,如有问题欢迎提 [issues](https://github.com/521xueweihan/GitHub520/issues/new) | |||||
--- | |||||
本项目无需安装任何程序,通过修改本地 hosts 文件,试图解决: | |||||
- GitHub 访问速度慢的问题 | |||||
- GitHub 项目中的图片显示不出的问题 | |||||
花 5 分钟时间,让你"爱"上 GitHub。 | |||||
## 二、使用方法 | |||||
### 2.1 复制下面的内容 | |||||
```bash | |||||
{hosts_str} | |||||
``` | |||||
上面内容会自动定时更新,保证最新有效。数据更新时间:{update_time}(内容无变动不会更新) | |||||
### 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 rcnscd restart` | |||||
3. Mac 命令:`sudo killall -HUP mDNSResponder` | |||||
**Tips:** 上述方法无效可以尝试重启机器。 | |||||
### 2.2 自动方式 | |||||
**Tip**:推荐 [SwitchHosts](https://github.com/oldj/SwitchHosts) 工具管理 hosts | |||||
以 SwitchHosts 为例,看一下怎么使用的,配置参考下面: | |||||
- Title: 随意 | |||||
- Type: `Remote` | |||||
- URL: `https://gitee.com/xueweihan/codes/6g793pm2k1hacwfbyesl464/raw?blob_name=GitHub520.yml` | |||||
- Auto Refresh: 最好选 `1 hour` | |||||
如图: | |||||
![](./img/switch-hosts.png) | |||||
这样每次 hosts 有更新都能及时进行更新,免去手动更新。 | |||||
### 2.3 AdGuard Home 用户(自动方式) | |||||
在 **过滤器>DNS 封锁清单>添加阻止列表>添加一个自定义列表**,配置如下: | |||||
- 名称: 随意 | |||||
- URL: `https://gitee.com/xueweihan/codes/6g793pm2k1hacwfbyesl464/raw?blob_name=GitHub520.yml`(和上面 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 家族软件** 添加方法均类似。 | |||||
## 三、效果对比 | |||||
之前的样子: | |||||
![](./img/old.png) | |||||
修改完 hosts 的样子: | |||||
![](./img/new.png) | |||||
## TODO | |||||
- [x] 定时自动更新 hosts 内容 | |||||
- [x] hosts 内容无变动不会更新 | |||||
- [ ] 寻到最优 IP 解析结果 | |||||
## 声明 | |||||
<a rel="license" href="https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh"><img alt="知识共享许可协议" style="border-width: 0" src="https://licensebuttons.net/l/by-nc-nd/4.0/88x31.png"></a><br>本作品采用 <a rel="license" href="https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh">署名-非商业性使用-禁止演绎 4.0 国际</a> 进行许可。 |
@ -0,0 +1,164 @@ | |||||
#!/usr/bin/env python | |||||
# -*- coding:utf-8 -*- | |||||
# | |||||
# Author : XueWeiHan | |||||
# E-mail : 595666367@qq.com | |||||
# Date : 2020-05-19 15:27 | |||||
# Desc : 获取最新的 GitHub 相关域名对应 IP | |||||
import os | |||||
import re | |||||
import json | |||||
import traceback | |||||
from datetime import datetime, timezone, timedelta | |||||
from collections import Counter | |||||
from retry import retry | |||||
import requests | |||||
RAW_URL = [ | |||||
"github.githubassets.com", | |||||
"camo.githubusercontent.com", | |||||
"github.map.fastly.net", | |||||
"github.global.ssl.fastly.net", | |||||
"gist.github.com", | |||||
"github.io", | |||||
"github.com", | |||||
"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", | |||||
"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"] | |||||
IPADDRESS_PREFIX = ".ipaddress.com" | |||||
HOSTS_TEMPLATE = """# GitHub520 Host Start | |||||
{content}# Star me GitHub url: https://github.com/521xueweihan/GitHub520 | |||||
# GitHub520 Host End\n""" | |||||
def write_file(hosts_content: str): | |||||
update_time = datetime.utcnow().astimezone( | |||||
timezone(timedelta(hours=8))).replace(microsecond=0).isoformat() | |||||
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") | |||||
# 应该取消 write yaml file,改成 gitee gist 地址同步(国内访问流畅) | |||||
write_yaml_file(hosts_content) | |||||
with open(output_doc_file_path, "r") as old_readme_fb: | |||||
old_content = old_readme_fb.read() | |||||
old_hosts = old_content.split("```bash")[1].split("```")[0].strip() | |||||
if old_hosts == hosts_content: | |||||
print("host not change") | |||||
return False | |||||
with open(template_path, "r") as temp_fb: | |||||
template_str = temp_fb.read() | |||||
hosts_content = template_str.format(hosts_str=hosts_content, | |||||
update_time=update_time) | |||||
with open(output_doc_file_path, "w") as output_fb: | |||||
output_fb.write(hosts_content) | |||||
return True | |||||
def write_yaml_file(hosts_content: str): | |||||
output_yaml_file_path = os.path.join(os.path.dirname(__file__), 'hosts') | |||||
with open(output_yaml_file_path, "w") as output_yaml_fb: | |||||
output_yaml_fb.write(hosts_content) | |||||
def make_ipaddress_url(raw_url: str): | |||||
""" | |||||
生成 ipaddress 对应的 url | |||||
:param raw_url: 原始 url | |||||
:return: ipaddress 的 url | |||||
""" | |||||
dot_count = raw_url.count(".") | |||||
if dot_count > 1: | |||||
raw_url_list = raw_url.split(".") | |||||
tmp_url = raw_url_list[-2] + "." + raw_url_list[-1] | |||||
ipaddress_url = "https://" + tmp_url + IPADDRESS_PREFIX + "/" + raw_url | |||||
else: | |||||
ipaddress_url = "https://" + raw_url + IPADDRESS_PREFIX | |||||
return ipaddress_url | |||||
@retry(tries=3) | |||||
def get_ip(session: requests.session, raw_url: str): | |||||
url = make_ipaddress_url(raw_url) | |||||
try: | |||||
rs = session.get(url, timeout=5) | |||||
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") | |||||
except Exception as ex: | |||||
print("get: {}, error: {}".format(url, ex)) | |||||
raise Exception | |||||
@retry(tries=3) | |||||
def update_gitee_gist(session: requests.session, host_content): | |||||
gitee_token = os.getenv("gitee_token") | |||||
gitee_gist_id = os.getenv("gitee_gist_id") | |||||
gist_file_name = os.getenv("gitee_gist_file_name") | |||||
url = "https://gitee.com/api/v5/gists/{}".format(gitee_gist_id) | |||||
headers = { | |||||
"Content-Type": "application/json"} | |||||
data = { | |||||
"access_token": gitee_token, | |||||
"files": {gist_file_name: {"content": host_content}}, | |||||
"public": "true"} | |||||
json_data = json.dumps(data) | |||||
try: | |||||
response = session.patch(url, data=json_data, headers=headers, | |||||
timeout=20) | |||||
if response.status_code == 200: | |||||
print("update gitee gist success") | |||||
else: | |||||
print("update gitee gist fail: {} {}".format(response.status_code, | |||||
response.content)) | |||||
except Exception as e: | |||||
traceback.print_exc(e) | |||||
raise Exception(e) | |||||
def main(): | |||||
session = requests.session() | |||||
content = "" | |||||
for raw_url in RAW_URL: | |||||
try: | |||||
host_name, ip = get_ip(session, raw_url) | |||||
content += ip.ljust(30) + host_name + "\n" | |||||
except Exception: | |||||
continue | |||||
if not content: | |||||
return | |||||
hosts_content = HOSTS_TEMPLATE.format(content=content) | |||||
has_change = write_file(hosts_content) | |||||
if has_change: | |||||
try: | |||||
update_gitee_gist(session, hosts_content) | |||||
except Exception as e: | |||||
print("update gitee gist fail:{}".format(e)) | |||||
print(hosts_content) | |||||
if __name__ == '__main__': | |||||
main() |
@ -0,0 +1,26 @@ | |||||
# GitHub520 Host Start | |||||
185.199.108.154 github.githubassets.com | |||||
199.232.96.133 camo.githubusercontent.com | |||||
199.232.96.133 github.map.fastly.net | |||||
199.232.69.194 github.global.ssl.fastly.net | |||||
140.82.112.4 gist.github.com | |||||
185.199.108.153 github.io | |||||
140.82.114.4 github.com | |||||
140.82.113.6 api.github.com | |||||
199.232.96.133 raw.githubusercontent.com | |||||
199.232.96.133 user-images.githubusercontent.com | |||||
199.232.96.133 favicons.githubusercontent.com | |||||
199.232.96.133 avatars5.githubusercontent.com | |||||
199.232.96.133 avatars4.githubusercontent.com | |||||
199.232.96.133 avatars3.githubusercontent.com | |||||
199.232.96.133 avatars2.githubusercontent.com | |||||
199.232.96.133 avatars1.githubusercontent.com | |||||
199.232.96.133 avatars0.githubusercontent.com | |||||
140.82.113.9 codeload.github.com | |||||
52.216.128.147 github-cloud.s3.amazonaws.com | |||||
52.216.109.163 github-com.s3.amazonaws.com | |||||
52.216.107.188 github-production-release-asset-2e65be.s3.amazonaws.com | |||||
52.216.207.115 github-production-user-asset-6210df.s3.amazonaws.com | |||||
52.216.146.43 github-production-repository-file-5c1aeb.s3.amazonaws.com | |||||
# Star me GitHub url: https://github.com/521xueweihan/GitHub520 | |||||
# GitHub520 Host End |
@ -0,0 +1,2 @@ | |||||
requests==2.23.0 | |||||
retry==0.9.2 |