最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

python - Bad request 400 code error, trying to upload file via API NITRADO - Stack Overflow

programmeradmin1浏览0评论

DEBUG FROM MY BOT I have a problem for a few days with sending files via API to the server, when I try to send a file to the server I use the API from the nitrado documentation

API NITRADO DOCUMENTATION:

/:id/gameservers/file_server/upload , the response is success (200,201 code) after which I receive the url for data transfer and the generated token ( "url": "/", "token": "4307ee5a-6bfe-4913-950c-c422ac733cc0" ) [the token is variable each time, I know it is unique, this is just an example], I also get the response 200,201 which means success, but when I try to upload the server rejects nothing and gets an error 400 code = bad request, I tried to test the API via CURL and POSTMAN and I also get code 400 bad request

the bot is supposed to download the file from the server, edit it and upload it again, but when trying to upload it gives an error 400

thats my upload code:

async def upload_file_to_url(upload_url, token, local_file_path, target_directory):  # Added target_directory parameter
    headers = {
        "Authorization": f"Bearer {token}"
    }
    try:
        async with aiohttp.ClientSession() as session:
            form = aiohttp.FormData()
            form.add_field(
                'file',
                open(local_file_path, 'rb'),
                filename=os.path.basename(local_file_path),
                content_type='multipart/form-data'
            )
            form.add_field(
                'path',
                target_directory
            )
            async with session.post(
                upload_url,
                headers=headers,
                data=form,
                timeout=30
            ) as response:
                response_status = response.status
                response_text = await response.text()
                print(f"[DEBUG] Upload response status: {response_status}")
                print(f"[DEBUG] Upload response text: {response_text}")
                return response_status == 200
    except Exception as e:
        print(f"[ERROR] Upload failed with error: {str(e)}")
        return False

async def upload_cfgeffectarea_to_server(local_file_path, target_directory, target_filename):
   if not validate_json_file(local_file_path):
       print("[ERROR] Cannot upload invalid JSON file.")
       return False

   upload_url = ";
   headers = {
       "Authorization": f"Bearer {NITRADO_API_KEY}"
   }

   if not target_directory.startswith('/'):
       target_directory = '/' + target_directory

   try:
       async with aiohttp.ClientSession() as session:
           async with session.post(
               upload_url,
               headers=headers,
               json={
                   "path": target_directory,
                   "file": target_filename
               },
               timeout=30
           ) as response:
               if response.status in (200, 201):
                   response_data = await response.json()
                   if 'data' in response_data and 'token' in response_data['data']:
                       token_data = response_data['data']['token']
                       upload_url = token_data.get('url')
                       token = token_data.get('token')

                       if not upload_url or not token:
                           print("[ERROR] Missing upload URL or token in response.")
                           return False

                       print(f"[INFO] Upload URL: {upload_url}")
                       print(f"[INFO] Upload token: {token}")
                       return await upload_file_to_url(upload_url, token, local_file_path, target_directory)
                   else:
                       print("[ERROR] Invalid response format from server")
                       print(f"Response data: {response_data}")
                       return False
               else:
                   print(f"[ERROR] Failed to get upload token. Status: {response.status}")
                   print(await response.text())
                   return False
   except Exception as e:
       print(f"[ERROR] Request failed with error: {str(e)}")
       return False



async def auto_update_cfg_effect_area():
    print("[AUTO-UPDATE] Starting automatic test.")
    
    try:
        file_content = await download_cfgeffectarea_from_server()
        if not file_content:
            print("[AUTO-UPDATE] Failed to download file from server.")
            return

        data = file_content
        
        test_area_name = f"AUTO_TEST_{uuid.uuid4().hex}"
        new_area = {
            "AreaName": test_area_name,
            "Type": "TestType",
            "Data": {
                "Pos": [100.0, 100.0]
            }
        }
        
        if "Areas" not in data:
            data["Areas"] = []
        data["Areas"].append(new_area)
        print("[AUTO-UPDATE] Added new test area to JSON.")

        local_file_path = "./cfgEffectArea.json"
        with open(local_file_path, "w", encoding="utf-8") as file:
            json.dump(data, file, indent=4)

        target_directory = f"/games/{HOSTNAME}/ftproot/dayzxb_missions/dayzOffline.chernarusplus"
        success = await upload_cfgeffectarea_to_server(local_file_path, target_directory, "cfgEffectArea.json")
        
        if success:
            print(f"[AUTO-UPDATE] Successfully uploaded updated file. Added area: {test_area_name}")
        else:
            print("[AUTO-UPDATE] Failed to upload updated file.")
    
    except Exception as e:
        print(f"[AUTO-UPDATE] Error during auto update: {e}")

im trying to upload file to nitrado hosting via API

发布评论

评论列表(0)

  1. 暂无评论