25 Commits

Author SHA1 Message Date
577411fadf disabled stg server download 2025-07-14 23:10:28 +02:00
a51c8117d0 undo downloader changes 2025-03-17 00:14:07 +01:00
b5d63d1d00 moved archive to a separate repo 2025-03-15 20:02:36 +01:00
11edbf3abf removed ArchiveOld, added more data to posts, added DMM proxy endpoint 2025-01-27 12:00:15 +01:00
3f8f9f708f added new endpoint 2025-01-23 02:12:04 +01:00
18aa1843cd proxy test 2025-01-21 13:54:11 +01:00
8733294f13 constrained download mode for accounts list 2025-01-18 13:16:52 +01:00
fee0ecfe75 added commands 2025-01-17 12:10:15 +01:00
fb4ad30d03 added commands (test) 2025-01-17 12:03:00 +01:00
2623106212 queries updated to use dictionaries 2025-01-15 21:42:59 +01:00
16c7792b7f Added old archive endpoints 2025-01-15 13:56:06 +01:00
2a852388bf sql command file load 2025-01-13 01:20:39 +01:00
50559223ed added account post count endpoint 2025-01-12 10:31:25 +01:00
6b0de05a80 added post order modes 2025-01-11 18:46:01 +01:00
155394ab75 added GetPosts/Count endpoint 2025-01-11 17:54:42 +01:00
794bf9d30b updated filter 2025-01-05 18:49:14 +01:00
6157eb1e40 added artist filter 2025-01-02 23:21:56 +01:00
db728f21ba added filter by account rating 2025-01-02 22:21:58 +01:00
cbe0074c70 fixes 2025-01-02 13:39:42 +01:00
3a247d6ce1 additional archive endpoints 2025-01-02 12:51:52 +01:00
e7d21a90bb added hidden posts to filter. added date 2024-12-31 16:01:51 +01:00
8b12ca9dae added get_posts endpoint 2024-12-31 12:35:31 +01:00
76b6c6cb79 fix 2024-12-26 16:40:22 +01:00
2b121be258 Added archive module 2024-12-26 15:54:55 +01:00
eefb47476a fix 2024-12-26 15:27:03 +01:00
6 changed files with 133 additions and 28 deletions

4
app.py
View File

@@ -3,6 +3,7 @@ from flask_restful import Api
from modules.KF3.database import Database as KF3DB from modules.KF3.database import Database as KF3DB
from modules.Kingdom.database import Database as KFKDB from modules.Kingdom.database import Database as KFKDB
from modules.proxy import AgreementProxy, LaunchProxy, UpdateProxy
app = Flask(__name__) app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False app.config['JSON_AS_ASCII'] = False
@@ -10,6 +11,9 @@ app.databases = {}
api = Api(app) api = Api(app)
api.add_resource(LaunchProxy, "/DMM/launch")
api.add_resource(UpdateProxy, "/DMM/filelist", "/DMM/update")
api.add_resource(AgreementProxy, "/DMM/agreement")
KF3DB(api) KF3DB(api)
KFKDB(api) KFKDB(api)

View File

