|
|
|
|
|
""" |
|
|
اسکریپت اضافه کردن منابع جدید به سیستم |
|
|
این اسکریپت منابع جدید را از فایل تحلیل خوانده و به فایل crypto_resources_unified اضافه میکند |
|
|
""" |
|
|
import json |
|
|
from pathlib import Path |
|
|
from typing import Dict, List, Any |
|
|
from datetime import datetime |
|
|
|
|
|
|
|
|
def load_new_resources(): |
|
|
"""بارگذاری منابع جدید از فایل تحلیل""" |
|
|
analysis_file = Path("new_resources_analysis.json") |
|
|
|
|
|
if not analysis_file.exists(): |
|
|
print("❌ فایل تحلیل پیدا نشد. لطفاً ابتدا analyze_resources.py را اجرا کنید.") |
|
|
return [] |
|
|
|
|
|
with open(analysis_file, 'r', encoding='utf-8') as f: |
|
|
data = json.load(f) |
|
|
|
|
|
return data.get('new_resources', []) |
|
|
|
|
|
|
|
|
def convert_to_unified_format(resource: Dict[str, Any]) -> Dict[str, Any]: |
|
|
"""تبدیل فرمت منبع به فرمت یکپارچه سیستم""" |
|
|
|
|
|
|
|
|
auth_type = "none" |
|
|
api_key = None |
|
|
param_name = None |
|
|
|
|
|
if resource.get('key_required'): |
|
|
auth_type = "apiKeyQuery" |
|
|
param_name = "apiKey" |
|
|
|
|
|
|
|
|
category_mapping = { |
|
|
'Block Explorer': 'block_explorers', |
|
|
'Market Data': 'market_data_apis', |
|
|
'News': 'news_apis', |
|
|
'Sentiment': 'sentiment_apis', |
|
|
'On-Chain': 'onchain_analytics_apis', |
|
|
'Whale-Tracking': 'whale_tracking_apis', |
|
|
'Dataset': 'hf_resources' |
|
|
} |
|
|
|
|
|
category = category_mapping.get(resource.get('category'), 'free_http_endpoints') |
|
|
|
|
|
|
|
|
name_clean = resource['name'].lower().replace(' ', '_').replace('(', '').replace(')', '') |
|
|
resource_id = f"new_{name_clean}_{category}" |
|
|
|
|
|
|
|
|
unified_resource = { |
|
|
"id": resource_id, |
|
|
"name": resource['name'], |
|
|
"base_url": resource['url'], |
|
|
"auth": { |
|
|
"type": auth_type |
|
|
}, |
|
|
"docs_url": None, |
|
|
"endpoints": {}, |
|
|
"notes": resource.get('description', '') + f" | Rate Limit: {resource.get('rate_limit', 'Unknown')}" |
|
|
} |
|
|
|
|
|
if auth_type != "none": |
|
|
unified_resource["auth"]["key"] = api_key |
|
|
unified_resource["auth"]["param_name"] = param_name |
|
|
|
|
|
if resource.get('endpoint'): |
|
|
unified_resource["endpoints"]["main"] = resource['endpoint'] |
|
|
|
|
|
|
|
|
if category == 'block_explorers': |
|
|
unified_resource["chain"] = "multi" |
|
|
unified_resource["role"] = "explorer" |
|
|
elif category == 'market_data_apis': |
|
|
unified_resource["role"] = "market_data" |
|
|
elif category == 'news_apis': |
|
|
unified_resource["role"] = "news" |
|
|
|
|
|
return { |
|
|
'category': category, |
|
|
'resource': unified_resource |
|
|
} |
|
|
|
|
|
|
|
|
def add_resources_to_registry(): |
|
|
"""اضافه کردن منابع جدید به رجیستری""" |
|
|
print("=" * 80) |
|
|
print("🚀 اضافه کردن منابع جدید به رجیستری") |
|
|
print("=" * 80) |
|
|
|
|
|
|
|
|
new_resources = load_new_resources() |
|
|
print(f"\n📦 تعداد منابع جدید: {len(new_resources)}") |
|
|
|
|
|
|
|
|
registry_file = Path("api-resources/crypto_resources_unified_2025-11-11.json") |
|
|
|
|
|
with open(registry_file, 'r', encoding='utf-8') as f: |
|
|
registry_data = json.load(f) |
|
|
|
|
|
registry = registry_data.get('registry', {}) |
|
|
|
|
|
|
|
|
initial_counts = {} |
|
|
for category in registry: |
|
|
if isinstance(registry[category], list): |
|
|
initial_counts[category] = len(registry[category]) |
|
|
|
|
|
print(f"\n📊 آمار اولیه:") |
|
|
for cat, count in sorted(initial_counts.items()): |
|
|
print(f" {cat}: {count} items") |
|
|
|
|
|
|
|
|
added_count = 0 |
|
|
skipped_count = 0 |
|
|
|
|
|
for new_res in new_resources: |
|
|
try: |
|
|
converted = convert_to_unified_format(new_res) |
|
|
category = converted['category'] |
|
|
resource = converted['resource'] |
|
|
|
|
|
|
|
|
if category not in registry: |
|
|
registry[category] = [] |
|
|
|
|
|
|
|
|
existing_urls = [r.get('base_url', '') for r in registry[category] if isinstance(r, dict)] |
|
|
|
|
|
if resource['base_url'] in existing_urls: |
|
|
skipped_count += 1 |
|
|
continue |
|
|
|
|
|
|
|
|
registry[category].append(resource) |
|
|
added_count += 1 |
|
|
|
|
|
print(f"✅ اضافه شد: {resource['name']} -> {category}") |
|
|
|
|
|
except Exception as e: |
|
|
print(f"⚠️ خطا در اضافه کردن {new_res.get('name')}: {e}") |
|
|
skipped_count += 1 |
|
|
|
|
|
|
|
|
metadata = registry.get('metadata', {}) |
|
|
metadata['updated'] = datetime.now().strftime('%Y-%m-%d') |
|
|
metadata['total_entries'] = sum(len(v) for v in registry.values() if isinstance(v, list)) |
|
|
metadata['last_update_note'] = f"Added {added_count} new resources" |
|
|
|
|
|
registry['metadata'] = metadata |
|
|
registry_data['registry'] = registry |
|
|
|
|
|
|
|
|
backup_file = registry_file.parent / f"crypto_resources_unified_backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json" |
|
|
with open(backup_file, 'w', encoding='utf-8') as f: |
|
|
json.dump(registry_data, f, indent=2, ensure_ascii=False) |
|
|
|
|
|
print(f"\n💾 نسخه بکاپ ذخیره شد: {backup_file}") |
|
|
|
|
|
|
|
|
with open(registry_file, 'w', encoding='utf-8') as f: |
|
|
json.dump(registry_data, f, indent=2, ensure_ascii=False) |
|
|
|
|
|
|
|
|
final_counts = {} |
|
|
for category in registry: |
|
|
if isinstance(registry[category], list): |
|
|
final_counts[category] = len(registry[category]) |
|
|
|
|
|
print(f"\n📊 آمار نهایی:") |
|
|
for cat in sorted(set(list(initial_counts.keys()) + list(final_counts.keys()))): |
|
|
initial = initial_counts.get(cat, 0) |
|
|
final = final_counts.get(cat, 0) |
|
|
diff = final - initial |
|
|
if diff > 0: |
|
|
print(f" {cat}: {initial} -> {final} (+{diff})") |
|
|
else: |
|
|
print(f" {cat}: {final}") |
|
|
|
|
|
print(f"\n✅ عملیات تکمیل شد!") |
|
|
print(f" منابع اضافه شده: {added_count}") |
|
|
print(f" منابع نادیده گرفته شده (تکراری): {skipped_count}") |
|
|
print(f" مجموع منابع: {metadata['total_entries']}") |
|
|
|
|
|
|
|
|
def main(): |
|
|
"""تابع اصلی""" |
|
|
print("\n🚀 شروع فرآیند اضافه کردن منابع جدید\n") |
|
|
|
|
|
try: |
|
|
add_resources_to_registry() |
|
|
print("\n✅ همه چیز با موفقیت انجام شد!") |
|
|
except Exception as e: |
|
|
print(f"\n❌ خطا: {e}") |
|
|
import traceback |
|
|
traceback.print_exc() |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |
|
|
|