حزمة Polymarket Python SDK في 2026 (والانتقال من py-clob-client)
إذا كانت شيفرتك لا تزال تستورد ClobClient من py_clob_client، فهي مبنية على حزمة حلّت محلها أخرى — وكذلك معظم شيفرات Polymarket التي سيكتبها لك مساعد الذكاء الاصطناعي. إليك حزمة SDK الحالية وكيف تنتقل إليها.
العنوان الرئيسي
تطلق Polymarket الآن حزم SDK موحّدة: polymarket-client للغة Python و@polymarket/client للغة TypeScript. وهي تحل محل py-clob-client و@polymarket/clob-client-v2 و@polymarket/builder-relayer-client و@polymarket/builder-signing-sdk. وحزمة Rust SDK موحّدة قيد التطوير.
هذا أهم من ترقية إصدار عادية لسبب واحد: كل عيّنات شيفرة Polymarket على الإنترنت تقريبًا أقدم منها. المقالات، وإجابات Stack Overflow، وأمثلة GitHub، و— لأنها دُرّبت على تلك المواد — الشيفرة التي يكتبها مساعدك الذكي حين تطلب منه بوتًا لـ Polymarket. إذا وجدت نفسك تصحح استيرادات غير موجودة، فهذا هو السبب.
ما الذي تغيّر فعلًا
كان النهج القديم يمنحك عميلًا لكل خدمة من خدمات Polymarket. كنت تستورد عميل CLOB لدفتر الأوامر، وتستدعي Gamma عبر HTTP خام لاكتشاف الأسواق، وتستدعي Data API بشكل منفصل للمراكز، وتجلب حزمة builder-signing إذا احتجت إلى معاملات relayer. أربعة نماذج ذهنية، وأربعة أشكال للأخطاء، وأربعة أنماط لترقيم الصفحات.
تدمج SDK الموحّدة ذلك كله في عميل واحد يغطي كل الواجهات.
| العملاء السابقون | SDK الموحّدة | |
|---|---|---|
| الحزم | عدة حزم، واحدة لكل خدمة | واحدة |
| واجهات Polymarket | واجهات API خاصة بكل خدمة | واجهة عميل واحدة |
| نماذج البيانات | قواميس JSON خام | نماذج ذات أنواع محددة |
| ترقيم الصفحات | مختلف حسب API | أداة ترقيم واحدة متسقة |
| المصادقة والتوقيع | تنفيذ لكل عميل | أدوات مساعدة في SDK |
| الوقت الفعلي | الاتصال بكل WebSocket | subscribe() تدمج التغذيات |
التثبيت
pip install polymarket-client
# uv add polymarket-client
# poetry add polymarket-clientاسم الحزمة يختلف عن الاستيراد
تثبّت polymarket-client لكنك تستورد من polymarket. هذا يربك الناس من السطر الأول، وهو أيضًا طريقة موثوقة لاكتشاف الشيفرة المولّدة التي لم تُشغَّل قط — إذا كان مقتطف ما يكتب import polymarket_client، فلم يشغّله أحد.
أربعة عملاء — اختر عن قصد
| العميل | البيانات العامة | التداول | الوقت الفعلي | الاستخدام |
|---|---|---|---|---|
AsyncPublicClient | نعم | لا | نعم | البوتات، وأدوات جمع البيانات |
AsyncSecureClient | نعم | نعم | نعم | بوتات التداول |
PublicClient | نعم | لا | لا | السكربتات، ودفاتر Jupyter |
SecureClient | نعم | نعم | لا | سكربتات تتداول |
الوقت الفعلي غير متزامن فقط
PublicClient وSecureClient لا ينفّذان subscribe(). إذا كنت تخطط لبث تحديثات الدفتر — وأي بوت جاد ينبغي أن يفعل — فأنت تحتاج إلى أحد العملاء غير المتزامنين. واختيار عميل متزامن مبكرًا ثم اكتشاف ذلك لاحقًا يعني إعادة هيكلة مزعجة.
import asyncio
from polymarket import AsyncPublicClient
async def main() -> None:
async with AsyncPublicClient() as client:
pages = client.list_markets(closed=False)
first = await pages.first_page()
for market in first.items:
print(market.slug)
asyncio.run(main())البيانات العامة لا تحتاج إلى بيانات اعتماد، لذا ابنِ واختبر كل ما تستطيع مقابل AsyncPublicClient قبل إدخال مفتاح. يمكن تجربة الاكتشاف والتحليل وترقيم الصفحات وتوليد الإشارات والتراجع كلها دون أي مخاطرة.
ترقيم الصفحات
واجهة ترقيم واحدة عبر كل دوال السرد. وثلاث طرق لاستهلاكها، بحسب ما إذا كانت حدود الصفحات تهمك:
pages = client.list_markets(closed=False, page_size=10)
# 1. Page at a time — use this when you need to control pacing
# against the tight /markets rate limit (300 req / 10s).
async for page in pages:
for market in page.items:
...
# 2. Item at a time, boundaries ignored.
async for market in pages.iter_items():
...
# 3. Manual, resumable.
page = await pages.first_page()
if page.next_cursor:
nxt = await pages.from_cursor(page.next_cursor).first_page()next_cursor معتم، لذا خزّنه حرفيًا
لا تحلل المؤشرات أو تفك ترميزها أو تكوّنها. احفظ النص كما هو إذا أردت استئناف مسح طويل لاحقًا، واحذفه للبدء من البداية. بناء مؤشرك الخاص من الأشياء التي تعمل حتى يتغير الترميز.
نماذج ذات أنواع محددة
تُرجع الدوال أنواعًا حقيقية بدلًا من القواميس، مُصدَّرة من الحزمة على المستوى الأعلى:
from polymarket import Event, Market, OrderBook, PriceHistoryPointهذا أقل التحسينات بريقًا وربما أعلاها قيمة. مع العملاء القدامى، كان الحقل المُعاد تسميته أو المفقود يظهر كـ KeyError في عمق حلقة استراتيجيتك وقت التشغيل — غالبًا في بيئة الإنتاج، وغالبًا أثناء حيازة مركز. النماذج ذات الأنواع المحددة تنقل هذا الفشل إلى مكانه الصحيح.
الاشتراكات الآنية
تدمج subscribe() عدة تغذيات في تدفق أحداث واحد محدد الأنواع، وهذا تحسن حقيقي مقارنةً بإدارة عدة اتصالات WebSocket يدويًا.
from polymarket.streams import MarketSpec, SportsSpec
async with await client.subscribe(
[MarketSpec(token_ids=[token_id]), SportsSpec()],
) as stream:
async for event in stream:
# MarketBookEvent | MarketPriceChangeEvent
# | MarketLastTradePriceEvent | MarketTickSizeChangeEvent
# | MarketBestBidAskEvent | NewMarketEvent
# | MarketResolvedEvent | SportsEvent
handle(event)تتولى SDK نبض الاتصال والتأطير وإعادة الاتصال التي كنت ستنفّذها بنفسك — بما في ذلك اشتراط إرسال PING كل 10 ثوانٍ على الاتصال الخام. التفاصيل في دليل WebSocket.
تقديم أمر
market = await client.get_market(slug="<market-slug>")
token_id = market.outcomes.yes.token_id
assert token_id is not None
response = await client.place_market_order(
token_id=token_id,
side="BUY",
amount="10", # pUSD to spend, not shares to buy
)
if not response.ok:
raise RuntimeError(response.message)
# Settlement is on-chain and asynchronous.
hashes = await client.wait_for_order_fill_settlement(response)
# Reconcile rather than assuming.
page = await client.list_positions(market=[market.condition_id]).first_page()
position = next((p for p in page.items if p.token_id == token_id), None)amount هو الإنفاق، لا الحجم
place_market_order(amount="10") تعني أنفق حتى 10 pUSD، لا اشترِ 10 أسهم. على عقد يُتداول عند 0.20 يعادل ذلك نحو 50 سهمًا. سوء فهم هذا طريقة سهلة لأخذ مركز أكبر بخمس مرات مما قصدت.
الانتقال من py-clob-client
- أحصِ كل استدعاء لـ Polymarket، بما في ذلك استدعاءات
requestsالخام إلى Gamma وData API. فهي ضمن النطاق أيضًا — SDK الموحّدة تغطيها، ودمجها هو معظم الفائدة. - ثبّت
polymarket-client، وأزل الحزم القديمة. إبقاء الاثنتين مثبتتين للانتقال التدريجي يفتح الباب لاستيراد رمزclientالخاطئ. - استبدل إنشاء العملاء. استدعاء
AsyncSecureClient.create(...)واحد يحل محل العملاء القدامى لكل خدمة ومعالجتهم المنفصلة لبيانات الاعتماد. - استبدل الوصول بالقاموس بالوصول بالخاصية. يصبح
market["condition_id"]هوmarket.condition_id. عمل ممل، وهنا يبدأ مدقق الأنواع في رد الجميل. - أعد كتابة ترقيم الصفحات وفق واجهة أداة الترقيم بدلًا من حلقات offset أو المؤشرات اليدوية.
- استبدل شيفرة WebSocket المكتوبة يدويًا بـ
subscribe()، واحذف منطق نبض الاتصال وإعادة الاتصال لديك. - أعد تشغيل مسارات القراءة فقط أولًا، مقابل العميل العام، قبل السماح لأي شيء بتقديم أمر.
تحصل TypeScript على محوّلات للموقّعين
تأتي TypeScript SDK بمحوّلات لـ Viem وPrivy وEthers v5، لتوصل مكتبة المحفظة الحالية لديك بدلًا من تنفيذ توقيع خاص بـ CLOB. إذا كنت تصون موقّعًا مخصصًا مبنيًا على حزمة builder-signing القديمة، فيمكن حذف تلك الشيفرة الآن.
لماذا يخطئ مساعدك الذكي في هذا
يستحق تناوله مباشرة، لأن كثيرين يصلون إلى هنا بسببه. اطلب من نموذج لغوي شيفرة Python لـ Polymarket وستحصل في أحيان كثيرة جدًا على استيرادات py_clob_client وإنشاء ClobClient(...) وكائنات OrderArgs. النموذج لا يعمل بشكل خاطئ — بل يعيد إنتاج الغالبية الساحقة من شيفرات Polymarket التي رآها، وهي أقدم من حزم SDK الموحّدة.
- تحقّق من سطر الاستيراد أولًا.
from polymarket import ...حديث؛ أماfrom py_clob_client...فليس كذلك. - الصق الوثائق الحالية في السياق. تنشر Polymarket وثائق Markdown قابلة للقراءة آليًا على
docs.polymarket.com/llms.txt، ولكل صفحة نسخة.md. إعطاء النموذج المادة الحقيقية أفضل من الجدال معه. - لا تثق بالشيفرة الواثقة التي لا تعمل. الشيفرة المولّدة كثيرًا ما تخلط الواجهات القديمة والجديدة في شيء لم يوجد قط.
المشكلة نفسها تنطبق على مزوّدي البيانات. ننشر llms.txt وllms-full.txt ومواصفات OpenAPI، ونسمح لزواحف الذكاء الاصطناعي، تحديدًا ليتمكن المساعدون من كتابة تكاملات صحيحة مع PolyTest دون تخمين. بعض المزوّدين يحجبون تلك الزواحف، وهو خيار مشروع لكنه يعني أن مساعدك سيرتجل واجهة API الخاصة بهم.
ما لا تزال SDK عاجزة عنه
SDK الموحّدة واجهة أفضل بكثير لواجهات Polymarket API. لكنها لا تغيّر ما تحتويه تلك الواجهات — والشيء الذي يريده بنّاؤو البوتات أكثر من غيره ليس فيها.
لا يوجد دفتر أوامر تاريخي. ستُرجع client.get_market() البيانات الوصفية لسوق محسوم، لكن دفتره اختفى: تُرجع /book الرمز 404، ولا تحتفظ prices-history إلا بنقطة واحدة تقريبًا في الدقيقة. لا توجد دالة في SDK أو خطة أو بيانات اعتماد تستعيد الدفتر.
للاختبار الرجعي تحتاج إلى لقطات سُجّلت أثناء تشغيل الأسواق. توفرها PolyTest لأسواق Up/Down للعملات المشفرة — 240M+ لقطة عند لحظات زمنية محددة، و8 مستويات من العمق لكل جانب، وطوابع زمنية بدقة أقل من الثانية، مع الاحتفاظ بالأسواق المحسومة. إنها REST API بسيطة بترويسة X-API-Key، لذا تندمج في الشيفرة غير المتزامنة نفسها إلى جانب SDK. ابدأ مجانًا، أو اقرأ كيف تبني بوتًا للمسار الكامل.
الأسئلة الشائعة
- ما حزمة Python SDK الرسمية من Polymarket في 2026؟
- حزمة Python SDK الرسمية هي polymarket-client، تُثبَّت بالأمر pip install polymarket-client وتُستورد باسم polymarket. إنها SDK الموحّدة التي تغطي CLOB وGamma وData API بالإضافة إلى التدفقات الآنية عبر واجهة عميل واحدة، وتحل محل py-clob-client. ونظيرتها في TypeScript هي @polymarket/client، وحزمة Rust SDK موحّدة قيد التطوير.
- هل py-clob-client مهجورة؟
- حلّت محلها SDK الموحّدة polymarket-client، إلى جانب حزم TypeScript @polymarket/clob-client-v2 و@polymarket/builder-relayer-client و@polymarket/builder-signing-sdk. تنشر Polymarket دليل انتقال لنقل التكاملات القائمة. ولا تزال معظم الدروس والشيفرات المولّدة بالذكاء الاصطناعي تشير إلى الحزم الأقدم لأنها أقدم بكثير من حزم SDK الموحّدة.
- أي عميل Python من Polymarket يجب أن أستخدم لبوت تداول؟
- استخدم AsyncSecureClient. هناك أربعة عملاء: AsyncPublicClient وPublicClient للبيانات العامة، وAsyncSecureClient وSecureClient للتداول والوصول إلى الحساب. الاشتراكات الآنية غير متزامنة فقط — العملاء المتزامنون لا ينفّذون subscribe() — لذا يحتاج أي بوت يبث تحديثات الدفتر إلى عميل غير متزامن. ابنِ واختبر مقابل AsyncPublicClient قبل إدخال بيانات الاعتماد.
- كيف أرقّم النتائج باستخدام Polymarket Python SDK؟
- تُرجع دوال السرد أداة ترقيم. مرّ عليها مباشرة للتحكم صفحة بصفحة، أو استدعِ iter_items() للمرور على السجلات الفردية متجاهلًا حدود الصفحات، أو استخدم first_page() وfrom_cursor() لعمليات مسح يدوية قابلة للاستئناف. قيمة next_cursor معتمة، لذا خزّنها حرفيًا بدلًا من تحليلها أو تكوينها، واحذفها للبدء من الصفحة الأولى.
- لماذا يولّد ChatGPT أو Claude شيفرة Polymarket لا تعمل؟
- لأن الغالبية الساحقة من شيفرات Polymarket في بيانات التدريب أقدم من حزم SDK الموحّدة، تميل النماذج إلى إنتاج استيرادات py_clob_client وإنشاء ClobClient وكائنات OrderArgs. تحقّق من سطر الاستيراد أولًا — from polymarket import حديث، وfrom py_clob_client ليس كذلك. تنشر Polymarket وثائق قابلة للقراءة آليًا على docs.polymarket.com/llms.txt ونسخة .md من كل صفحة، لذا فلصق الوثائق الحالية في السياق أكثر فعالية من تصحيح النموذج مرارًا.
- هل يمكن لـ Polymarket SDK جلب بيانات دفتر الأوامر التاريخية؟
- لا. SDK واجهة لواجهات Polymarket API ولا يمكنها إرجاع بيانات لا تحتفظ بها تلك الواجهات. البيانات الوصفية للسوق المحسوم قابلة للاسترجاع، لكن دفتر أوامره يُرجع 404 وسجل أسعاره لا يحتفظ إلا بنقطة واحدة تقريبًا في الدقيقة. يتطلب الاختبار الرجعي لقطات عند لحظات زمنية محددة سجّلها طرف ثالث أثناء تشغيل الأسواق.
احصل على البيانات التاريخية التي لا تحتفظ بها Polymarket
يسجّل PolyTest أسواق Up/Down للعملات المشفرة على Polymarket أثناء تشغيلها — 240M+ لقطة مع 8 مستويات من عمق دفتر الأوامر، وطوابع زمنية بدقة أقل من الثانية، مع الاحتفاظ بالأسواق المحسومة. ابدأ بفترة تجريبية مجانية لمدة 3 أيام.
تابع القراءة
كيف تبني بوت تداول على Polymarket
معظم دروس بناء بوتات Polymarket مبنية على حزم SDK لم تعد موجودة. هذا هو المسار الحالي من البداية إلى النهاية — ما الذي تثبّته في 2026، وكيف تعمل المصادقة فعلًا، وأين تقع فجوات البيانات، وأنماط الفشل التي تقتل البوتات في أسبوعها الأول.
WebSockets في Polymarket: بيانات آنية لا تنقطع
استطلاع دفتر الأوامر هو الطريقة الأكثر شيوعًا لاستنزاف ميزانية حد المعدل بلا فائدة. إليك التدفقات الأربعة، وخيارات الاشتراك التي لا يوثقها أحد، ونمط الفشل الذي يتلقى فيه بوتك الصمت فيظنه هدوءًا.
خريطة Polymarket API: Gamma مقابل CLOB مقابل Data API
يخسر القادمون الجدد يومًا بسبب المشكلة نفسها: ليست لدى Polymarket واجهة API واحدة، بل أربع، ونقطة النهاية التي تريدها نادرًا ما تكون في الواجهة التي جربتها أولًا. هذه هي الخريطة الكاملة.