前言

自7月10号仓促写完脚本并一连优化了10多天后,终!于!它进化到了最终形态!(终于能看了)
期间甚至有幸看到616的API炸了,成为了错误处理的最后一块拼图。
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

记住面板的端口、地址、用户名以及密码。

通过面板搭建

因为两者的操作都差不多,因此这里以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。(阿里云免费试用白嫖的欸嘿嘿~)
当然服务器的费用迟早都是要承担的,所以在这里厚着脸皮,球球各位给孩子点米吧!(磕头)