@@ -123,7 +123,7 @@ class Database:
chara = {} chara = {}
charaData = self.charaData[id] charaData = self.charaData[id]
alphaBase = self.paramAlphaBases[id] alphaBase = self.paramAlphaBases[id] if id in self.paramAlphaBases else None
wrLocked = False wrLocked = False
promoIds = [] promoIds = []
@@ -190,6 +190,12 @@ class Database:
else: else:
level_curve = self.limitlevel_rising_status[patternId] if patternId != 0 else None level_curve = self.limitlevel_rising_status[patternId] if patternId != 0 else None
if alphaBase is None:
chara["stats_min"] = {"level" : 0,"status" : 0,"wr" : 0,"hp" : 0,"atk" : 0,"def" : 0,"evd" : 0,"beat" : 0,"act" : 0,"try" : 0}
chara["stats_max"] = {"level" : 0,"status" : 0,"wr" : 0,"hp" : 0,"atk" : 0,"def" : 0,"evd" : 0,"beat" : 0,"act" : 0,"try" : 0}
chara["plasmPoint"] = 0
chara["cards"] = {0,0,0,0,0}
else:
chara["stats_min"] = get_all_stats(chara, alphaBase, max_level = False, rising_status_pattern=level_curve) chara["stats_min"] = get_all_stats(chara, alphaBase, max_level = False, rising_status_pattern=level_curve)
chara["stats_max"] = get_all_stats(chara, alphaBase, max_level = True, rising_status_pattern=level_curve) chara["stats_max"] = get_all_stats(chara, alphaBase, max_level = True, rising_status_pattern=level_curve)
chara["plasmPoint"] = alphaBase["plasmPoint"] chara["plasmPoint"] = alphaBase["plasmPoint"]
@@ -200,6 +206,7 @@ class Database:
{"type":alphaBase["orderCardType03"], "value":alphaBase["orderCardValue03"]}, {"type":alphaBase["orderCardType03"], "value":alphaBase["orderCardValue03"]},
{"type":alphaBase["orderCardType04"], "value":alphaBase["orderCardValue04"]} {"type":alphaBase["orderCardType04"], "value":alphaBase["orderCardValue04"]}
] ]
chara["synergy_flag"] = self.paramArts[id]["authParam"]["SynergyFlag"] if id in self.paramArts else 0 chara["synergy_flag"] = self.paramArts[id]["authParam"]["SynergyFlag"] if id in self.paramArts else 0
chara["arts"] = self.paramArts[id] if id in self.paramArts else None chara["arts"] = self.paramArts[id] if id in self.paramArts else None

View File

@@ -82,7 +82,10 @@ async def download_cache(server_name, server : str):
file.write(data) file.write(data)
with open(file_path_json, "wt", encoding="utf-8") as out_file: with open(file_path_json, "wt", encoding="utf-8") as out_file:
data = gzip.decompress(data) data = gzip.decompress(data)
json.dump(json.loads(data), out_file, ensure_ascii=False, indent=1) data = json.loads(data)
# if key == "GACHA_DATA":
# download_banners(data, server_name)
json.dump(data, out_file, ensure_ascii=False, indent=1)
old_mst_ver[key] = new_mst_ver[key] old_mst_ver[key] = new_mst_ver[key]
@@ -93,6 +96,36 @@ async def download_cache(server_name, server : str):
await session.close() await session.close()
return downloaded_files return downloaded_files
async def download_banners(gacha_data, server_name, session):
path = f"/var/www/html/Katworks/KF/assets/KF3/{server_name}/banners/"
os.makedirs(path, exist_ok=True)
for entry in gacha_data:
banner_name = entry["banner"]
if banner_name == "" or banner_name == None:
continue
banner_name += ".png"
file_path = path + banner_name
if os.path.exists(file_path):
continue
file_url = "https://parade-mobile-prod-cdn.kemono-friends-3.jp/Texture2D/GachaTop/" + banner_name
file_url_alt = "https://parade-mobile-develop01-app.kemono-friends-3.jp/Texture2D/GachaTop/" + banner_name
status = 0
async with session.get(file_url) as resp:
response = await resp.read()
status = resp.status
if status != 200:
async with session.get(file_url_alt) as resp:
response = await resp.read()
status = resp.status
if status != 200: continue
with open(file_path, "wb") as file:
file.write(response)
async def download_files(server_name, asset_bundle_url, srv_platform : str): async def download_files(server_name, asset_bundle_url, srv_platform : str):
def parse_ab_list(filecontent : str): def parse_ab_list(filecontent : str):
out = {} out = {}
@@ -194,27 +227,36 @@ async def convert_files():
print("Conversion failed", f) print("Conversion failed", f)
async def manual(): async def manual():
# session = aiohttp.ClientSession()
# path = f"/var/www/html/Katworks/KF/assets/KF3/{server_name}/cache/"
# await session.close()
# return
downloaded_cache = {} downloaded_cache = {}
downloaded_files = {} downloaded_files = {}
async with aiohttp.ClientSession() as session: # async with aiohttp.ClientSession() as session:
param = encode(json.dumps({"version":"1.0.0","dmm_viewer_id":0,"platform":1})) # param = encode(json.dumps({"version":"1.0.0","dmm_viewer_id":0,"platform":1}))
request = await download_bytes(servers[0] + "paradesv/common/GetUrl.do?param=" + param, session) # request = await download_bytes(servers[0] + "paradesv/common/GetUrl.do?param=" + param, session)
result = gzip.decompress(request) # result = gzip.decompress(request)
response = json.loads(result) # response = json.loads(result)
asset_bundle_url = response["asset_bundle_url"] # asset_bundle_url = response["asset_bundle_url"]
urlName = asset_bundle_url.split("-")[2] # urlName = asset_bundle_url.split("-")[2]
print("downloading from", servers[0]) # print("downloading from", servers[0])
downloaded_cache = await download_cache(urlName, servers[0]) # downloaded_cache = await download_cache(urlName, servers[0])
downloaded_files = await download_files(urlName, asset_bundle_url, "Windows") # downloaded_files = await download_files(urlName, asset_bundle_url, "Windows")
if downloaded_cache != [] and downloaded_cache != None: # if downloaded_cache != [] and downloaded_cache != None:
with open("/var/www/html/Katworks/KF/assets/KF3/lastUpdate_prod_cache.json", "wt", encoding="utf-8") as file: # with open("/var/www/html/Katworks/KF/assets/KF3/lastUpdate_prod_cache.json", "wt", encoding="utf-8") as file:
json.dump(downloaded_cache, file, ensure_ascii=False, indent=1) # json.dump(downloaded_cache, file, ensure_ascii=False, indent=1)
if downloaded_files != [] and downloaded_files != None: # if downloaded_files != [] and downloaded_files != None:
with open("/var/www/html/Katworks/KF/assets/KF3/lastUpdate_prod_files.json", "wt", encoding="utf-8") as file: # with open("/var/www/html/Katworks/KF/assets/KF3/lastUpdate_prod_files.json", "wt", encoding="utf-8") as file:
json.dump(downloaded_files, file, ensure_ascii=False, indent=1) # json.dump(downloaded_files, file, ensure_ascii=False, indent=1)
print("downloading from", servers[1]) print("downloading from", servers[1])
asset_bundle_url = "https://parade-mobile-develop01-app.kemono-friends-3.jp/AssetBundles/0.0.0/latest" asset_bundle_url = "https://parade-mobile-develop01-app.kemono-friends-3.jp/AssetBundles/0.0.0/latest"

