تكامل CRM: Salesforce وHubSpot
جلب سجل العميل، وتسجيل التفاعلات، وتحديث سجلات CRM.
تكامل CRM: Salesforce وHubSpot درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.
أهمية التكامل مع CRM
يعمل وكيل خدمة العملاء الذي لا يستطيع الاطلاع على سجل العميل دون رؤية واضحة. تحتفظ أنظمة CRM مثل Salesforce وHubSpot بسجل العميل الكامل: التذاكر السابقة، والمشتريات، ومستوى الاشتراك، وملاحظات الحساب.
يتيح التكامل مع CRM للوكيل تخصيص الاستجابات وحل المشكلات بشكل أسرع.
الاتصال بـ Salesforce باستخدام simple-salesforce
تُعد simple-salesforce مكتبة Python الأكثر شيوعًا للتعامل مع Salesforce REST API. اتصلوا باستخدام اسم مستخدم/كلمة مرور/رمز أمان أو عبر تدفق تطبيق متصل باستخدام OAuth.
from simple_salesforce import Salesforce
sf = Salesforce(
username='agent@company.com',
password='YOUR_SF_PASSWORD',
security_token='YOUR_SF_TOKEN',
domain='login' # use 'test' for sandbox
)
print('Connected to Salesforce org:', sf.base_url)استعلامات SOQL: جلب سجلات العملاء
تشبه Salesforce Object Query Language (SOQL) لغة SQL، لكنها تعمل على كائنات Salesforce. استخدموها للبحث عن جهة اتصال باستخدام البريد الإلكتروني واسترداد تفاصيل حسابها.
def get_customer_by_email(sf, email: str) -> dict | None:
query = (
f"SELECT Id, FirstName, LastName, Email, AccountId, "
f"Account.Name, Account.Type "
f"FROM Contact "
f"WHERE Email = '{email}' "
f"LIMIT 1"
)
result = sf.query(query)
if result['totalSize'] == 0:
return None
record = result['records'][0]
return {
'contact_id': record['Id'],
'name': f"{record['FirstName']} {record['LastName']}",
'account_id': record['AccountId'],
'account_name': record['Account']['Name']
}
if __name__ == '__main__':
class FakeSF:
def query(self, query):
return {
'totalSize': 1,
'records': [{
'Id': '003ABC', 'FirstName': 'Jane', 'LastName': 'Doe',
'AccountId': '001XYZ',
'Account': {'Name': 'Acme Corp', 'Type': 'Customer'},
}],
}
customer = get_customer_by_email(FakeSF(), 'jane@acme.com')
print(f"Found customer: {customer['name']} at {customer['account_name']}")
جلب سجل حالات الدعم من Salesforce
استعلموا عن الكائن Case لاسترداد تذاكر الدعم السابقة للعميل. أدرجوا حالة الحالة وقرار حلها حتى يتجنب الوكيل طرح الأسئلة نفسها مرتين.
def get_case_history(sf, contact_id: str, limit: int = 10) -> list:
query = (
f"SELECT Id, CaseNumber, Subject, Status, "
f"CreatedDate, ClosedDate, Resolution__c "
f"FROM Case "
f"WHERE ContactId = '{contact_id}' "
f"ORDER BY CreatedDate DESC "
f"LIMIT {limit}"
)
result = sf.query(query)
return [
{
'case_number': r['CaseNumber'],
'subject': r['Subject'],
'status': r['Status'],
'created': r['CreatedDate'][:10],
'resolution': r.get('Resolution__c')
}
for r in result['records']
]
if __name__ == '__main__':
class FakeSF:
def query(self, query):
return {'records': [{
'Id': '500A', 'CaseNumber': '00001234', 'Subject': 'Login issue',
'Status': 'Closed', 'CreatedDate': '2026-07-01T10:00:00Z',
'ClosedDate': '2026-07-02T09:00:00Z', 'Resolution__c': 'Reset password',
}]}
for case in get_case_history(FakeSF(), '003ABC'):
print(f"Case {case['case_number']}: {case['subject']} ({case['status']})")
إنشاء حالة جديدة في Salesforce
عندما ينشئ الوكيل تذكرة دعم جديدة من محادثة، أدرجوا سجل Case جديدًا. اربطوه بجهة الاتصال والحساب حتى يظهر في المخطط الزمني للعميل.
def create_case(sf, contact_id: str, account_id: str,
subject: str, description: str, priority: str = 'Medium') -> str:
result = sf.Case.create({
'ContactId': contact_id,
'AccountId': account_id,
'Subject': subject,
'Description': description,
'Priority': priority,
'Status': 'New',
'Origin': 'AI Agent'
})
case_id = result['id']
print(f'Created Case: {case_id}')
return case_id
if __name__ == '__main__':
class FakeCase:
def create(self, data):
return {'id': '500NEW01'}
class FakeSF:
Case = FakeCase()
create_case(FakeSF(), '003ABC', '001XYZ', 'Cannot reset password', 'Customer locked out after 3 attempts')
الاتصال بـ HubSpot
تغلّف مكتبة hubspot-api-client واجهة HubSpot REST API. صادقوا باستخدام رمز وصول لتطبيق خاص (ولا حاجة إلى OAuth في عمليات التكامل من خادم إلى خادم).
from hubspot import HubSpot
from hubspot.crm.contacts import SimplePublicObjectInput
client = HubSpot(access_token='YOUR_HUBSPOT_PRIVATE_APP_TOKEN')
print('HubSpot client ready')البحث عن جهة اتصال في HubSpot
استخدموا Contacts search API للعثور على عميل باستخدام البريد الإلكتروني. تتضمن الاستجابة جميع خصائص جهة الاتصال، بما في ذلك مرحلة دورة الحياة، وارتباطات الصفقات، والحقول المخصصة.
from hubspot.crm.contacts import PublicObjectSearchRequest
def get_hubspot_contact(client, email: str) -> dict | None:
search_request = PublicObjectSearchRequest(
filter_groups=[{
'filters': [{
'propertyName': 'email',
'operator': 'EQ',
'value': email
}]
}],
properties=['firstname', 'lastname', 'email',
'lifecyclestage', 'hs_object_id']
)
response = client.crm.contacts.search_api.do_search(
public_object_search_request=search_request
)
if response.total == 0:
return None
contact = response.results[0]
return {'id': contact.id, **contact.properties}جلب سجل تذاكر HubSpot
يخزّن HubSpot تذاكر الدعم في الكائن tickets. استردوا التذاكر المرتبطة بجهة اتصال باستخدام associations API.
def get_hubspot_tickets(client, contact_id: str) -> list:
assoc = client.crm.contacts.associations_api.get_all(
contact_id,
to_object_type='tickets'
)
ticket_ids = [r.id for r in assoc.results]
if not ticket_ids:
return []
tickets = []
for tid in ticket_ids[:10]: # limit to 10 most recent
ticket = client.crm.tickets.basic_api.get_by_id(
tid,
properties=['subject', 'hs_ticket_priority',
'hs_pipeline_stage', 'createdate']
)
tickets.append({
'id': tid,
'subject': ticket.properties.get('subject'),
'priority': ticket.properties.get('hs_ticket_priority'),
'stage': ticket.properties.get('hs_pipeline_stage')
})
return tickets
if __name__ == '__main__':
from types import SimpleNamespace
class AssocApi:
def get_all(self, contact_id, to_object_type):
return SimpleNamespace(results=[SimpleNamespace(id='t1'), SimpleNamespace(id='t2')])
class TicketsBasicApi:
_data = {
't1': {'subject': 'Cannot login', 'hs_ticket_priority': 'HIGH', 'hs_pipeline_stage': '1'},
't2': {'subject': 'Refund request', 'hs_ticket_priority': 'MEDIUM', 'hs_pipeline_stage': '2'},
}
def get_by_id(self, tid, properties):
return SimpleNamespace(properties=self._data[tid])
fake_client = SimpleNamespace(crm=SimpleNamespace(
contacts=SimpleNamespace(associations_api=AssocApi()),
tickets=SimpleNamespace(basic_api=TicketsBasicApi()),
))
for t in get_hubspot_tickets(fake_client, 'contact_1'):
print(f"Ticket {t['id']}: {t['subject']} [{t['priority']}]")
إنشاء تذكرة في HubSpot
أدرجوا تذكرة جديدة واربطوها بجهة الاتصال ضمن سير عمل واحد. يحافظ ذلك تلقائيًا على تحديث سجل العميل في CRM أثناء تعامل الوكيل مع الطلبات.
from hubspot.crm.tickets import SimplePublicObjectInputForCreate
from hubspot.crm.associations.v4.models import AssociationSpec
def create_hubspot_ticket(client, contact_id: str,
subject: str, description: str) -> str:
ticket_input = SimplePublicObjectInputForCreate(
properties={
'subject': subject,
'content': description,
'hs_ticket_priority': 'MEDIUM',
'hs_pipeline': 'support_pipeline',
'hs_pipeline_stage': 'new'
},
associations=[{
'types': [AssociationSpec(association_category='HUBSPOT_DEFINED',
association_type_id=16)],
'to': {'id': contact_id}
}]
)
ticket = client.crm.tickets.basic_api.create(
simple_public_object_input_for_create=ticket_input
)
return ticket.idتحديث سجل جهة اتصال
بعد حل ناجح، حدّثوا سجل جهة الاتصال بالملاحظات وتغييرات مرحلة دورة الحياة. يحافظ ذلك على تحديث CRM دون الحاجة إلى جهد يدوي من الوكيل.
def update_hubspot_contact(client, contact_id: str, updates: dict) -> None:
client.crm.contacts.basic_api.update(
contact_id=contact_id,
simple_public_object_input=SimplePublicObjectInput(
properties=updates
)
)
# After resolving a billing issue:
update_hubspot_contact(client, 'CONTACT_123', {
'hs_lead_status': 'CONNECTED',
'notes_last_contacted': 'Resolved billing duplicate charge issue via AI agent.'
})سياق CRM موحّد للوكيل
أنشئوا دالة واحدة لجلب سياق العميل من نظام CRM المُعدّ، أيًا كان. يستدعي الوكيل هذه الدالة في بداية كل محادثة لتخصيص استجاباته.
def get_customer_context(email: str, crm: str = 'salesforce') -> dict:
if crm == 'salesforce':
customer = get_customer_by_email(sf, email)
if not customer:
return {'found': False}
cases = get_case_history(sf, customer['contact_id'])
return {'found': True, 'customer': customer, 'history': cases}
elif crm == 'hubspot':
customer = get_hubspot_contact(client, email)
if not customer:
return {'found': False}
tickets = get_hubspot_tickets(client, customer['id'])
return {'found': True, 'customer': customer, 'history': tickets}
return {'found': False, 'error': 'Unknown CRM'}ما لغة الاستعلامات في Salesforce المستخدمة لاسترداد السجلات عبر مكتبة simple-salesforce؟
تستخدم Salesforce لغة استعلام خاصة بها لاسترداد السجلات. وتُعد معرفة هذه اللغة ضرورية لبناء أدوات الوكيل التي تبحث في سجل العميل.
مراجعة التكامل مع CRM
يمنح التكامل مع Salesforce (باستخدام simple-salesforce وSOQL) أو HubSpot (باستخدام hubspot-api-client) وكيل خدمة العملاء سياقًا كاملًا عن العميل: السجل، والحالات، والتذاكر، وبيانات الحساب.
أنشئوا دائمًا دالة get_customer_context() موحّدة حتى تتم إضافة السجل ذي الصلة إلى مطالبة الوكيل قبل إنشاء الاستجابة.
تعلم AI Agents مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 60
- الدروس
- 239
الأسئلة الشائعة
هل درس «تكامل CRM: Salesforce وHubSpot» مجاني؟
نعم — نص درس «تكامل CRM: Salesforce وHubSpot» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «تكامل CRM: Salesforce وHubSpot»؟
جلب سجل العميل، وتسجيل التفاعلات، وتحديث سجلات CRM. تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تكامل CRM: Salesforce وHubSpot»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- منطق توجيه التذاكر وتصعيدها
- تكامل CRM: Salesforce وHubSpot
- بروتوكولات التسليم إلى العنصر البشري
- إدارة سياق العميل وسجله