جميع المقالات
أدلةPythonSDKPolymarket API

حزمة Polymarket Python SDK في 2026 (والانتقال من py-clob-client)

إذا كانت شيفرتك لا تزال تستورد ClobClient من py_clob_client، فهي مبنية على حزمة حلّت محلها أخرى — وكذلك معظم شيفرات Polymarket التي سيكتبها لك مساعد الذكاء الاصطناعي. إليك حزمة SDK الحالية وكيف تنتقل إليها.

10 دقيقة للقراءة

العنوان الرئيسي

تطلق 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
الوقت الفعليالاتصال بكل WebSocketsubscribe() تدمج التغذيات

التثبيت

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

  1. أحصِ كل استدعاء لـ Polymarket، بما في ذلك استدعاءات requests الخام إلى Gamma وData API. فهي ضمن النطاق أيضًا — SDK الموحّدة تغطيها، ودمجها هو معظم الفائدة.
  2. ثبّت polymarket-client، وأزل الحزم القديمة. إبقاء الاثنتين مثبتتين للانتقال التدريجي يفتح الباب لاستيراد رمز client الخاطئ.
  3. استبدل إنشاء العملاء. استدعاء AsyncSecureClient.create(...) واحد يحل محل العملاء القدامى لكل خدمة ومعالجتهم المنفصلة لبيانات الاعتماد.
  4. استبدل الوصول بالقاموس بالوصول بالخاصية. يصبح market["condition_id"] هو market.condition_id. عمل ممل، وهنا يبدأ مدقق الأنواع في رد الجميل.
  5. أعد كتابة ترقيم الصفحات وفق واجهة أداة الترقيم بدلًا من حلقات offset أو المؤشرات اليدوية.
  6. استبدل شيفرة WebSocket المكتوبة يدويًا بـ subscribe()، واحذف منطق نبض الاتصال وإعادة الاتصال لديك.
  7. أعد تشغيل مسارات القراءة فقط أولًا، مقابل العميل العام، قبل السماح لأي شيء بتقديم أمر.

تحصل 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 أيام.

تابع القراءة