You've already forked KemoFureApi
							
							Compare commits
	
		
			26 Commits
		
	
	
		
			b6862eb429
			...
			master
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 577411fadf | |||
| a51c8117d0 | |||
| b5d63d1d00 | |||
| 11edbf3abf | |||
| 3f8f9f708f | |||
| 18aa1843cd | |||
| 8733294f13 | |||
| fee0ecfe75 | |||
| fb4ad30d03 | |||
| 2623106212 | |||
| 16c7792b7f | |||
| 2a852388bf | |||
| 50559223ed | |||
| 6b0de05a80 | |||
| 155394ab75 | |||
| 794bf9d30b | |||
| 6157eb1e40 | |||
| db728f21ba | |||
| cbe0074c70 | |||
| 3a247d6ce1 | |||
| e7d21a90bb | |||
| 8b12ca9dae | |||
| 76b6c6cb79 | |||
| 2b121be258 | |||
| eefb47476a | |||
| bfb19ab7c1 | 
							
								
								
									
										4
									
								
								app.py
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								app.py
									
									
									
									
									
								
							| @@ -3,6 +3,7 @@ from flask_restful import Api | ||||
|  | ||||
| from modules.KF3.database import Database as KF3DB | ||||
| from modules.Kingdom.database import Database as KFKDB | ||||
| from modules.proxy import AgreementProxy, LaunchProxy, UpdateProxy | ||||
|  | ||||
| app = Flask(__name__) | ||||
| app.config['JSON_AS_ASCII'] = False | ||||
| @@ -10,6 +11,9 @@ app.databases = {} | ||||
|  | ||||
| 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) | ||||
| KFKDB(api) | ||||
|  | ||||
|   | ||||
| @@ -123,7 +123,7 @@ class Database: | ||||
|         chara = {} | ||||
|          | ||||
|         charaData = self.charaData[id] | ||||
|         alphaBase = self.paramAlphaBases[id] | ||||
|         alphaBase = self.paramAlphaBases[id] if id in self.paramAlphaBases else None | ||||
|  | ||||
|         wrLocked = False | ||||
|         promoIds = [] | ||||
| @@ -136,7 +136,8 @@ class Database: | ||||
|             else: | ||||
|                 promoIds.append([promo["promoteId00"], promo["promoteId01"], promo["promoteId02"], promo["promoteId03"], promo["promoteId04"], promo["promoteId05"]]) | ||||
|  | ||||
|         promoteDatas = [[self.promoteData[id] for id in promo] for promo in promoIds] | ||||
|         emptyPromote = {"promoteAtk": 0, "promoteDef": 0, "promoteHp": 0, "promoteAvoid": 0, "promoteActionDamageRatio": 0, "promoteBeatDamageRatio": 0, "promoteTryDamageRatio": 0} | ||||
|         promoteDatas = [[(self.promoteData[id] if id in self.promoteData else emptyPromote) for id in promo] for promo in promoIds] | ||||
|         promote_bonus = {"atk" : 0, "def" : 0, "hp" : 0, "evd" : 0, "beat" : 0, "act" : 0, "try" : 0} | ||||
|         for promoTier in promoteDatas: | ||||
|             for promoteStep in promoTier: | ||||
| @@ -189,6 +190,12 @@ class Database: | ||||
|         else: | ||||
|             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_max"] = get_all_stats(chara, alphaBase, max_level = True, rising_status_pattern=level_curve) | ||||
|             chara["plasmPoint"] = alphaBase["plasmPoint"] | ||||
| @@ -199,6 +206,7 @@ class Database: | ||||
|                 {"type":alphaBase["orderCardType03"], "value":alphaBase["orderCardValue03"]}, | ||||
|                 {"type":alphaBase["orderCardType04"], "value":alphaBase["orderCardValue04"]} | ||||
|             ] | ||||
|  | ||||
|         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 | ||||
|   | ||||
| @@ -82,7 +82,10 @@ async def download_cache(server_name, server : str): | ||||
|             file.write(data) | ||||
|         with open(file_path_json, "wt", encoding="utf-8") as out_file: | ||||
|             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] | ||||
|  | ||||
| @@ -93,6 +96,36 @@ async def download_cache(server_name, server : str): | ||||
|     await session.close() | ||||
|     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): | ||||
|     def parse_ab_list(filecontent : str): | ||||
|         out = {} | ||||
| @@ -112,7 +145,7 @@ async def download_files(server_name, asset_bundle_url, srv_platform : str): | ||||
|                 convert_path = f"/var/www/html/Katworks/KF/assets/KF3/WebGL/assets/" + file_name | ||||
|                 extract_path = f"/var/www/html/Katworks/KF/assets/KF3/extracted/" | ||||
|                 try: | ||||
|                     convert(data, convert_path, enums.BuildTarget.WebGL, True) | ||||
|                     convert(data, convert_path, enums.BuildTarget.WebGL) | ||||
|                 except: | ||||
|                     with open(convert_path, "wb") as file: | ||||
|                         file.write(data) | ||||
| @@ -173,28 +206,57 @@ async def download_files(server_name, asset_bundle_url, srv_platform : str): | ||||
|     await session.close() | ||||
|     return files_to_download | ||||
|  | ||||
| async def convert_files(): | ||||
|     directory = f"/var/www/html/Katworks/KF/assets/KF3/develop01/assets/Windows/" | ||||
|     with open("/var/www/html/Katworks/KF/assets/KF3/lastUpdate_dev_files.json", "rt", encoding="utf-8") as file: | ||||
|         files_to_convert = json.load(file) | ||||
|     for file_name in os.listdir(directory): | ||||
|         if file_name not in files_to_convert: | ||||
|             continue | ||||
|          | ||||
|         f = os.path.join(directory, file_name) | ||||
|  | ||||
|         if not os.path.isfile(f): | ||||
|             return | ||||
|          | ||||
|         convert_path = f"/var/www/html/Katworks/KF/assets/KF3/WebGL/assets/" + file_name | ||||
|         try: | ||||
|             print(f) | ||||
|             convert(f, convert_path, enums.BuildTarget.WebGL) | ||||
|         except: | ||||
|             print("Conversion failed", f) | ||||
|  | ||||
| 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_files = {} | ||||
|      | ||||
|     async with aiohttp.ClientSession() as session: | ||||
|         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) | ||||
|         result  = gzip.decompress(request) | ||||
|         response = json.loads(result) | ||||
|         asset_bundle_url = response["asset_bundle_url"] | ||||
|         urlName = asset_bundle_url.split("-")[2] | ||||
|     # async with aiohttp.ClientSession() as session: | ||||
|     #     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) | ||||
|     #     result  = gzip.decompress(request) | ||||
|     #     response = json.loads(result) | ||||
|     #     asset_bundle_url = response["asset_bundle_url"] | ||||
|     #     urlName = asset_bundle_url.split("-")[2] | ||||
|  | ||||
|     print("downloading from", servers[0]) | ||||
|     downloaded_cache = await download_cache(urlName, servers[0]) | ||||
|     downloaded_files = await download_files(urlName, asset_bundle_url, "Windows") | ||||
|     # print("downloading from", servers[0]) | ||||
|     # downloaded_cache = await download_cache(urlName, servers[0]) | ||||
|     # downloaded_files = await download_files(urlName, asset_bundle_url, "Windows") | ||||
|  | ||||
|     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: | ||||
|             json.dump(downloaded_cache, file, ensure_ascii=False, indent=1) | ||||
|     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: | ||||
|             json.dump(downloaded_files, file, ensure_ascii=False, indent=1) | ||||
|     # 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: | ||||
|     #         json.dump(downloaded_cache, file, ensure_ascii=False, indent=1) | ||||
|     # 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: | ||||
|     #         json.dump(downloaded_files, file, ensure_ascii=False, indent=1) | ||||
|  | ||||
|     print("downloading from", servers[1]) | ||||
|     asset_bundle_url = "https://parade-mobile-develop01-app.kemono-friends-3.jp/AssetBundles/0.0.0/latest" | ||||
| @@ -211,3 +273,4 @@ async def manual(): | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     asyncio.run(manual()) | ||||
|     #asyncio.run(convert_files()) | ||||
| @@ -5,7 +5,7 @@ import json | ||||
|  | ||||
| class KF3_Friend(Resource): | ||||
|     def get(self, id:int): | ||||
|         from KF3.database import Database | ||||
|         from ..database import Database | ||||
|         db : Database = app.databases["KF3"] | ||||
|  | ||||
|         if "wiki" in request.args: | ||||
|   | ||||
| @@ -5,7 +5,7 @@ from flask import request | ||||
|  | ||||
| class KF3_Friends(Resource): | ||||
|     def get(self): | ||||
|         from KF3.database import Database | ||||
|         from ..database import Database | ||||
|         db : Database = app.databases["KF3"] | ||||
|  | ||||
|         result = [] | ||||
|   | ||||
| @@ -5,7 +5,7 @@ import json | ||||
|  | ||||
| class KF3_Item(Resource): | ||||
|     def get(self, id:int): | ||||
|         from KF3.database import Database | ||||
|         from ..database import Database | ||||
|         db : Database = app.databases["KF3"] | ||||
|          | ||||
|         result = db.get_item(id) | ||||
|   | ||||
| @@ -4,12 +4,12 @@ from flask import current_app as app | ||||
|  | ||||
| class KF3_Items(Resource): | ||||
|     def get(self): | ||||
|         from KF3.database import Database | ||||
|         from ..database import Database | ||||
|         db : Database = app.databases["KF3"] | ||||
|  | ||||
|         result = [] | ||||
|         for value in db.itemCommon.values(): | ||||
|             result.append({"id": value["id"], "name": value["name"]}) | ||||
|             result.append({"id": value["id"], "name": value["name"], "iconName" : value["iconName"], "flavorText" : value["flavorText"]}) | ||||
|  | ||||
|         response = app.response_class( | ||||
|             response=json.dumps(result, ensure_ascii=False, indent=1), | ||||
|   | ||||
							
								
								
									
										48
									
								
								modules/proxy.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								modules/proxy.py
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										2
									
								
								run.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| #!/usr/bin/env bash | ||||
| gunicorn --bind 127.0.0.1:8081 --config gunicorn_config.py wsgi:app | ||||
		Reference in New Issue
	
	Block a user