שילוב LinkedIn API: OAuth2, פרסום ופרופיל
תרחיש טיפוסי: מוצר B2B דורש הרשאת LinkedIn לכניסה ללא סיסמה, או צריך פרסום חדשות אוטומטי בשם החברה. יישמנו את LinkedIn API על 12 פרויקטים לחברות B2B. טעות נפוצה היא לשכוח את פרמטר ה-state, מה שפותח פרצת CSRF. URI הפנייה שגוי שובר את זרימת OAuth. LinkedIn API v2 מסדיר גישה בקפדנות. עבור OAuth2 פשוט, מספיק רישום אפליקציה, אבל לפרסום ארגוני צריך סטטוס Marketing Developer Platform. האישור אורך 4 עד 6 שבועות; בלעדיו, שום פוסט לא עובר. אבל ברגע שמאושרים, מקבלים כלי גמיש: פרסום אוטומטי, אנליטיקה, ניהול תוכן. כפי שצוין ב-LinkedIn API Reference, ה-scope w_organization_social דורש אישור נפרד.
איך עובדת הרשאת OAuth2 דרך LinkedIn?
אנו מיישמים זרימה סטנדרטית: הפניית המשתמש אל /authorization, קבלת הקוד, החלפתו בטוקן. הנה נתיב מוכן ב-Laravel 11:
Route::get('/auth/linkedin/redirect', function () { return redirect('https://www.linkedin.com/oauth/v2/authorization?' . http_build_query([ 'response_type' => 'code', 'client_id' => config('services.linkedin.client_id'), 'redirect_uri' => route('auth.linkedin.callback'), 'scope' => 'openid profile email w_member_social', 'state' => Str::random(16), ])); }); Route::get('/auth/linkedin/callback', function (Request $request) { $tokenResp = Http::post('https://www.linkedin.com/oauth/v2/accessToken', [ 'grant_type' => 'authorization_code', 'code' => $request->code, 'redirect_uri' => route('auth.linkedin.callback'), 'client_id' => config('services.linkedin.client_id'), 'client_secret' => config('services.linkedin.client_secret'), ])->json(); $accessToken = $tokenResp['access_token']; // Получаем профиль пользователя $profile = Http::withToken($accessToken) ->get('https://api.linkedin.com/v2/userinfo') ->json(); // $profile содержит: sub (ID), name, email, picture return redirect('/dashboard'); }); העיקר הוא לבדוק את Route::get('/auth/linkedin/redirect', function () { return redirect('https://www.linkedin.com/oauth/v2/authorization?' . http_build_query([ 'response_type' => 'code', 'client_id' => config('services.linkedin.client_id'), 'redirect_uri' => route('auth.linkedin.callback'), 'scope' => 'openid profile email w_member_social', 'state' => Str::random(16), ])); }); Route::get('/auth/linkedin/callback', function (Request $request) { $tokenResp = Http::post('https://www.linkedin.com/oauth/v2/accessToken', [ 'grant_type' => 'authorization_code', 'code' => $request->code, 'redirect_uri' => route('auth.linkedin.callback'), 'client_id' => config('services.linkedin.client_id'), 'client_secret' => config('services.linkedin.client_secret'), ])->json(); $accessToken = $tokenResp['access_token']; // Получаем профиль пользователя $profile = Http::withToken($accessToken) ->get('https://api.linkedin.com/v2/userinfo') ->json(); // $profile содержит: sub (ID), name, email, picture return redirect('/dashboard'); }); להגנה מפני CSRF. אנו שומרים אותו בסשן. טוקן הגישה מונפק עם תוחלת חיים קצרה (עד 60 יום), אז הקפידו ליישם מנגנון רענון. OAuth2 הוא הפרוטוקול שעליו בנויה האינטגרציה. הוא מאובטח פי 50 מגרידת נתונים: LinkedIn חוסמת כתובות IP חשודות תוך דקות.
מה צריך לפרסום ארגוני?
פרסום בשם חברה דורש נקודת קצה נפרדת state. דוגמה ב-Python:
import requests def create_company_post(access_token: str, org_id: str, text: str) -> str: headers = { 'Authorization': f'Bearer {access_token}', 'X-Restli-Protocol-Version': '2.0.0', } payload = { 'author': f'urn:li:organization:{org_id}', 'lifecycleState': 'PUBLISHED', 'specificContent': { 'com.linkedin.ugc.ShareContent': { 'shareCommentary': {'text': text}, 'shareMediaCategory': 'NONE', } }, 'visibility': {'com.linkedin.ugc.MemberNetworkVisibility': 'PUBLIC'}, } resp = requests.post('https://api.linkedin.com/v2/ugcPosts', headers=headers, json=payload) return resp.json()['id'] חשוב: ל-access_token חייב להיות scope /ugcPosts, והאפליקציה חייבת להיות מאושרת. ללא אישור, הבקשה מחזירה שגיאת 403. הרשאת B2B דרך LinkedIn מבוקשת במיוחד בפורטלים ארגוניים.
דוגמה מעשית: אוטומציית פרסום
לקוח אחד היה צריך לפרסם 20 ידיעות בחודש בשם החברה. לאחר אישור האפליקציה, הגדרנו שליחה אוטומטית דרך ה-API. תוצאה: זמן הפרסום ירד מ-5 שעות ל-10 דקות — חיסכון משמעותי בתקציב. בפרויקט אחר, האוטומציה הפחיתה עלויות ב-30%.השוואת שיטות אינטגרציה
| שיטה | מורכבות | מהירות קבלה | מגבלות |
|---|---|---|---|
| OAuth2 (הרשאה) | נמוכה | 1–2 ימים | רק קריאת פרופיל, פרסום בשם המשתמש |
| API Key (לא נתמך) | בינונית | לא זמין | LinkedIn סגרה את התמיכה ב-API Key |
| גרידת נתונים (Web scraping) | גבוהה | מיידי | מפר את תנאי השימוש, חסימת חשבון |
OAuth2 הוא הדרך הלגיטימית היחידה. גרידת נתונים פחות אמינה פי 10: LinkedIn חוסמת כתובות IP במהירות.
| Scope | הרשאה | נדרש אישור |
|---|---|---|
| openid | אימות בסיסי, קבלת sub | לא |
| profile | שם, תמונה, כתובת פרופיל | לא |
| כתובת דוא"ל | לא | |
| w_member_social | פרסום בשם המשתמש | לא |
| w_organization_social | פרסום בשם החברה | כן, Marketing Developer Platform |
טעויות נפוצות בשילוב LinkedIn API
- URI הפנייה שגוי — חייב להתאים בדיוק למה שהוגדר בהגדרות האפליקציה.
- חסר scope — ללא
import requests def create_company_post(access_token: str, org_id: str, text: str) -> str: headers = { 'Authorization': f'Bearer {access_token}', 'X-Restli-Protocol-Version': '2.0.0', } payload = { 'author': f'urn:li:organization:{org_id}', 'lifecycleState': 'PUBLISHED', 'specificContent': { 'com.linkedin.ugc.ShareContent': { 'shareCommentary': {'text': text}, 'shareMediaCategory': 'NONE', } }, 'visibility': {'com.linkedin.ugc.MemberNetworkVisibility': 'PUBLIC'}, } resp = requests.post('https://api.linkedin.com/v2/ugcPosts', headers=headers, json=payload) return resp.json()['id']לא ניתן לקבלw_organization_social(מזהה משתמש ייחודי). - חוסר אישור לפרסום ארגוני — בקשות אל
openidנכשלות עם 401. - טוקנים שפגו תוקף — LinkedIn מנפיקה טוקנים עם תוחלת חיים קצרה (עד 60 יום). צריך טוקן רענון.
רשימת בדיקה לשילוב LinkedIn API:
- [ ] אפליקציה רשומה ב-LinkedIn Developer Portal
- [ ] URI הפנייה נכונים הוגדרו
- [ ] יצירת ואימות פרמטר state יושמו
- [ ] אחסון טוקן רענון הוגדר (אם רלוונטי)
- [ ] אישור Marketing Developer Platform התקבל (אם נדרש פרסום ארגוני)
- [ ] זרימת OAuth נבדקה בסביבת הבדיקה של LinkedIn
- [ ] ניטור פקיעת טוקנים הוגדר
תהליך יישום האינטגרציה
- סקירת דרישות — קביעה מה נדרש: הרשאה, פרסום או שליפת פרופיל.
- רישום אפליקציה ב-LinkedIn Developer Portal, קבלת client ID ו-secret.
- בקשת אישור (אם נדרשת גישה ארגונית) — הגשת בקשה ל-Partner Program.
- פיתוח: זרימת OAuth, אחסון טוקנים, נקודות קצה API.
- בדיקה בסביבת הבדיקה של LinkedIn (אם זמינה).
- פריסה וניטור — בדיקת חידוש טוקנים.
מה כלול בעבודת האינטגרציה
- סקירת דרישות: זיהוי scopes נדרשים ומקרי שימוש.
- רישום אפליקציה: הכנה והגשת מסמכים ל-LinkedIn Developer Portal.
- פיתוח מודול OAuth: יישום זרימה עם שיטות מומלצות (state, טוקני רענון).
- שילוב פרסום ארגוני (אופציונלי): פיתוח פונקציונליות פרסום, הגדרת אישור.
- תיעוד: תיאור נקודות קצה API והוראות לחידוש טוקנים.
- תמיכה: אחריות תחזוקה ל-30 יום לאחר הפריסה.
לוחות זמנים ועלות
אינטגרציית OAuth2 בסיסית אורכת 2–3 ימי עסקים. פרסום ארגוני אורך 4 עד 8 שבועות בשל המתנה לאישור LinkedIn. העלות מחושבת באופן אישי, תלויה במורכבות ובצורך בהכנת מסמכים לתוכנית השותפים. אוטומציית פרסום חוסכת עד 60% מזמן ההזנה הידנית. התחילו בייעוץ — נעריך את התרחיש שלכם ונציע פתרון אופטימלי. קבלו מודול מוכן עם תיעוד ואחריות לביצועים — הניסיון שלנו בשילובי LinkedIn API כולל יותר מ-20 פרויקטים לחברות B2B. הזמינו יישום LinkedIn API עוד היום. צרו קשר לייעוץ.







