클래시 오브 클랜의 팬이면서 데이터 분석이나 앱 개발에도 관심이 있으신가요? 이 게시물에서는 Python을 사용하여 Clash of Clans API에서 플레이어 데이터를 다운로드하는 과정을 안내하겠습니다. 이는 클랜 관리 도구, 플레이어 통계 분석, 심지어 자신만의 Clash of Clans 관련 애플리케이션 구축에 매우 유용할 수 있습니다.
자세히 알아보기 전에 다음 사항을 확인하세요.
먼저 Clash of Clans 개발자 계정에 등록해야 합니다.
이 프로젝트에서는 여러 Python 라이브러리를 사용할 예정입니다. pip를 사용하여 설치하세요.
pip install requests pandas tqdm ratelimit
코드를 관리 가능한 단위로 나누어 보겠습니다.
import time import math import json import requests import logging import pandas as pd from concurrent.futures import ThreadPoolExecutor, as_completed from ratelimit import limits, sleep_and_retry from tqdm import tqdm
file_path = 'others/clans.json' # Function to open the file and extract tags, specifying the encoding def extract_tags_from_file(file_path): with open(file_path, 'r', encoding='utf-8') as file: # Specifying the encoding here data = json.load(file) return [item.get("tag") for item in data.get("items", [])] # Extract tags from the specified file try: extracted_tags = extract_tags_from_file(file_path) print(extracted_tags) except UnicodeDecodeError as e: print(f"Error reading the file: {e}")
# the extracted clan tags have '#' in beigning we have to replace it with URL encode '%23' def update_tags(extracted_tags): # Replace '#' with '%23' for each tag in the list updated_tags = [tag.replace('#', '%23') for tag in extracted_tags] return updated_tags # Get the updated list of tags updated_extracted_tags = update_tags(extracted_tags) # Print or return the updated list print(updated_extracted_tags)
# Replace your API_KEY api_key = 'your_api_key_here' # Base URL for the Clash of Clans API clans endpoint base_url = 'https://api.clashofclans.com/v1/clans/' # Header to include in the request headers = { 'Authorization': f'Bearer {api_key}', 'Accept': 'application/json' } # Function to get clan member list for each clan tag def get_clan_members(clan_tags): clan_members = {} # Dictionary to store clan members list by clan tag for tag in clan_tags: # Constructing the full URL for the clan members endpoint full_url = f'{base_url}{tag}/members' response = requests.get(full_url, headers=headers) if response.status_code == 200: # Successful response data = response.json() # Assuming the API returns a list of clan members directly clan_members[tag] = data.get('items', []) else: # Handle errors or unsuccessful responses print(f'Failed to fetch clan members for {tag}: HTTP {response.status_code}') return clan_members # Get clan members for each tag clan_members_lists = get_clan_members(updated_extracted_tags) # Example: print the result for the first clan first_tag = updated_extracted_tags[0] print(f'Clan members for {first_tag}:', clan_members_lists[first_tag])
# Assuming clan_members_lists is your dictionary from the modified get_clan_members function def convert_to_dataframe(clan_members_lists): # Create a list of tuples (clan_tag, player_tag) for all clans data = [(clan_tag, player_tag) for clan_tag, player_tags in clan_members_lists.items() for player_tag in player_tags] # Convert the list of tuples into a DataFrame df = pd.DataFrame(data, columns=['Clan Tag', 'Player Tag']) return df # Convert the dictionary to a DataFrame df_clan_members = convert_to_dataframe(clan_members_lists) print(df_clan_members)
def convert_to_dataframe(clan_members_lists): # Initialize an empty list to store the data data = [] # Loop through each clan tag and its corresponding list of members for clan_tag, members in clan_members_lists.items(): for member in members: # For each member, extract the clan tag and the player tag, ensuring the player tag is a string player_tag = member['tag'] # Assuming 'tag' key exists and its value is the player's tag data.append((clan_tag, player_tag)) # Convert the list of tuples into a DataFrame df = pd.DataFrame(data, columns=['Clan Tag', 'Player Tag']) # Optional: Convert clan and player tags to ensure they are URL-friendly # This step is optional and depends on whether you need to use these tags in URLs df['Clan Tag'] = df['Clan Tag'].apply(lambda x: x.replace('%23', '#')) # df['Player Tag'] = df['Player Tag'].apply(lambda x: x.replace('#', '%23')) return df # Example usage with your clan_members_lists dictionary # Make sure to replace 'clan_members_lists' with your actual dictionary variable df_clan_members = convert_to_dataframe(clan_members_lists) print(df_clan_members) df_clan_members.to_csv('datasets/clan_and_player_tags.csv', index=False)
# Set up logging to file logging.basicConfig(filename='others/error_log.log', level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s') # Load the CSV file into a DataFrame df = pd.read_csv('datasets/clan_and_player_tags.csv') # Update this path to your actual CSV file location # API details api_key = 'your_api_key_here' headers = {'Authorization': 'Bearer ' + api_key} # Rate limit: 10 requests per second (adjust as needed) @sleep_and_retry @limits(calls=10, period=1) def call_api(url): response = requests.get(url, headers=headers) response.raise_for_status() return response.json() def fetch_player_details(tag): url = f'https://api.clashofclans.com/v1/players/{tag.replace("#", "%23")}' try: data = call_api(url) return { 'name': data.get('name', ''), 'role': data.get('role', ''), 'league': data.get('league', {}).get('name', ''), 'builderBaseLeague': data.get('builderBaseLeague', {}).get('name', ''), 'townHallLevel': data.get('townHallLevel', 0), 'builderHallLevel': data.get('builderHallLevel', 0), 'expLevel': data.get('expLevel', 0), 'trophies': data.get('trophies', 0), 'bestTrophies': data.get('bestTrophies', 0), 'builderBaseTrophies': data.get('builderBaseTrophies', 0), 'bestBuilderBaseTrophies': data.get('bestBuilderBaseTrophies', 0), 'attackWins': data.get('attackWins', 0), 'defenseWins': data.get('defenseWins', 0), 'warStars': data.get('warStars', 0), 'clanCapitalContributions': data.get('clanCapitalContributions', 0), 'donations': data.get('donations', 0), 'donationsReceived': data.get('donationsReceived', 0), } except requests.exceptions.RequestException as e: logging.error(f'Error fetching data for {tag}: {e}') def process_batch(batch): player_details = [] with ThreadPoolExecutor(max_workers=20) as executor: future_to_tag = {executor.submit(fetch_player_details, tag): tag for tag in batch} for future in as_completed(future_to_tag): tag = future_to_tag[future] try: details = future.result() player_details.append(details) except Exception as exc: logging.error(f'{tag} generated an exception: {exc}') return player_details def save_checkpoint(data, filename): with open(filename, 'w') as f: json.dump(data, f) def load_checkpoint(filename): try: with open(filename, 'r') as f: return json.load(f) except FileNotFoundError: return [] def main(): batch_size = 1000 checkpoint_file = 'others/player_details_checkpoint.json' # Load checkpoint if it exists player_details = load_checkpoint(checkpoint_file) start_index = len(player_details) num_batches = math.ceil((len(df) - start_index) / batch_size) for i in tqdm(range(start_index, len(df), batch_size), total=num_batches, desc="Processing batches"): batch = df['Player Tag'].iloc[i:i+batch_size].tolist() batch_details = process_batch(batch) player_details.extend(batch_details) # Save checkpoint after each batch save_checkpoint(player_details, checkpoint_file) # Filter out None values from player_details player_details = [detail for detail in player_details if detail is not None] # Create a new DataFrame with the player details details_df = pd.DataFrame(player_details) # Merge the original DataFrame with the new details DataFrame final_df = pd.concat([df, details_df], axis=1) # Save the final DataFrame to a new CSV file final_df.to_csv('datasets/player_details.csv', index=False) print("Data fetching and processing complete. Results saved to 'Clan_and_Player_Details.csv'") if __name__ == "__main__": start_time = time.time() main() end_time = time.time() print(f"Total execution time: {end_time - start_time:.2f} seconds")
스크립트를 실행하려면:
스크립트는 플레이어 태그를 일괄 처리하고 각 플레이어의 세부 정보를 가져온 다음 결과를 새 CSV 파일에 저장합니다.
이 스크립트는 Clash of Clans API에서 플레이어 데이터를 다운로드하는 강력한 방법을 제공합니다. 여기에는 오류 처리, API 제약 조건을 준수하기 위한 속도 제한이 포함되어 있으며 성능 향상을 위해 멀티스레딩을 사용합니다.
항상 API 사용 약관을 준수해야 합니다. 즐거운 코딩 되세요!
위 내용은 Clash of Clans API에서 플레이어 데이터 다운로드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!