Social
أدر العلامات التجارية، واربط حسابات التواصل الاجتماعي، وانشر منشورات أو جدولها على Facebook وInstagram وX وLinkedIn وPinterest عبر client.social.
تندرج جميع دوال Social ضمن client.social، موزعة على أربعة نطاقات أسماء، بالإضافة إلى استدعاء واحد في المستوى الأعلى:
المعرّفات والمنصات والحالات
معرّفات العلامات التجارية والمنشورات والاتصالات هي سلاسل UUID نصية عادية. وعلى خلاف معرّفات المواقع، لا تُرمَّز مطلقًا باستخدام Base64، ولا تحوّلها SDK.
تُحدَّد المنصات بقيم التعداد المكتوبة بأحرف كبيرة FACEBOOK وINSTAGRAM وTWITTER (وهي X) وLINKEDIN وPINTEREST. حالات المنشورات هي DRAFT وPENDING وSCHEDULED وPUBLISHED وFAILED وARCHIVED وREJECTED؛ والحالات لكل قناة هي SCHEDULED وSUCCESS وERROR وARCHIVED.
تُرجع كل عملية كتابة علامة success
تُبلغ عمليات الكتابة في Social عن حالات فشل التحقق ضمن استجابة 200، على هيئة success: false مع ذكر السبب في error. تثير SDK استثناءات عند حدوث أخطاء في النقل وعند تلقي حمولات أخطاء تتعرف عليها، لكن يُنصح بالتحقق من success بنفسك دائمًا:
result = client.social.brands.create(profile_name="Jenny Home", timezone=tz)if not result.success: raise RuntimeError(result.error.message)النشر غير متزامن
يقبل action="PUBLISH" المنشور ويُرجع id الخاص به. استعلم دوريًا باستخدام social.posts.retrieve() واقرأ connectedChannels[] للحصول على status وliveLink وerror لكل قناة؛ فقد ينجح نشر منشور على منصة ويفشل على أخرى في الاستدعاء نفسه.
social.brands.create
أنشئ علامة تجارية. لا يُطلب سوى profile_name وtimezone.
client.social.brands.create( *, profile_name: str, timezone: dict, business_intent: str | None = None, categories: list[str] | None = None, site_url: str | None = None, logo: str | None = None, country_iso: str | None = None, bio: str | None = None, brand_hashtags: list[str] | None = None, competitor_hashtags: list[str] | None = None, content_preferred_language: str | None = None,) -> APIObjectresult = client.social.brands.create( profile_name="Jenny Home", timezone={ "label": "(GMT-05:00) Eastern Time", "tzCode": "America/New_York", "name": "Eastern Standard Time", "utc": "-05:00", }, business_intent="A family-run home furnishings store selling handmade furniture.", categories=["Furniture Store"], site_url="https://jennyhome.example",)brand_id = result.socialProfile.id # a plain UUID stringعدد العلامات التجارية غير محدود في خطط API، لذا لا تفشل هذه العملية أبدًا بسبب بلوغ حد أقصى. ما يُحتسب هو الاتصالات — تحقّق من social.limits() قبل إنشاء رابط اتصال، وليس قبل إنشاء علامة تجارية.
social.brands.list
اعرض قائمة العلامات التجارية، مقسّمة إلى صفحات باستخدام الإزاحة. يُطلب statuses داخل عامل التصفية عند إرساله.
client.social.brands.list( *, statuses: list[str] | None = None, profile_name: str | None = None, page: int | None = None, size: int | None = None,) -> APIObjectresult = client.social.brands.list(page=1, size=25)for brand in result.profiles: print(brand.id, brand.profileName, brand.connectedChannelCount)print(result.pageInfo.total, result.pageInfo.hasNextPage)social.brands.retrieve
اجلب علامة تجارية واحدة باستخدام UUID الخاص بها.
client.social.brands.retrieve(brand_id: str) -> APIObjectbrand = client.social.brands.retrieve("6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902")print(brand.profileName, brand.timezone.tzCode)social.brands.update
حدّث علامة تجارية. لا يُطلب سوى profile_id؛ أرسل فقط الحقول التي تغيّرها.
client.social.brands.update( profile_id: str, *, profile_name: str | None = None, timezone: dict | None = None, business_intent: str | None = None, categories: list[str] | None = None, site_url: str | None = None, logo: str | None = None, country_iso: str | None = None, bio: str | None = None, brand_hashtags: list[str] | None = None, competitor_hashtags: list[str] | None = None, content_preferred_language: str | None = None,) -> APIObjectتؤدي categories وbrand_hashtags وcompetitor_hashtags عند إرسالها إلى استبدال القائمة المخزّنة؛ ويؤدي تمرير [] إلى إفراغها.
client.social.brands.update( "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", profile_name="Jenny Home & Co.",)social.brands.archive
أرشف علامة تجارية واتصالاتها. يجب أن يكون قد مضى على إنشاء العلامة التجارية 90 يومًا على الأقل.
client.social.brands.archive(social_profile_id: str) -> APIObjectresult = client.social.brands.archive("6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902")print(result.status) # ARCHIVED or TENURE_NOT_METإذا لم يمضِ على إنشاء العلامة التجارية 90 يومًا، تُرجع العملية success: False وstatus: "TENURE_NOT_MET" ولا يتغير شيء. عند استيفاء هذه المدة، تتم الأرشفة فورًا: تُؤرشف العلامة التجارية وكل اتصال مرتبط بها في الاستدعاء نفسه وتتوقف عن النشر فورًا، لكن تظل حصص اتصالاتها محجوزة حتى نهاية دورة الفوترة، تمامًا كما يحدث عند قطع الاتصال يدويًا.
social.connections.link
أنشئ عنوان URL مستضافًا قصير الصلاحية يرشد المستخدم النهائي خلال خطوات ربط منصة واحدة بعلامة تجارية. أعد توجيهه إلى url.
client.social.connections.link( brand_id: str, *, channel: str, redirect_url: str, error_url: str | None = None, state: str | None = None,) -> APIObjectlink = client.social.connections.link( "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", channel="INSTAGRAM", redirect_url="https://app.example.com/social/connected", error_url="https://app.example.com/social/connect-failed", state="sess_9f2c1e64",)print(link.url, link.expiresIn)يعود المستخدم إلى redirect_url مع إلحاق status وbrandId وplatform وقيمة state التي قدمتها، وكذلك connectedAccountId عند النجاح. يُنشأ الاتصال بعد لحظات، لذا استعلم دوريًا باستخدام social.connections.list() لبضع ثوانٍ بدلًا من اعتبار أول نتيجة قراءة فارغة فشلًا. يتطلب Instagram حسابًا من نوع Business أو Creator مرتبطًا بصفحة Facebook.
social.connections.list
اعرض قائمة حسابات التواصل الاجتماعي المرتبطة بعلامة تجارية.
client.social.connections.list(brand_id: str) -> APIObjectresult = client.social.connections.list("6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902")for channel in result.socialConnected: print(channel.id, channel.platform, channel.displayName)print(result.channelCount)channel.id هو UUID الخاص بالاتصال الذي تتطلبه جميع الاستدعاءات الأخرى؛ أما referenceId فهو معرّف الحساب لدى المنصة نفسها ولا يُقبل مطلقًا كمدخل.
social.connections.disconnect
أزل اتصالًا. لا يمكن التراجع عن هذه العملية: تتطلب استعادته social.connections.link() جديدًا.
client.social.connections.disconnect(social_profile_connected_channel_id: str) -> APIObjectclient.social.connections.disconnect("b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7")لا تُلغى المنشورات المجدولة التي تستهدف القناة؛ بل تفشل عند وقت النشر مع SY95045. ألغها أولًا باستخدام social.posts.cancel().
social.posts.create
أنشئ منشورًا واحدًا لعلامة تجارية واحدة عبر قنواتها المتصلة.
client.social.posts.create( *, social_profile_id: str, name: str, platforms: list[str], content: str, action: str, media_urls: list[str] | None = None, video_urls: list[str] | None = None, link: str | None = None, scheduled_at: str | None = None, schedule_date: str | None = None, schedule_time: str | None = None, connected_channel_ids: list[str] | None = None, client_reference: str | None = None,) -> APIObjectيتطلب action="SCHEDULE" صيغة جدولة واحدة فقط: scheduled_at، أو schedule_date + schedule_time. يُرفض إرسال الصيغتين معًا مع إرجاع SY95046.
result = client.social.posts.create( social_profile_id="6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", name="Autumn collection launch", platforms=["INSTAGRAM", "FACEBOOK"], content="Our autumn collection lands today. Solid oak, hand-finished.", media_urls=["https://cdn.example.com/social/autumn.jpg"], action="SCHEDULE", schedule_date="2026-10-02", schedule_time="09:30",)print(result.success, result.socialPostId)social.posts.retrieve
اجلب منشورًا واحدًا مع حالة النشر لكل قناة. استعلم دوريًا باستخدام هذا الاستدعاء بعد الإنشاء.
client.social.posts.retrieve(post_id: str) -> APIObjectpost = client.social.posts.retrieve("c47a1e58-2b93-4f10-a6d7-58e0c9b12345")print(post.status)for channel in post.connectedChannels: print(channel.platform, channel.status, channel.liveLink, channel.error)social.posts.list
اعرض قائمة منشورات علامة تجارية، مقسّمة إلى صفحات باستخدام الإزاحة، مع عوامل تصفية.
client.social.posts.list( brand_id: str, *, filters: dict | None = None, page: int | None = None, size: int | None = None, fetch_post_content: bool | None = None,) -> APIObjectيقبل filters كلًا من name وplatforms وstatus وstart_date وend_date وsocial_connected_channel_id وapproval_state وview_mode وfilter_by_user.
result = client.social.posts.list( "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", filters={"status": ["SCHEDULED"], "startDate": "2026-10-01", "endDate": "2026-10-31"}, page=1, size=50,)for post in result.socialPosts: print(post.socialPostId, post.name, post.status)print(result.pageInfo.total)social.posts.cancel
ألغِ منشورًا مجدولًا أو مسودة لمنع نشره مطلقًا.
client.social.posts.cancel(social_post_id: str) -> APIObjectclient.social.posts.cancel("c47a1e58-2b93-4f10-a6d7-58e0c9b12345")لا يمكن إلغاء المنشورات التي نُشرت بالفعل، ولا تُزال من أي منصة؛ ويُرجع الاستدعاء success: False لهذه المنشورات.
social.posts.insights
التفاعل والتعليقات لمنشور واحد منشور على قناة واحدة. يُرجع الحقلان على هيئة سلاسل JSON نصية تحتوي على حمولة المنصة نفسها.
client.social.posts.insights( post_id: str, *, social_connected_channel_id: str,) -> APIObjectimport json result = client.social.posts.insights( "c47a1e58-2b93-4f10-a6d7-58e0c9b12345", social_connected_channel_id="b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7",)insights = json.loads(result.insights)comments = json.loads(result.comments)print(insights.get("impressions"), len(comments))المفاتيح داخلها خاصة بالمنصة وتختلف من منصة إلى أخرى؛ تعامل عند قراءتها مع احتمال غياب المفاتيح أو اختلاف بنيتها.
social.bulk.create
تحقّق من صلاحية ما يصل إلى 500 منشور وأضفها إلى قائمة الانتظار في طلب واحد. يمكن أن تستهدف الصفوف علامات تجارية مختلفة.
client.social.bulk.create( posts: list[dict], *, name: str | None = None,) -> APIObjectيقبل كل صف الحقول نفسها التي يقبلها social.posts.create، ضمن camelCase. إذا كان أي صف غير صالح، فلن يُنشأ شيء: تكون قيمة success هي False، ويُرجع SY95050 ضمن error، ويحدد job.results[] كل صف غير صالح بواسطة index الخاص به الذي يبدأ ترقيمه من 0، وclientReference الخاص به.
result = client.social.bulk.create([ { "socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "name": "Autumn week 1", "platforms": ["INSTAGRAM", "FACEBOOK"], "content": "Week one of the autumn collection.", "mediaUrls": ["https://cdn.example.com/social/autumn-w1.jpg"], "action": "SCHEDULE", "scheduleDate": "2026-10-02", "scheduleTime": "09:30", "clientReference": "campaign-4471-slot-01", },])if not result.success: for row in result.job.results: print(row.index, row.clientReference, row.errors)else: job_id = result.job.idsocial.bulk.retrieve
استعلم دوريًا عن مهمة جماعية حتى تصل إلى حالة نهائية.
client.social.bulk.retrieve(bulk_job_id: str) -> APIObjectjob = client.social.bulk.retrieve("9b3f18d0-7a26-4c51-8e94-1f0d5c6b7a82")print(job.status, job.processedCount, "/", job.totalCount)for row in job.results: print(row.clientReference, row.status, row.socialPostId)تكون قيمة status هي QUEUED أو PROCESSING أو COMPLETED أو COMPLETED_WITH_ERRORS أو FAILED. وصول صف إلى CREATED يعني أن المنشور موجود، وليس أنه نُشر: مرّر socialPostId إلى social.posts.retrieve() للحصول على النتيجة لكل قناة.
social.limits
الحد الأقصى للاتصالات والاستخدام الحالي، في استدعاء واحد.
client.social.limits() -> APIObjectlimits = client.social.limits()print(limits.maxConnections, limits.usage.connections) # pool vs usedprint(limits.brands) # None — brands are unlimitedprint(limits.usage.brands) # brands that exist, uncappedالاتصالات حصة مشتركة على مستوى الحساب بأكمله — 20 في Social Launch، و125 في Social Growth، بالإضافة إلى 5 لكل حزمة اتصالات بتكلفة $25 شهريًا — وليست حصة لكل علامة تجارية. تحقّق منها قبل إنشاء رابط اتصال لتتمكن من عرض خيار ترقية بدلًا من SY95042. تكون قيمة limits.brands هي None في جميع خطط API.
انظر أيضًا
- الخطط والإضافات: المستويات، وأسعار الإضافات، ومجموعة الاتصالات، وقاعدة مدة الارتباط البالغة 90 يومًا
- مرجع Social REST: نقاط النهاية الأساسية التي تغلّفها هذه الدوال
- المنشورات: المنتج على مستوى الموقع، وله اشتراك مختلف
- معالجة الأخطاء: الاستثناءات ذات الأنواع المحددة والعَلَم
success