前言
自7月10号仓促写完脚本并一连优化了10多天后,终!于!它进化到了最终形态!(终于能看了)
期间甚至有幸看到616的API炸了,成为了错误处理的最后一块拼图。
(顺带一提,直到现在精选曲目和歌曲排行的API也依然只返回空值)
正片
前置条件
- 云服务器。(或者家里云)
- 浏览器和它忠实的搜索引擎。
- 手和脑子。
编不下去了。
教程基于Ubuntu 22.04操作,其它Linux发行版或其它系统请自行搜索对应步骤。
服务器的上行带宽建议不要少于8Mbps,不然理论速度甚至不到1MB/s。
安装依赖
登录root账户,执行以下命令。
apt install curl python3 python3-pip -y
pip3 install requests
安装面板
为了方便教学选择利用运维面板进行搭建。
已经安装过面板可以跳过下面的步骤。
输入以下任意一条命令安装宝塔或1Panel。
装哪个看自己喜欢,其它面板也行,只要能搭站点并且有计划任务功能即可。
# 宝塔
if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec
# 1Panel
bash -c "$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)"
1Panel安装过程中的输入会比较多,跟着提示一步步来就好。
安装完成之后应该就能在终端看到提示:
记住面板的端口、地址、用户名以及密码。
通过面板搭建
因为两者的操作都差不多,因此这里以1Panel作为演示。
首先安装Web服务器,此处不论是Nginx(1Panel里只有OpenResty)还是Apache都可以。
随后创建一个新站点,配置如图。
有域名可以填自己的域名,没域名的也可以像这样直接填服务器的公网IP(不是内网IP,除非你想让机房里其它服务器也玩上阿卡伊,家里云可忽略),家里云可能需要改一下端口。
创建完成后进入网站目录,新建一个.py文件,打开并往里面复制以下代码:
#!/usr/bin/python3
import json
import os
import requests
def init(version, url): # 初始化,下载最新版本、创建data.json文件并写入版本信息
download(version, 0, url)
exit(0)
def api():
try: # 尝试获取API返回
location = requests.get("https://webapi.lowiro.com/country").headers
response = requests.get("https://webapi.lowiro.com/webapi/serve/static/bin/arcaea/apk").json()
except requests.exceptions.ConnectionError:
print("[\033[31mERROR\033[0m] Can not connect to API.")
exit(1)
if location["Country"] == "CN": # 检测位置是否在大陆
print("[\033[33mWARN\033[0m] Your location in the People's Republic of China.")
if not response["success"]: # 检测API的success字段是否返回true
print("[\033[31mERROR\033[0m] API error, code:", response["error_code"])
exit(1)
return response
def download(version, had_version, url):
update(False, had_version)
if os.system(f"curl -o arcaea_{version}.apk {url}") != 0: # 下载失败的处理
print("[\033[31mERROR\033[0m] Failed to download.")
update(True, had_version)
exit(1)
try: # 自动删除旧版本apk,不想删就直接注释
os.remove(f"arcaea_{had_version}.apk")
except (FileNotFoundError, PermissionError, OSError, IsADirectoryError):
pass
print("[\033[32mOK\033[0m] Success to download.")
update(True, version)
def update(status, version): # 更新当前状态(更新完毕:True、更新中:False)以防止多次下载
with open("data.json", "w") as f:
data = {"status": status, "version": version}
json.dump(data, f)
def main():
response = api()
version = response["value"]["version"]
url = response["value"]["url"]
try: # 判断data.json文件是否存在,存在则获取本地版本信息,不存在则进入初始化
with open("data.json", "r") as f:
data = json.load(f)
except FileNotFoundError:
init(version, url)
if data["version"] != version and data["status"]: # 判断本地版本是否为最新版本及是否正在更新
download(version, data["version"], url)
if __name__ == '__main__':
main()
如果你的服务器在国内,则需要把原代码的第16行改成下面这行:
response = requests.get("https://api.mioical.moe/arcaea/server/main").json()
接下来在当前目录打开终端,先输入./script.py
执行一次脚本。
下载过程中不要关闭终端,下载速度受你服务器的下行宽带和位置所影响。
当下载完成之后,在计划任务新建一个任务,网站目录与脚本名称按自己的填,可参考下图的配置,注意执行用户必须为root。
这时候我们就可以宣布大功告成啦~如果需要访问地址就能直接下载,可以切换成PHP网站,然后向index.php文件里复制以下内容:
<?php
$data = file_get_contents("./data.json");
$version = json_decode($data);
header("Location: arcaea_$version->version.apk");
?>
题外话
在7月11号搭建好这个下载站之后,截至19号下载流量已经突破了100GB了。(大部分都是15号以后的流量)
在后台看日志的时候发现有俩人分别请求了4.7k次和4.2k次,下了一个半小时左右,下载站原来的服务器在日本,峰值带宽30Mbps,但当时我自己测试时的下载速度是能够跑到理论的3MB/s左右,于是并没有管。
现在已经把下载站的服务器转移到了杭州,峰值带宽200Mbps。(阿里云免费试用白嫖的欸嘿嘿~)
当然服务器的费用迟早都是要承担的,所以在这里厚着脸皮,球球各位给孩子点米吧!(磕头)
博主,https://arcaea.mioical.moe好像用不了qwq,浏览器报的错是无法安全下载
因为域名没法备案只能是直接302过去,我也不知道为什么报这个啊QAQ
可能是因为不是https的关系?我待会搞个IP证书试试
证书已经搞好了,你再试一下看看会不会再报错?