48
modules/proxy.py Normal file
View File

@@ -0,0 +1,48 @@
from flask_restful import Resource
from flask import current_app as app, request, Request
import requests
def relayRequest(user_request : Request, url, headers):
with requests.Session() as session:
requests.utils.add_dict_to_cookiejar(session.cookies, user_request.cookies)
response = session.post(url, headers=headers, data=request.data)
result = app.response_class(
response=response.text,
status=200,
mimetype='application/json'
)
result.headers.add("Access-Control-Allow-Origin", "*")
return result
class LaunchProxy(Resource):
def post(self):
url = "https://apidgp-gameplayer.games.dmm.com/v5/launch/cl"
headers = {"User-Agent": "DMMGamePlayer5-Win/5.3.12 Electron/32.1.0",
"Client-App": "DMMGamePlayer5",
"Client-version": "5.3.12",
"Content-Type": "application/json"}
return relayRequest(request, url, headers)
class UpdateProxy(Resource):
def post(self):
url = "https://apidgp-gameplayer.games.dmm.com/v5/r2/launch/cl"
headers = {"User-Agent": "DMMGamePlayer5-Win/5.3.12 Electron/32.1.0",
"Client-App": "DMMGamePlayer5",
"Client-version": "5.3.12",
"Content-Type": "application/json"}
return relayRequest(request, url, headers)
class AgreementProxy(Resource):
def post(self):
url = "https://apidgp-gameplayer.games.dmm.com/v5/agreement/confirm/client"
headers = {"User-Agent": "DMMGamePlayer5-Win/5.3.12 Electron/32.1.0",
"Client-App": "DMMGamePlayer5",
"Client-version": "5.3.12",
"Content-Type": "application/json"}
return relayRequest(request, url, headers)

2
run.sh Normal file
View File

@@ -0,0 +1,2 @@
#!/usr/bin/env bash
gunicorn --bind 127.0.0.1:8081 --config gunicorn_config.py wsgi:app

2
update.sh Normal file
View File

@@ -0,0 +1,2 @@
#!/usr/bin/env bash
python -m modules.KF3.downloader