1+ #!/usr/bin/env python3
2+ """
3+ مثال عملی برای دریافت داده از بلاکچین استلار
4+ """
5+
6+ import os
7+ import sys
8+ import asyncio
9+ from datetime import datetime
10+
11+ # اضافه کردن مسیر parent به sys.path
12+ current_dir = os .path .dirname (os .path .abspath (__file__ ))
13+ parent_dir = os .path .dirname (current_dir )
14+ sys .path .insert (0 , parent_dir )
15+
16+ # اکنون میتوانیم import کنیم
17+ try :
18+ from src .core .stellar_client import StellarHorizonClient
19+ from src .streaming .horizon_listener import HorizonWebSocketListener , BatchTransactionProcessor
20+ print ("✅ ماژولها با موفقیت import شدند" )
21+ except ImportError as e :
22+ print (f"❌ خطای import: { e } " )
23+ print ("📁 مسیرهای sys.path:" )
24+ for path in sys .path :
25+ print (f" - { path } " )
26+ sys .exit (1 )
27+
28+
29+ async def example_fetch_account ():
30+ """مثال دریافت اطلاعات حساب"""
31+ print ("📋 مثال ۱: دریافت اطلاعات حساب" )
32+ print ("-" * 50 )
33+
34+ try :
35+ # استفاده از context manager
36+ async with StellarHorizonClient () as client :
37+ # حساب معروف Stellar Development Foundation
38+ account_id = "GA5XIGA5C7QTPTWXQHY6MCJRMTRZDOSHR6EFIBNDQTCQHG262N4GGKTM"
39+
40+ print (f"🔍 در حال دریافت اطلاعات حساب: { account_id [:20 ]} ..." )
41+ account = await client .get_account (account_id )
42+
43+ if account :
44+ print (f"✅ حساب پیدا شد!" )
45+ print (f" 👤 آدرس: { account .account_id } " )
46+ print (f" 💰 موجودی: { account .balance } XLM" )
47+ print (f" 🔢 Sequence: { account .sequence } " )
48+ print (f" 🏠 Home Domain: { account .home_domain or 'ندارد' } " )
49+ print (f" 📊 تعداد زیرمجموعه: { account .subentry_count } " )
50+ else :
51+ print ("❌ حساب پیدا نشد" )
52+ except Exception as e :
53+ print (f"❌ خطا در دریافت حساب: { e } " )
54+
55+ print ()
56+
57+
58+ async def example_fetch_transactions ():
59+ """مثال دریافت تراکنشهای اخیر"""
60+ print ("📋 مثال ۲: دریافت تراکنشهای اخیر" )
61+ print ("-" * 50 )
62+
63+ try :
64+ async with StellarHorizonClient () as client :
65+ # دریافت ۵ تراکنش آخر
66+ account_id = "GA5XIGA5C7QTPTWXQHY6MCJRMTRZDOSHR6EFIBNDQTCQHG262N4GGKTM"
67+
68+ print (f"🔍 در حال دریافت تراکنشهای حساب: { account_id [:20 ]} ..." )
69+ transactions = await client .get_transactions_for_account (account_id , limit = 3 )
70+
71+ print (f"📊 تعداد تراکنشهای دریافتی: { len (transactions )} " )
72+
73+ for i , tx in enumerate (transactions , 1 ):
74+ print (f"\n { i } . تراکنش:" )
75+ print (f" 🔗 Hash: { tx .hash [:25 ]} ..." )
76+ print (f" 📅 زمان: { tx .created_at .strftime ('%Y-%m-%d %H:%M:%S' )} " )
77+ print (f" 💰 کارمزد: { tx .fee_paid } stroops" )
78+ print (f" 📝 Memo: { tx .memo or 'خالی' } " )
79+ print (f" 📒 Ledger: { tx .ledger } " )
80+ except Exception as e :
81+ print (f"❌ خطا در دریافت تراکنشها: { e } " )
82+
83+ print ()
84+
85+
86+ async def example_get_ledger_info ():
87+ """مثال دریافت اطلاعات ledger"""
88+ print ("📋 مثال ۳: دریافت اطلاعات ledger جاری" )
89+ print ("-" * 50 )
90+
91+ try :
92+ async with StellarHorizonClient () as client :
93+ ledger_seq = await client .get_ledger_sequence ()
94+ if ledger_seq :
95+ print (f"✅ آخرین ledger: { ledger_seq } " )
96+
97+ # دریافت تراکنشهای این ledger
98+ print (f"🔍 در حال دریافت تراکنشهای ledger { ledger_seq } ..." )
99+ transactions = await client .get_transactions_in_ledger (ledger_seq )
100+
101+ print (f"📊 تعداد تراکنشها در این ledger: { len (transactions )} " )
102+
103+ if transactions :
104+ # خلاصهای از تراکنشها
105+ sources = {}
106+ for tx in transactions [:5 ]: # فقط ۵ تراکنش اول
107+ source = tx .source_account [:10 ] + "..."
108+ sources [source ] = sources .get (source , 0 ) + 1
109+
110+ print ("\n 📈 نمونهای از منابع تراکنشها:" )
111+ for source , count in sources .items ():
112+ print (f" { source } : { count } تراکنش" )
113+ else :
114+ print ("❌ نتوانستیم sequence ledger را دریافت کنیم" )
115+ except Exception as e :
116+ print (f"❌ خطا در دریافت اطلاعات ledger: { e } " )
117+
118+ print ()
119+
120+
121+ async def example_simple_stream ():
122+ """مثال ساده گوش دادن به تراکنشها"""
123+ print ("📋 مثال ۴: گوش دادن به تراکنشهای زنده (۵ ثانیه)" )
124+ print ("-" * 50 )
125+
126+ print ("⚠️ این مثال نیاز به اتصال اینترنت دارد و ممکن است چند لحظه طول بکشد..." )
127+
128+ counter = 0
129+ max_transactions = 3
130+
131+ async def process_transaction (tx_data ):
132+ nonlocal counter
133+ counter += 1
134+
135+ tx_hash = tx_data .get ('hash' , '' )[:20 ]
136+ source = tx_data .get ('source_account' , '' )[:10 ]
137+ ledger = tx_data .get ('ledger' , 0 )
138+
139+ print (f"\n 🎯 تراکنش #{ counter } :" )
140+ print (f" 🔗 Hash: { tx_hash } ..." )
141+ print (f" 👤 از: { source } ..." )
142+ print (f" 📒 Ledger: { ledger } " )
143+
144+ if counter >= max_transactions :
145+ return True # سیگنال توقف
146+ return False
147+
148+ try :
149+ # ایجاد گوشدهنده
150+ listener = HorizonWebSocketListener ()
151+ listener .add_callback (process_transaction )
152+
153+ print ("\n 🎧 در حال گوش دادن به تراکنشهای زنده..." )
154+ print ("برای خروج Ctrl+C را فشار دهید\n " )
155+
156+ # اجرا برای ۱۰ ثانیه یا تا ۳ تراکنش
157+ import signal
158+
159+ class TimeoutException (Exception ):
160+ pass
161+
162+ def timeout_handler (signum , frame ):
163+ raise TimeoutException ()
164+
165+ # تنظیم تایماوت
166+ signal .signal (signal .SIGALRM , timeout_handler )
167+ signal .alarm (10 )
168+
169+ try :
170+ await listener .listen ()
171+ except TimeoutException :
172+ print ("\n ⏰ زمان گوش دادن به پایان رسید" )
173+ except KeyboardInterrupt :
174+ print ("\n ⏹️ توسط کاربر متوقف شد" )
175+ except Exception as e :
176+ print (f"\n ❌ خطا در گوش دادن: { e } " )
177+ finally :
178+ signal .alarm (0 ) # غیرفعال کردن آلارم
179+ await listener .stop ()
180+
181+ except Exception as e :
182+ print (f"❌ خطا در راهاندازی گوشدهنده: { e } " )
183+
184+ print ()
185+
186+
187+ async def example_test_connection ():
188+ """آزمایش اتصال به Horizon"""
189+ print ("📋 آزمایش اتصال به شبکه استلار" )
190+ print ("-" * 50 )
191+
192+ try :
193+ async with StellarHorizonClient () as client :
194+ # تست ساده با دریافت یک حساب شناخته شده
195+ test_account = "GAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7"
196+
197+ print (f"🔍 آزمایش اتصال به { client .horizon_url } ..." )
198+
199+ # تست GET ساده
200+ import aiohttp
201+ async with aiohttp .ClientSession () as session :
202+ async with session .get (client .horizon_url ) as resp :
203+ if resp .status == 200 :
204+ print ("✅ Horizon API در دسترس است" )
205+ else :
206+ print (f"❌ Horizon پاسخ داد: { resp .status } " )
207+
208+ # تست دریافت حساب
209+ print (f"🔍 دریافت حساب آزمایشی..." )
210+ account = await client .get_account (test_account )
211+ if account :
212+ print (f"✅ اتصال به بلاکچین استلار موفقیتآمیز بود!" )
213+ print (f" 📍 شبکه: Stellar Public Network" )
214+ print (f" 👤 حساب تست: { account .account_id [:20 ]} ..." )
215+ print (f" 💰 موجودی: { account .balance } XLM" )
216+ else :
217+ print ("⚠️ حساب تست پیدا نشد، اما اتصال برقرار است" )
218+
219+ except aiohttp .ClientConnectorError :
220+ print ("❌ خطای اتصال: نمیتوان به Horizon متصل شد" )
221+ print (" لطفاً اتصال اینترنت خود را بررسی کنید" )
222+ except Exception as e :
223+ print (f"❌ خطای ناشناخته: { e } " )
224+
225+ print ()
226+
227+
228+ async def main ():
229+ """تابع اصلی"""
230+ print ("=" * 60 )
231+ print ("🚀 Stellar Blockchain Data Fetcher - v1.0" )
232+ print ("=" * 60 )
233+ print ()
234+
235+ try :
236+ # آزمایش اتصال اولیه
237+ await example_test_connection ()
238+
239+ # اگر اتصال برقرار بود، مثالهای دیگر را اجرا کن
240+ print ("🎯 اجرای مثالهای مختلف..." )
241+ print ()
242+
243+ await example_fetch_account ()
244+ await example_fetch_transactions ()
245+ await example_get_ledger_info ()
246+ await example_simple_stream ()
247+
248+ except KeyboardInterrupt :
249+ print ("\n \n ⏹️ برنامه توسط کاربر متوقف شد" )
250+ except Exception as e :
251+ print (f"\n ❌ خطای غیرمنتظره: { e } " )
252+ import traceback
253+ traceback .print_exc ()
254+
255+ print ("\n " + "=" * 60 )
256+ print ("✅ برنامه با موفقیت به پایان رسید!" )
257+ print ("=" * 60 )
258+
259+
260+ if __name__ == "__main__" :
261+ # برای ویندوز که signal.SIGALRM ندارد
262+ if sys .platform == "win32" :
263+ print ("⚠️ توجه: در ویندوز، تایماوت سیگنال پشتیبانی نمیشود" )
264+ print (" مثال گوش دادن ممکن است متفاوت کار کند" )
265+ print ()
266+
267+ asyncio .run (main ())
0 commit comments