social-agent-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1013 @@
1
+ # LinkedIn Platform Bilgi Dosyasi
2
+
3
+ Bu dosya, LinkedIn platformunda browser otomasyon islemleri icin kapsamli bir referans kaynagi olarak hazirlanmistir. AI mapper ve runner modulleri bu dosyayi okuyarak selector secimi, sayfa navigasyonu ve anti-bot onlemlerine dair karar verir.
4
+
5
+ ---
6
+
7
+ ## 1. URL Yapisi
8
+
9
+ LinkedIn'in tum sayfalari `https://www.linkedin.com` altinda yer alir. Asagida tum onemli URL desenleri listelenmistir.
10
+
11
+ ### 1.1 Ana Sayfalar
12
+
13
+ | Sayfa | URL | Aciklama |
14
+ |-------|-----|----------|
15
+ | Ana Akis (Feed) | `/feed/` | Ana sayfa, paylasimlar ve oneriler |
16
+ | Profilim | `/in/KULLANICIADI/` | Kendi profilin veya baskasinin profili |
17
+ | Profil Duzenle | `/in/KULLANICIADI/edit/` | Profil duzenleme ekrani |
18
+ | Agim | `/mynetwork/` | Ag yonetimi ana sayfasi |
19
+ | Baglanti Onerileri | `/mynetwork/grow/` | "Taniyabileceginiz kisiler" sayfasi |
20
+ | Davetler | `/mynetwork/invitation-manager/` | Gelen/gonderilen baglanti istekleri |
21
+ | Mesajlar | `/messaging/` | Mesajlasma ana sayfasi |
22
+ | Belirli Mesaj | `/messaging/thread/THREAD_ID/` | Tek bir mesaj konusu |
23
+ | Bildirimler | `/notifications/` | Tum bildirimler |
24
+ | Isler | `/jobs/` | Is ilanlari ana sayfasi |
25
+ | Is Ara | `/jobs/search/` | Is arama sonuclari |
26
+ | Kaydedilen Isler | `/my-items/saved-jobs/` | Kaydedilen is ilanlari |
27
+ | Ayarlar | `/psettings/` | Genel ayarlar |
28
+ | Gizlilik Ayarlari | `/psettings/privacy/` | Gizlilik ayarlari |
29
+ | Hesap Ayarlari | `/psettings/account/` | Hesap ayarlari |
30
+
31
+ ### 1.2 Arama URL'leri
32
+
33
+ LinkedIn arama sonuclari filtrelerle birlikte URL parametreleri uzerinden calisir.
34
+
35
+ | Arama Turu | URL Deseni |
36
+ |------------|------------|
37
+ | Genel Arama | `/search/results/all/?keywords=SORGU` |
38
+ | Kisi Ara | `/search/results/people/?keywords=SORGU` |
39
+ | Sirket Ara | `/search/results/companies/?keywords=SORGU` |
40
+ | Gonderi Ara | `/search/results/content/?keywords=SORGU` |
41
+ | Grup Ara | `/search/results/groups/?keywords=SORGU` |
42
+ | Etkinlik Ara | `/search/results/events/?keywords=SORGU` |
43
+ | Okul Ara | `/search/results/schools/?keywords=SORGU` |
44
+ | Is Ara | `/jobs/search/?keywords=SORGU` |
45
+
46
+ Arama filtreleri URL parametreleri olarak eklenir:
47
+ - `&network=%5B"F"%5D` - 1. derece baglantilar
48
+ - `&network=%5B"S"%5D` - 2. derece baglantilar
49
+ - `&network=%5B"O"%5D` - 3. derece ve diger
50
+ - `&geoUrn=%5B"LOCATION_ID"%5D` - Konum filtresi
51
+ - `&industry=%5B"INDUSTRY_ID"%5D` - Sektor filtresi
52
+ - `&currentCompany=%5B"COMPANY_ID"%5D` - Mevcut sirket
53
+ - `&school=%5B"SCHOOL_ID"%5D` - Okul filtresi
54
+ - `&connectionOf=%5B"PROFILE_URN"%5D` - Belirli kisinin baglantilari
55
+ - `&origin=FACETED_SEARCH` - Arama kaynagi
56
+ - `&sid=OTURUM_ID` - Arama oturumu
57
+
58
+ ### 1.3 Sirket Sayfalari
59
+
60
+ | Sayfa | URL Deseni |
61
+ |-------|------------|
62
+ | Sirket Ana | `/company/SIRKET_ADI/` |
63
+ | Hakkinda | `/company/SIRKET_ADI/about/` |
64
+ | Gonderiler | `/company/SIRKET_ADI/posts/` |
65
+ | Isler | `/company/SIRKET_ADI/jobs/` |
66
+ | Calisanlar | `/company/SIRKET_ADI/people/` |
67
+ | Hayat | `/company/SIRKET_ADI/life/` |
68
+
69
+ ### 1.4 Gruplar ve Etkinlikler
70
+
71
+ | Sayfa | URL Deseni |
72
+ |-------|------------|
73
+ | Grup | `/groups/GRUP_ID/` |
74
+ | Etkinlik | `/events/ETKINLIK_ID/` |
75
+ | Etkinliklerim | `/events/` |
76
+ | Grubun Gonderileri | `/groups/GRUP_ID/posts/` |
77
+
78
+ ### 1.5 Diger Onemli URL'ler
79
+
80
+ | Sayfa | URL |
81
+ |-------|-----|
82
+ | LinkedIn Learning | `/learning/` |
83
+ | Makale Yazma | `/article/new/` veya `/pulse/` |
84
+ | Haber Bulten Olustur | `/newsletters/` |
85
+ | Analitik | `/analytics/` |
86
+ | Creator Mode | `/in/KULLANICIADI/recent-activity/` |
87
+ | Hashtag Sayfasi | `/feed/hashtag/HASHTAG/` |
88
+
89
+ ---
90
+
91
+ ## 2. Bilinen Selector'lar ve aria-label Degerleri
92
+
93
+ LinkedIn, `data-testid` kullanmaz (X/Twitter'in aksine). Bunun yerine agirlikli olarak su nitelikleri kullanir:
94
+ - `aria-label` (en guvenilir)
95
+ - `class` (obfuscated olabilir, degisken)
96
+ - `role` (sabit)
97
+ - `data-control-name` (bazi butonlarda)
98
+ - `data-view-name` (bazi alanlarda)
99
+
100
+ **ONEMLI**: LinkedIn sinif adlari (class) cesitli build'lerde degisir. `artdeco-*` on ekli siniflar nispeten sabit kalir. Rastgele hash iceren siniflar (`rBknNMyP...` gibi) her deploy'da degisebilir ve guvenilmezdir.
101
+
102
+ ### 2.1 Ust Navigasyon (Header)
103
+
104
+ LinkedIn ust menusundeki ana butonlar:
105
+
106
+ ```
107
+ Selector: nav.global-nav
108
+ Icerik: Home, My Network, Jobs, Messaging, Notifications, Me, Business
109
+ ```
110
+
111
+ | Oge | Selector | Fallback |
112
+ |-----|----------|----------|
113
+ | Ana Sayfa | `a[href*='/feed/']` veya `li.global-nav__primary-item:nth-child(1) a` | `[data-control-name='nav.homepage']` |
114
+ | Agim | `a[href*='/mynetwork/']` | `[data-control-name='nav.mynetwork']` |
115
+ | Isler | `a[href*='/jobs/']` | `[data-control-name='nav.jobs']` |
116
+ | Mesajlar | `a[href*='/messaging/']` | `[data-control-name='nav.messaging']` |
117
+ | Bildirimler | `a[href*='/notifications/']` | `[data-control-name='nav.notifications']` |
118
+ | Profil Menusu | `button[class*='global-nav__primary-link-me']` | `.global-nav__me img` |
119
+ | Arama Kutusu | `input.search-global-typeahead__input` | `input[role='combobox'][aria-label]`, `input[placeholder*='Ara']`, `input[placeholder*='Search']` |
120
+
121
+ ### 2.2 Gonderi Olusturma
122
+
123
+ #### Feed'deki "Gonderi Baslat" Butonu
124
+
125
+ LinkedIn feed sayfasinda gonderi olusturmak icin ustteki kutucuk:
126
+
127
+ | Oge | Selector | Fallback |
128
+ |-----|----------|----------|
129
+ | "Gonderi baslat" alani | `.share-box-feed-entry__top-bar button` | `button[aria-label*='gonderi' i]`, `button[aria-label*='Start a post' i]`, `.share-box-feed-entry__trigger` |
130
+ | Foto Ekle butonu | `button[aria-label*='Foto']` | `button[aria-label*='Photo']`, `button[aria-label*='image' i]` |
131
+ | Video Ekle butonu | `button[aria-label*='Video']` | `button[aria-label*='video' i]` |
132
+ | Etkinlik butonu | `button[aria-label*='Etkinlik']` | `button[aria-label*='Event']` |
133
+ | Makale Yaz | `button[aria-label*='Makale']` | `button[aria-label*='article' i]` |
134
+
135
+ #### Gonderi Olusturma Modali (Share Box Modal)
136
+
137
+ Modal acildiktan sonra kullanilan selector'lar:
138
+
139
+ | Oge | Selector | Fallback |
140
+ |-----|----------|----------|
141
+ | Modal Konteyner | `div.share-box` | `div[role='dialog'][aria-label*='gonderi' i]`, `div[role='dialog'][aria-label*='post' i]`, `.artdeco-modal` |
142
+ | Metin Alani (Editor) | `div.ql-editor[role='textbox']` | `div[aria-label='Metin Duzenleyici']`, `div[aria-label='Text editor']`, `div[contenteditable='true'][role='textbox']`, `div[data-placeholder*='hakkinda' i]`, `div[data-placeholder*='want to talk' i]` |
143
+ | Gonderi Paylasma Butonu (Gonder) | `button.share-actions__primary-action` | `button[aria-label*='Gonderi paylas' i]`, `button[aria-label*='Post' i][type='submit']`, `.share-box__footer button.artdeco-button--primary` |
144
+ | Herkes Icin (Gorunurluk) | `button.share-creation__visibility-toggle` | `button[aria-label*='gorunurluk' i]`, `button[aria-label*='visibility' i]` |
145
+ | Medya Ekle | `button[aria-label*='Medya ekle' i]` | `button[aria-label*='Add media' i]`, `.share-creation-state__additional-toolbar button:first-child` |
146
+ | Belge Ekle | `button[aria-label*='Belge ekle' i]` | `button[aria-label*='Add a document' i]` |
147
+ | Anket Olustur | `button[aria-label*='Anket' i]` | `button[aria-label*='poll' i]` |
148
+ | Emoji Butonu | `button[aria-label*='Emoji' i]` | `.share-creation-state__additional-toolbar button[aria-label*='emoji' i]` |
149
+ | Hashtag Ekle | `button[aria-label*='Hashtag' i]` | `button[aria-label*='Add hashtag' i]` |
150
+ | Kapat (X) | `button[aria-label*='Kapat' i]` | `button[aria-label*='Dismiss' i]`, `button[aria-label*='Close' i]`, `.artdeco-modal__dismiss` |
151
+
152
+ #### Anket Olusturma (Post Modali Icinde)
153
+
154
+ | Oge | Selector |
155
+ |-----|----------|
156
+ | Soru Alani | `input[placeholder*='soru' i]` veya `input[placeholder*='question' i]` |
157
+ | Secenek 1 | `input[name='option-0']` veya `input[placeholder*='Secenek 1' i]` |
158
+ | Secenek 2 | `input[name='option-1']` veya `input[placeholder*='Secenek 2' i]` |
159
+ | Secenek Ekle | `button[aria-label*='secenek ekle' i]` |
160
+ | Anket Suresi | `select[aria-label*='sure' i]` veya `.poll-duration select` |
161
+
162
+ ### 2.3 Baglanti Islemleri (Connection)
163
+
164
+ #### Baglanti Onerisi Kartlari (/mynetwork/grow/)
165
+
166
+ | Oge | Selector | Fallback |
167
+ |-----|----------|----------|
168
+ | Oneri Karti | `.discover-entity-type-card` | `.discover-person-card`, `li[class*='discover']` |
169
+ | Baglanti Kur butonu | `button[aria-label*='baglanti' i]` | `button[aria-label*='Connect' i]`, `button[aria-label*='Invite' i]`, `button[data-control-name*='connect']` |
170
+ | Yoksay butonu | `button[aria-label*='Yoksay' i]` | `button[aria-label*='Dismiss' i]`, `button[aria-label*='Ignore' i]` |
171
+ | Kisi Adi | `.discover-entity-type-card .discover-person-card__name` | `.discover-entity-type-card a[href*='/in/']` |
172
+
173
+ **ONEMLI**: Baglanti butonu aria-label genelde kisinin adini icerir. Ornegin: `aria-label="Gorkem Yildiz ile baglanti kur"` veya `aria-label="Invite Gorkem Yildiz to connect"`. Bu yuzden belirli bir kisiye istek gondermek icin:
174
+ ```
175
+ button[aria-label*='KISI_ADI'][aria-label*='baglanti' i]
176
+ button[aria-label*='KISI_ADI'][aria-label*='Connect' i]
177
+ button[aria-label*='KISI_ADI'][aria-label*='Invite' i]
178
+ ```
179
+
180
+ #### Baglanti Istegi Modali
181
+
182
+ "Baglanti kur" butonuna tikladiktan sonra bazen bir modal acilir (ozellikle ortak bir kurum/okul yoksa):
183
+
184
+ | Oge | Selector | Fallback |
185
+ |-----|----------|----------|
186
+ | Modal | `div[role='dialog'][aria-label*='baglanti' i]` | `.send-invite`, `div[role='dialog'][aria-label*='connect' i]` |
187
+ | "Not ekle" butonu | `button[aria-label*='Not ekle' i]` | `button[aria-label*='Add a note' i]`, `.artdeco-modal button.artdeco-button--secondary` |
188
+ | Not Metin Alani | `textarea[name='message']` | `textarea#custom-message`, `textarea[placeholder*='not' i]`, `textarea[placeholder*='note' i]` |
189
+ | "Gonder" butonu | `button[aria-label*='Gonder' i]` | `button[aria-label*='Send' i]`, `.artdeco-modal button.artdeco-button--primary` |
190
+ | "Not olmadan gonder" | `button[aria-label*='notsuz' i]` | `button[aria-label*='Send without a note' i]`, `.artdeco-modal button.artdeco-button--primary` |
191
+
192
+ #### Davet Yonetimi (/mynetwork/invitation-manager/)
193
+
194
+ | Oge | Selector | Fallback |
195
+ |-----|----------|----------|
196
+ | Gelen Davetler Tab | `button[aria-label*='Gelen' i]` | `button[aria-label*='Received' i]` |
197
+ | Gonderilen Tab | `button[aria-label*='Gonderilen' i]` | `button[aria-label*='Sent' i]` |
198
+ | Kabul Et | `button[aria-label*='Kabul' i]` | `button[aria-label*='Accept' i]` |
199
+ | Reddet | `button[aria-label*='Yoksay' i]` | `button[aria-label*='Ignore' i]` |
200
+
201
+ ### 2.4 Tepkiler (Reactions)
202
+
203
+ LinkedIn'de bir gonderiye tepki verme. "Begen" butonuna hover yapildiginda (veya uzun basildiginda) tepki secenekleri gozukur.
204
+
205
+ | Oge | Selector | Fallback |
206
+ |-----|----------|----------|
207
+ | Begen butonu (varsayilan) | `button[aria-label*='begen' i]` | `button[aria-label*='like' i]`, `button[data-control-name='like']`, `.react-button__trigger` |
208
+ | Tepki Secenekleri Bar | `.reactions-menu` | `div[role='toolbar'][aria-label*='React' i]`, `.react-button__popup` |
209
+ | Begen (Like) | `button[aria-label*='Begen' i]` | `button[aria-label='Like' i]`, `.reactions-menu button:nth-child(1)` |
210
+ | Kutla (Celebrate) | `button[aria-label*='Kutla' i]` | `button[aria-label='Celebrate' i]`, `.reactions-menu button:nth-child(2)` |
211
+ | Destek (Support) | `button[aria-label*='Destek' i]` | `button[aria-label='Support' i]`, `.reactions-menu button:nth-child(3)` |
212
+ | Sev (Love) | `button[aria-label*='Sev' i]` | `button[aria-label='Love' i]`, `.reactions-menu button:nth-child(4)` |
213
+ | Bilgilendirici (Insightful) | `button[aria-label*='Bilgilendirici' i]` | `button[aria-label='Insightful' i]`, `.reactions-menu button:nth-child(5)` |
214
+ | Komik (Funny) | `button[aria-label*='Komik' i]` | `button[aria-label='Funny' i]`, `.reactions-menu button:nth-child(6)` |
215
+
216
+ **Tepki verme akisi:**
217
+ 1. Gonderi altindaki "Begen" butonunu bul
218
+ 2. Hover yap (mouse uzerine gotur) veya tiklayip basili tut
219
+ 3. Tepki secenekleri paneli belirir (yaklasik 500ms bekle)
220
+ 4. Istenen tepki butonuna tikla
221
+ 5. Sadece "Begen" icin direkt tek tikla yeterli
222
+
223
+ ### 2.5 Yorum Yapma (Comments)
224
+
225
+ | Oge | Selector | Fallback |
226
+ |-----|----------|----------|
227
+ | Yorum Yap butonu | `button[aria-label*='yorum' i]` | `button[aria-label*='comment' i]`, `button[data-control-name='comment']` |
228
+ | Yorum Alani | `div.ql-editor[data-placeholder*='yorum' i]` | `div[contenteditable='true'][aria-label*='yorum' i]`, `div[contenteditable='true'][aria-label*='comment' i]`, `.comments-comment-box__form div[contenteditable]` |
229
+ | Gonder butonu (yorum) | `button.comments-comment-box__submit-button` | `button[aria-label*='Yorum gonder' i]`, `button[aria-label*='Post comment' i]`, `.comments-comment-box__form button[type='submit']` |
230
+ | Yorum Listesi | `.comments-comments-list` | `div[data-view-name*='comment']` |
231
+ | Tek Yorum | `.comments-comment-item` | `article.comments-comment-item` |
232
+
233
+ ### 2.6 Paylasma (Share/Repost)
234
+
235
+ | Oge | Selector | Fallback |
236
+ |-----|----------|----------|
237
+ | Yeniden Paylas butonu | `button[aria-label*='yeniden paylas' i]` | `button[aria-label*='repost' i]`, `button[aria-label*='share' i]`, `button[data-control-name='share']` |
238
+ | Aninda Yeniden Paylas | `button[aria-label*='Aninda' i]` veya menu icinde ilk secenek | `li:first-child button` (share menusu icinde) |
239
+ | Dusuncelerinle Paylas | menu icinde ikinci secenek | alinti gonderi modali acar |
240
+
241
+ ### 2.7 Profil Sayfasi Aksiyonlari (/in/USERNAME/)
242
+
243
+ | Oge | Selector | Fallback |
244
+ |-----|----------|----------|
245
+ | Takip Et butonu | `button[aria-label*='Takip' i]` | `button[aria-label*='Follow' i]`, `button[data-control-name='follow']` |
246
+ | Baglanti Kur butonu | `button[aria-label*='baglanti kur' i]` | `button[aria-label*='Connect' i]`, `.pv-top-card-v2-ctas button[aria-label*='connect' i]` |
247
+ | Mesaj Gonder butonu | `button[aria-label*='Mesaj' i]` | `button[aria-label*='Message' i]`, `button[data-control-name='message']` |
248
+ | Daha Fazla butonu | `button[aria-label*='Daha fazla' i]` | `button[aria-label*='More actions' i]`, `.pv-top-card-v2-ctas button[aria-label*='more' i]` |
249
+ | Profil Resmi | `.pv-top-card-profile-picture img` | `img.presence-entity__image`, `.profile-photo-edit img` |
250
+ | Isim | `h1.text-heading-xlarge` | `.pv-top-card--list li:first-child`, `h1[class*='inline']` |
251
+ | Baslik (Headline) | `.text-body-medium` (ismin altinda) | `.pv-top-card--list .text-body-medium` |
252
+ | Konum | `.pv-top-card--list .text-body-small:last-child` | `span[class*='location']` |
253
+ | Hakkinda Bolumu | `section[data-view-name='profile-card'] div.pv-about__summary-text` | `#about ~ .display-flex` |
254
+
255
+ ### 2.8 Mesajlasma (Messaging)
256
+
257
+ | Oge | Selector | Fallback |
258
+ |-----|----------|----------|
259
+ | Yeni Mesaj butonu | `button[aria-label*='Yeni mesaj' i]` | `button[aria-label*='Compose message' i]`, `.msg-overlay-bubble-header button` |
260
+ | Alici Alani | `input[aria-label*='Alici' i]` | `input[aria-label*='Type a name' i]`, `.msg-compose__header-input input` |
261
+ | Mesaj Alani | `div.msg-form__contenteditable[role='textbox']` | `div[contenteditable='true'][aria-label*='mesaj' i]`, `div[contenteditable='true'][aria-label*='Write a message' i]`, `.msg-form__message-texteditor div[contenteditable]` |
262
+ | Gonder butonu | `button.msg-form__send-button` | `button[aria-label*='Gonder' i]`, `button[aria-label*='Send' i]`, `.msg-form__send-btn` |
263
+ | Dosya Ekle | `button[aria-label*='Dosya ekle' i]` | `button[aria-label*='Attach a file' i]` |
264
+ | Emoji (mesaj) | `button[aria-label*='Emoji' i]` (mesaj formunda) | `.msg-form__footer button[aria-label*='emoji' i]` |
265
+ | Mesaj Listesi | `.msg-conversations-container` | `.msg-thread` |
266
+ | Tek Mesaj Oge | `.msg-s-event-listitem` | `.msg-s-message-list__event` |
267
+
268
+ #### Mini Mesaj Kutusu (Sag Alt)
269
+
270
+ LinkedIn'de sag alt kosede kucuk mesajlasma penceresi acilabilir:
271
+
272
+ | Oge | Selector |
273
+ |-----|----------|
274
+ | Mini Pencere | `.msg-overlay-conversation-bubble` |
275
+ | Kucult | `button[aria-label*='Kucult' i]` veya `button[aria-label*='Minimize' i]` |
276
+ | Kapat | `.msg-overlay-bubble-header button[aria-label*='Kapat' i]` |
277
+
278
+ ### 2.9 Is Ilanlari (Jobs)
279
+
280
+ | Oge | Selector | Fallback |
281
+ |-----|----------|----------|
282
+ | Is Ara kutusu | `input[aria-label*='anahtar kelime' i]` | `input[aria-label*='Search by title' i]`, `.jobs-search-box__input` |
283
+ | Konum kutusu | `input[aria-label*='Konum' i]` | `input[aria-label*='City' i]`, `.jobs-search-box__location input` |
284
+ | Ara butonu | `button[aria-label*='Ara' i]` (jobs icinde) | `.jobs-search-box__submit-button` |
285
+ | Kolay Basvuru | `button[aria-label*='Kolay Basvuru' i]` | `button[aria-label*='Easy Apply' i]`, `.jobs-apply-button` |
286
+ | Kaydet | `button[aria-label*='Kaydet' i]` | `button[aria-label*='Save' i]`, `button[data-control-name='save']` |
287
+ | Is Karti | `.job-card-container` | `.jobs-search-results__list-item` |
288
+
289
+ ### 2.10 Feed Gonderileri
290
+
291
+ | Oge | Selector | Fallback |
292
+ |-----|----------|----------|
293
+ | Gonderi Konteyneri | `.feed-shared-update-v2` | `div[data-urn*='activity']`, `div[data-id*='urn:li:activity']` |
294
+ | Gonderi Metni | `.feed-shared-text` | `.feed-shared-update-v2 .break-words span[dir='ltr']` |
295
+ | Gonderi Gorseli | `.feed-shared-image img` | `.feed-shared-update-v2 img[loading='lazy']` |
296
+ | Gonderi Video | `.feed-shared-external-video` | `video`, `.feed-shared-linkedin-video` |
297
+ | Gonderi Belgesi | `.feed-shared-document` | `.feed-shared-update-v2 .document-viewer` |
298
+ | Uc Nokta Menusu | `button[aria-label*='menu' i]` (gonderi icinde) | `.feed-shared-control-menu button`, `button[aria-label*='daha fazla' i]` (gonderi kartinda) |
299
+ | Gonderiyi Raporla | `.feed-shared-control-menu li button` (menu acilinca) | |
300
+ | Gonder Sahibi Adi | `.feed-shared-actor__title` | `.update-components-actor__name` |
301
+
302
+ ---
303
+
304
+ ## 3. Tum Etkilesimler (Interactions)
305
+
306
+ ### 3.1 Gonderi Paylasma (Post Olusturma)
307
+
308
+ #### 3.1.1 Metin Gonderi
309
+
310
+ **Adimlar:**
311
+ 1. `/feed/` sayfasina git
312
+ 2. "Gonderi baslat" butonuna tikla
313
+ 3. Modal acilmasini bekle (2-3 saniye)
314
+ 4. `div.ql-editor` icerisine metni yaz
315
+ 5. "Gonderi paylas" / "Post" butonuna tikla
316
+ 6. Gonderinin yayinlanmasini bekle (3 saniye)
317
+
318
+ **Dikkat:**
319
+ - Metin alani `contenteditable` bir div'dir, normal input degildir
320
+ - `type` action'i ile yazilirken Playwright'in `fill()` metodu bazen calismayabilir, `pressSequentially()` veya `keyboard.type()` tercih edilmeli
321
+ - LinkedIn Turkce arayuzde "Gonderi paylas", Ingilizce arayuzde "Post" yazar
322
+
323
+ #### 3.1.2 Gorsel Gonderi
324
+
325
+ **Adimlar:**
326
+ 1. Gonderi modalini ac (3.1.1 adim 1-3)
327
+ 2. "Medya ekle" / "Foto ekle" butonuna tikla
328
+ 3. Dosya secici (file input) acilir: `input[type='file']` (gizli, `setInputFiles()` ile kullan)
329
+ 4. Gorsel yuklenmesini bekle (5-10 saniye, boyuta bagli)
330
+ 5. Opsiyonel: Alt metin ekle
331
+ 6. Metni yaz ve paylas
332
+
333
+ **Dikkat:**
334
+ - Birden fazla gorsel yuklenebilir (max 9 adet standart, karusel icin daha fazla)
335
+ - `input[type='file']` elementi gorunmezdir, Playwright `setInputFiles()` ile erisim saglanir
336
+ - Dosya yukleme sirasinda progress bar gorulur
337
+
338
+ #### 3.1.3 Video Gonderi
339
+
340
+ **Adimlar:**
341
+ 1. Gonderi modalini ac
342
+ 2. "Video" butonuna tikla
343
+ 3. Dosya secici ile video dosyasini sec
344
+ 4. Yukleme ve isleme bekle (30+ saniye olabilir)
345
+ 5. Opsiyonel: Altyazi ekle
346
+ 6. Metni yaz ve paylas
347
+
348
+ **Kisitlar:**
349
+ - Maks dosya boyutu: 5GB
350
+ - Maks sure: 15 dakika (normal kullanicilar), 30 dakika (LinkedIn Live)
351
+ - Desteklenen formatlar: MP4, MOV, AVI, MPEG
352
+ - Isleme suresi uzun olabilir
353
+
354
+ #### 3.1.4 Belge Gonderi (Document/Carousel)
355
+
356
+ **Adimlar:**
357
+ 1. Gonderi modalini ac
358
+ 2. "Belge ekle" butonuna tikla
359
+ 3. PDF, PPT veya DOC dosyasi sec
360
+ 4. Belge basligini yaz
361
+ 5. Metni yaz ve paylas
362
+
363
+ **Dikkat:**
364
+ - PDF en iyi format (carousel/slider olarak gosterilir)
365
+ - Maks 300 sayfa, maks 100MB
366
+
367
+ #### 3.1.5 Anket (Poll)
368
+
369
+ **Adimlar:**
370
+ 1. Gonderi modalini ac
371
+ 2. "Anket" butonuna tikla
372
+ 3. Soru metnini yaz
373
+ 4. En az 2, en fazla 4 secenek gir
374
+ 5. Anket suresini sec (1 gun, 3 gun, 1 hafta, 2 hafta)
375
+ 6. "Bitti" / "Done" tikla
376
+ 7. Opsiyonel gonderi metni ekle ve paylas
377
+
378
+ ### 3.2 Baglanti Istegi Gonderme
379
+
380
+ #### 3.2.1 Oneri Sayfasindan (/mynetwork/grow/)
381
+
382
+ **Adimlar:**
383
+ 1. `/mynetwork/grow/` sayfasina git
384
+ 2. Sayfanin yuklenmesini bekle (3 saniye)
385
+ 3. Hedef kisinin kartindaki "Baglanti kur" butonuna tikla
386
+ 4. Eger modal acilirsa:
387
+ a. "Not ekle" butonuna tikla (opsiyonel)
388
+ b. Not metnini yaz
389
+ c. "Gonder" butonuna tikla
390
+ 5. Eger modal acilmazsa: istek direkt gonderilir (ortak kurum/okul varsa)
391
+
392
+ #### 3.2.2 Profil Sayfasindan
393
+
394
+ **Adimlar:**
395
+ 1. `/in/KULLANICIADI/` sayfasina git
396
+ 2. "Baglanti kur" / "Connect" butonuna tikla
397
+ 3. Modal islemlerini yap (3.2.1 adim 4 ile ayni)
398
+
399
+ **Dikkat:**
400
+ - Bazi profillerde "Connect" yerine "Follow" butonu gorunur (creator mode aciksa)
401
+ - Bu durumda "Daha fazla" > "Baglanti kur" yolunu izle
402
+ - 3. derece ve uzerindeki kisilere istek gonderirken LinkedIn genellikle not veya e-posta ister
403
+
404
+ ### 3.3 Mesaj Gonderme
405
+
406
+ #### 3.3.1 Mesajlasma Sayfasindan
407
+
408
+ **Adimlar:**
409
+ 1. `/messaging/` sayfasina git
410
+ 2. "Yeni mesaj" butonuna tikla
411
+ 3. Alici alanina isim yaz
412
+ 4. Autocomple listesinden kisiyi sec
413
+ 5. Mesaj alanina metni yaz
414
+ 6. "Gonder" butonuna tikla
415
+
416
+ #### 3.3.2 Profil Sayfasindan
417
+
418
+ **Adimlar:**
419
+ 1. `/in/KULLANICIADI/` sayfasina git
420
+ 2. "Mesaj" butonuna tikla
421
+ 3. Sag altta mini mesaj kutusu acilir
422
+ 4. Mesaj alanina metni yaz
423
+ 5. "Gonder" butonuna tikla
424
+
425
+ **Dikkat:**
426
+ - Sadece 1. derece baglantilara ucretsiz mesaj gonderilebilir
427
+ - 2. ve 3. derece icin InMail (premium) gerekir
428
+ - Grup uyeleri ve etkinlik katilimcilarina da mesaj gonderilebilir
429
+
430
+ ### 3.4 Yorum Yapma
431
+
432
+ **Adimlar:**
433
+ 1. Gonderiyi bul (feed'de veya direkt URL ile)
434
+ 2. "Yorum" butonuna tikla
435
+ 3. Yorum alani gorunur (contenteditable div)
436
+ 4. Metni yaz
437
+ 5. "Gonder" / "Post" butonuna tikla
438
+
439
+ **Dikkat:**
440
+ - Yorum alani da Quill editor kullanir (contenteditable)
441
+ - Mention yapma: "@" yazinca oneri listesi cikar
442
+ - Hashtag: "#" ile basla
443
+
444
+ ### 3.5 Tepki Verme (Reaction)
445
+
446
+ **Basit Begeni:**
447
+ 1. Gonderinin altindaki "Begen" butonuna tikla (tek tikla)
448
+
449
+ **Diger Tepkiler:**
450
+ 1. "Begen" butonunun uzerine gelin (hover) veya basili tutun
451
+ 2. Tepki paneli belirmesini bekleyin (~500ms)
452
+ 3. Istenen tepkiye tiklayin
453
+
454
+ ### 3.6 Yeniden Paylasma (Repost)
455
+
456
+ **Adimlar:**
457
+ 1. "Yeniden paylas" butonuna tikla
458
+ 2. Menu acilir:
459
+ - "Aninda yeniden paylas" - Direkt paylasir
460
+ - "Dusuncelerinizle paylasin" - Modal acar, yorum ekleyerek paylasir
461
+ 3. Secim yapip tikla
462
+
463
+ ### 3.7 Sirket Takip Etme
464
+
465
+ **Adimlar:**
466
+ 1. `/company/SIRKET_ADI/` sayfasina git
467
+ 2. "Takip et" / "Follow" butonuna tikla
468
+
469
+ | Oge | Selector |
470
+ |-----|----------|
471
+ | Takip Et | `button[aria-label*='Takip' i]` veya `button[aria-label*='Follow' i]` |
472
+
473
+ ### 3.8 Gruba Katilma
474
+
475
+ **Adimlar:**
476
+ 1. `/groups/GRUP_ID/` sayfasina git
477
+ 2. "Katil" / "Join" butonuna tikla
478
+ 3. Bazi gruplar onay gerektirir (bekleme sureci)
479
+
480
+ ### 3.9 Is Basvurusu
481
+
482
+ **Adimlar:**
483
+ 1. Is ilanini ac
484
+ 2. "Kolay Basvuru" veya "Basvur" butonuna tikla
485
+ 3. Basvuru formu acilir (multi-step olabilir)
486
+ 4. Gerekli alanlari doldur
487
+ 5. "Gonder" / "Submit" tikla
488
+
489
+ **Dikkat:**
490
+ - "Kolay Basvuru" LinkedIn uzerinden yapilir
491
+ - "Basvur" dis siteye yonlendirir
492
+ - Ozgecmis yuklemek gerekebilir
493
+
494
+ ---
495
+
496
+ ## 4. Gorsel Boyutlari
497
+
498
+ LinkedIn'de kullanilan tum gorsel boyutlari ve onerileri:
499
+
500
+ ### 4.1 Gonderi Gorselleri
501
+
502
+ | Tur | Boyut (px) | En-Boy Orani | Dosya Boyutu |
503
+ |-----|-----------|--------------|-------------|
504
+ | Tekli Gorsel (Yatay) | 1200 x 627 | 1.91:1 | Maks 10MB |
505
+ | Tekli Gorsel (Kare) | 1200 x 1200 | 1:1 | Maks 10MB |
506
+ | Tekli Gorsel (Dikey) | 1080 x 1350 | 4:5 | Maks 10MB |
507
+ | Carousel Slayt | 1080 x 1080 veya 1080 x 1350 | 1:1 veya 4:5 | PDF: maks 100MB |
508
+ | Link Onizleme Gorseli | 1200 x 627 | 1.91:1 | Otomatik cekilir |
509
+
510
+ ### 4.2 Profil Gorselleri
511
+
512
+ | Tur | Boyut (px) | Aciklama |
513
+ |-----|-----------|----------|
514
+ | Profil Fotografi | 400 x 400 | Minimum 200x200, daire olarak kirpilir |
515
+ | Arka Plan Fotografi (Banner) | 1584 x 396 | Kapak gorseli |
516
+
517
+ ### 4.3 Sirket Sayfasi Gorselleri
518
+
519
+ | Tur | Boyut (px) | Aciklama |
520
+ |-----|-----------|----------|
521
+ | Sirket Logosu | 300 x 300 | Kare format |
522
+ | Sirket Kapak Gorseli | 1128 x 191 | Yatay banner |
523
+ | Sirket Hayat Sekmesi | 900 x 600 | Hayat sekmesi hero gorseli |
524
+ | Sirket Hayat Modulu | 264 x 176 | Kucuk kare gorseller |
525
+
526
+ ### 4.4 Diger Gorseller
527
+
528
+ | Tur | Boyut (px) |
529
+ |-----|-----------|
530
+ | Etkinlik Kapak | 1776 x 444 |
531
+ | Haber Bulteni Kapak | 744 x 400 |
532
+ | Makale Kapak | 744 x 400 |
533
+ | Grup Logosu | 400 x 400 |
534
+ | Grup Kapak | 1776 x 444 |
535
+
536
+ ### 4.5 Video Ozellikleri
537
+
538
+ | Ozellik | Deger |
539
+ |---------|-------|
540
+ | Minimum Cozunurluk | 256 x 144 |
541
+ | Maksimum Cozunurluk | 4096 x 2304 (4K) |
542
+ | Onerilen Cozunurluk | 1920 x 1080 (1080p) |
543
+ | Maks Dosya Boyutu | 5 GB |
544
+ | Maks Sure | 15 dakika |
545
+ | Desteklenen Formatlar | MP4, MOV, AVI, MKV |
546
+ | Onerilen FPS | 30 |
547
+ | Onerilen Bit Rate | 5 Mbps (1080p) |
548
+
549
+ ---
550
+
551
+ ## 5. Hiz Sinirlari (Rate Limiting)
552
+
553
+ LinkedIn, otomasyon ve spam'e karsi katı sinirlar uygular. Bu sinirlar hesap turune, hesap yasina ve aktivite gecmisine gore degisir.
554
+
555
+ ### 5.1 Baglanti Istegi Sinirlari
556
+
557
+ | Metrik | Sinir | Notlar |
558
+ |--------|-------|--------|
559
+ | Haftalik baglanti istegi | ~100-200 | Hesap yasina ve ture gore degisir |
560
+ | Gunluk baglanti istegi | ~20-25 | Guvenli sinir |
561
+ | Not ekli baglanti istegi | Daha az kisitlama | LinkedIn not eklenmis istekleri tercih eder |
562
+ | Notsuz baglanti istegi | Daha katı sinir | Cok hizli notsuz istek ban sebebi |
563
+ | Bekleyen istek limiti | ~1000 | Cevapsiz istekler bu limite dahil |
564
+
565
+ **Guvenli pratik:** Gunde 10-15 baglanti istegi, aralarinda 30-60 saniye bekleme. Haftada 70'i gecme.
566
+
567
+ ### 5.2 Mesaj Sinirlari
568
+
569
+ | Metrik | Sinir |
570
+ |--------|-------|
571
+ | Gunluk mesaj (1. derece) | ~100-150 |
572
+ | Aylik InMail (Premium) | 5-30 (plana bagli) |
573
+ | Grup mesaji | Sinirli (spam koruması) |
574
+ | Toplu mesaj (broadcast) | Maks 50 alici |
575
+
576
+ **Guvenli pratik:** Gunde 20-30 mesaj, aralarinda 45-90 saniye bekleme.
577
+
578
+ ### 5.3 Arama Sinirlari
579
+
580
+ | Metrik | Sinir |
581
+ |--------|-------|
582
+ | Ucretsiz hesap aylik arama | ~300 profil goruntulemesi |
583
+ | Ticari kullanim siniri | ~100 arama/ay sonrasi uyari |
584
+ | Sales Navigator | Sinir yuksek ama mevcut |
585
+ | Arama sonuc sayfasi | Maks 100 sayfa (1000 sonuc) |
586
+
587
+ **Dikkat:** "Ticari kullanim siniri" uyarisi goruldugunde aramalar kisitlanir. Bu sinir ay sonunda sifirlanir.
588
+
589
+ ### 5.4 Profil Goruntulemesi
590
+
591
+ | Metrik | Sinir |
592
+ |--------|-------|
593
+ | Gunluk profil goruntulemesi | ~80-150 |
594
+ | Saatlik profil goruntulemesi | ~20-30 |
595
+ | Anonim goruntuleme | Profil ayarlarindan acilamadiginda sinir daha dusuk |
596
+
597
+ **Guvenli pratik:** Saatte 10-15 profil, gunluk maks 80.
598
+
599
+ ### 5.5 Gonderi ve Yorum Sinirlari
600
+
601
+ | Metrik | Sinir |
602
+ |--------|-------|
603
+ | Gunluk gonderi | ~20-30 (pratik sinir ~3-5 kaliteli gonderi) |
604
+ | Gunluk yorum | ~50-100 |
605
+ | Saatlik yorum | ~15-20 |
606
+ | Gunluk tepki (reaction) | ~100-200 |
607
+
608
+ ### 5.6 Takip Sinirlari
609
+
610
+ | Metrik | Sinir |
611
+ |--------|-------|
612
+ | Gunluk takip | ~50-100 |
613
+ | Toplam takip | 30.000 (kisi + sirket + hashtag) |
614
+
615
+ ---
616
+
617
+ ## 6. Anti-Bot Algilama ve Guvenli Pratikler
618
+
619
+ LinkedIn, tum sosyal medya platformlari arasinda en agresif bot algilama sistemine sahiptir. Asagida bilinen tetikleyiciler ve guvenli pratikler detayli olarak aciklanmistir.
620
+
621
+ ### 6.1 Bilinen Tetikleyiciler (Triggers)
622
+
623
+ #### 6.1.1 Hiz Kaynakli Tetikleyiciler
624
+ - **Cok hizli sayfa gecisleri:** 3 saniyeden kisa surede sayfalar arasi gezinme
625
+ - **Aninda islem:** Sayfa acilir acilmaz tiklama (insanlar en az 1-2 saniye bakar)
626
+ - **Toplu islem hizi:** Art arda 10+ baglanti istegi gondermek (aralarinda bekleme olmadan)
627
+ - **Klavye hizi:** Insanustu hizda yazma (300+ WPM)
628
+ - **Surekli aktivite:** Mola vermeden saatlerce islem yapma
629
+
630
+ #### 6.1.2 Desen Kaynakli Tetikleyiciler
631
+ - **Tekrarlayan eylemler:** Ayni islemi mekanik sekilde tekrarlama (tikla-bekle-tikla-bekle)
632
+ - **Dogal olmayan navigasyon:** URL'ye direkt gitme yerine navigasyon menu kullanmamak
633
+ - **Belirli saatlerde calisma:** Gece 3'te yogun aktivite
634
+ - **Ayni mesaj kopyala-yapistir:** Birebir ayni metni birden fazla kisiye gonderme
635
+ - **Mouse hareketi eksikligi:** Tiklamadan once mouse hareketi olmamasi
636
+
637
+ #### 6.1.3 Teknik Tetikleyiciler
638
+ - **navigator.webdriver = true:** Selenium/Playwright varsayilan olarak bunu `true` yapar
639
+ - **Headless browser kullnimi:** Headless mod algilanabilir
640
+ - **Chrome DevTools acik:** CDP baglantisi izlenebilir (ancak nadiren)
641
+ - **WebGL/Canvas fingerprinting:** Bot browser'lar farkli fingerprint verir
642
+ - **User-Agent tutarsizligi:** Platform bilgisi ile browser ozellikleri uyusmamasi
643
+ - **Automation flag'leri:** `--enable-automation`, `--remote-debugging-port` gibi flag'ler
644
+
645
+ #### 6.1.4 Hesap Kaynakli Tetikleyiciler
646
+ - **Yeni hesap + yogun aktivite:** Yeni hesaplarda sinirlar cok daha dusuk
647
+ - **Dusuk kabul orani:** Baglanti isteklerinin cogu reddediliyorsa
648
+ - **Cok sayida rapor:** Diger kullanicilarin hesabi raporlamasi
649
+ - **Profil eksikligi:** Foto, baslik, deneyim olmayan hesaplardan gelen istekler
650
+
651
+ ### 6.2 LinkedIn'in Algilama Mekanizmalari
652
+
653
+ 1. **CAPTCHA/Dogrulama:** Suphe durumunda e-posta veya telefon dogrulamasi ister
654
+ 2. **Gecici Kisitlama:** "Hesabiniz gecici olarak kisitlandi" mesaji (1-7 gun)
655
+ 3. **Kalici Kisitlama:** Belirli ozelliklerin kapatilmasi (baglanti istegi gonderme, mesajlasma)
656
+ 4. **Hesap Askiya Alma:** Ciddi ihlallerde hesap tamamen askiya alinir
657
+ 5. **Kalici Ban:** Tekrarlayan ihlallerde hesap silinir
658
+
659
+ ### 6.3 Guvenli Otomasyon Pratikleri
660
+
661
+ #### 6.3.1 Browser Ayarlari
662
+
663
+ ```
664
+ Zorunlu:
665
+ - navigator.webdriver = false (Object.defineProperty ile override)
666
+ - --disable-blink-features=AutomationControlled
667
+ - --enable-automation flag'ini KALDIRMAK
668
+ - Gercek Chrome profili kullan (cookie'ler, gecmis, yer imleri dahil)
669
+ - Headless mod KULLANMA, headed mod kullan
670
+ - Gercek User-Agent (profildeki Chrome versiyonuyla uyumlu)
671
+ ```
672
+
673
+ Bu proje zaten CDP ile gercek Chrome profiline baglanir, bu da en guvenli yaklasimdir. `--enable-automation` flag'i kaldirilir ve `webdriver` property'si override edilir.
674
+
675
+ #### 6.3.2 Zamanlama
676
+
677
+ ```
678
+ Eylemler arasi bekleme:
679
+ - Sayfa yukleme sonrasi: 2-5 saniye (rastgele)
680
+ - Tiklama oncesi: 0.5-2 saniye (rastgele)
681
+ - Yazma hizi: 50-150ms per character (insan benzeri)
682
+ - Islemler arasi: 15-60 saniye (rastgele)
683
+ - Toplu islemler arasi: 30-120 saniye (rastgele)
684
+ - Oturum suresi: Maks 30-45 dakika, sonra mola
685
+ - Gunluk toplam: Maks 2-3 saat aktif kullanim
686
+ ```
687
+
688
+ **Rastgelelik onemli:** Sabit bekleme sureleri (ornegin her seferinde tam 5 saniye) bot gibi gorunur. Her zaman rastgele bir aralikta bekleme yap.
689
+
690
+ #### 6.3.3 Insan Benzeri Davranislar
691
+
692
+ - **Scroll yap:** Sayfayi yukari-asagi kaydir (gercek kullanicilar boyle yapar)
693
+ - **Profillere bak:** Baglanti istegi gondermeden once profili 3-5 saniye incele
694
+ - **Farkli islemler yap:** Sadece baglanti istegi degil, ara sira gonderi oku, yorum yap, begen
695
+ - **Organik navigasyon:** Bazen URL yerine menu butonlariyla gezin
696
+ - **Mouse hareketi:** Tiklanacak ogeden once baska yerlere de mouse gotur (Playwright'ta `page.mouse.move()`)
697
+
698
+ #### 6.3.4 Hacim Sinirlari (Gunluk Guvenli Limitler)
699
+
700
+ | Islem | Guvenli Gunluk Sinir | Maks (riskli) |
701
+ |-------|----------------------|--------------|
702
+ | Baglanti istegi | 10-15 | 25 |
703
+ | Mesaj gonderme | 15-25 | 50 |
704
+ | Profil goruntuleme | 40-60 | 100 |
705
+ | Gonderi begeni | 30-50 | 100 |
706
+ | Yorum yapma | 10-20 | 40 |
707
+ | Gonderi paylasma | 2-3 | 5 |
708
+
709
+ #### 6.3.5 Uyari Isaretleri ve Tepkiler
710
+
711
+ **"Dogrulama gerekli" ekrani goruldugunde:**
712
+ 1. Islemi HEMEN durdur
713
+ 2. Kullanicinin manuel dogrulama yapmasini bekle
714
+ 3. En az 24 saat aktiviteyi azalt
715
+ 4. Sonraki gunlerde sinirlari %50 dusur
716
+
717
+ **"Gecici kisitlama" mesaji goruldugunde:**
718
+ 1. Tum otomasyonu DURDUR
719
+ 2. 24-48 saat bekle
720
+ 3. Kisitlama kalktiktan sonra yavas baslat (normal sinirlarin %25'i ile)
721
+ 4. 1 hafta icinde kademeli olarak normal seviyeye don
722
+
723
+ ### 6.4 LinkedIn'in Cookie ve Oturum Yonetimi
724
+
725
+ LinkedIn su onemli cookie'leri kullanir:
726
+
727
+ | Cookie | Aciklama |
728
+ |--------|----------|
729
+ | `li_at` | Ana oturum cookie'si (authentication) |
730
+ | `JSESSIONID` | CSRF token iceren oturum ID'si |
731
+ | `bcookie` | Browser cookie (fingerprinting) |
732
+ | `bscookie` | Guvenli browser cookie |
733
+ | `li_rm` | "Beni hatirla" cookie'si |
734
+ | `lang` | Dil tercihi (v=2&lang=tr) |
735
+ | `lidc` | LinkedIn DC routing cookie |
736
+ | `UserMatchHistory` | Reklam hedefleme |
737
+ | `li_sugr` | Oneri motoru |
738
+
739
+ **ONEMLI:** `JSESSIONID` cookie'si CSRF korumasinda kullanilir. API istekleri yaparken `csrf-token` header'i olarak bu degerin tirnak icindeki kismi gonderilmelidir. Ancak browser otomasyon icin bu genellikle otomatik yonetilir.
740
+
741
+ ---
742
+
743
+ ## 7. Modal ve Dialog'lar
744
+
745
+ ### 7.1 Gonderi Olusturma Modali
746
+
747
+ **Tetikleyici:** Feed'deki "Gonderi baslat" butonuna tiklandiginda acilir.
748
+
749
+ **Yapisi:**
750
+ ```
751
+ div.artdeco-modal (overlay)
752
+ └── div.artdeco-modal__content
753
+ ├── header (Profil resmi + gorunurluk)
754
+ ├── div.ql-editor (metin editoru, contenteditable)
755
+ ├── ek icerik alani (gorsel/video/belge onizleme)
756
+ └── footer
757
+ ├── arac cubugu (emoji, hashtag, medya ekle butonlari)
758
+ └── "Gonderi paylas" butonu
759
+ ```
760
+
761
+ **Modal Selector:**
762
+ - `div[role='dialog']` (birden fazla dialog olabilir, ayirt etmek icin `aria-label` kontrol et)
763
+ - `.artdeco-modal--layer-default` veya `.share-box`
764
+ - Kapatma: `button[aria-label*='Kapat' i]` veya `.artdeco-modal__dismiss`
765
+
766
+ ### 7.2 Baglanti Istegi Modali
767
+
768
+ **Tetikleyici:** "Baglanti kur" butonuna tiklandiginda (ortak kurum/okul yoksa veya email gerekiyorsa).
769
+
770
+ **Yapisi:**
771
+ ```
772
+ div.artdeco-modal
773
+ └── div.artdeco-modal__content
774
+ ├── header ("Davet nasil gonderilsin?" veya "Kisinin e-postasini girin")
775
+ ├── icerik
776
+ │ ├── "E-posta" input (bazen)
777
+ │ └── "Not ekle" butonu (bazen)
778
+ └── footer
779
+ ├── "Gonder" butonu (birincil)
780
+ └── "Iptal" butonu (ikincil)
781
+ ```
782
+
783
+ **Senaryo 1 - Direkt gonderim:**
784
+ Baglanti butona tikla → Istek hemen gider, modal acilmaz.
785
+
786
+ **Senaryo 2 - Not ekleme modali:**
787
+ Baglanti butona tikla → Modal acilir → "Not ekle" → Textarea gorulur → Yaz → "Gonder"
788
+
789
+ **Senaryo 3 - E-posta gerekli:**
790
+ Baglanti butona tikla → Modal acilir → E-posta input → Yaz → "Gonder"
791
+
792
+ ### 7.3 Mesaj Dialogu
793
+
794
+ **Tetikleyici:** "Mesaj" butonuna tiklandiginda (profil sayfasi veya mesajlasma).
795
+
796
+ **Turu:** Tam sayfa (messaging sayfasindan) veya mini popup (sag altta).
797
+
798
+ **Mini Popup Yapisi:**
799
+ ```
800
+ div.msg-overlay-conversation-bubble
801
+ ├── header (kisi adi, kucult/kapat butonlari)
802
+ ├── mesaj gecmisi
803
+ └── form
804
+ ├── div[contenteditable] (mesaj alani)
805
+ └── button (gonder)
806
+ ```
807
+
808
+ **Tam Sayfa Yapisi:**
809
+ ```
810
+ div.msg-thread
811
+ ├── header (kisi bilgisi)
812
+ ├── mesaj listesi (.msg-s-event-listitem)
813
+ └── form.msg-form
814
+ ├── div.msg-form__contenteditable (mesaj alani)
815
+ ├── ek araclar (dosya, emoji, gif)
816
+ └── button.msg-form__send-button (gonder)
817
+ ```
818
+
819
+ ### 7.4 Onay Dialoglari
820
+
821
+ LinkedIn cesitli islemlerde onay dialogu gosterir:
822
+
823
+ | Durum | Dialog Icerigi | Butonlar |
824
+ |-------|---------------|----------|
825
+ | Gonderi silme | "Gonderiyi silmek istediginizden emin misiniz?" | "Sil" / "Iptal" |
826
+ | Baglanti koparma | "Baglantiyi kaldirmak istediginizden emin misiniz?" | "Kaldir" / "Iptal" |
827
+ | Mesaj silme | "Bu mesaji silmek istediginizden emin misiniz?" | "Sil" / "Iptal" |
828
+ | Istegi geri cekme | "Daveti geri cekmek istediginizden emin misiniz?" | "Geri cek" / "Iptal" |
829
+
830
+ **Genel onay dialog selector'lari:**
831
+ - `div[role='alertdialog']` veya `div[role='dialog']`
832
+ - Onay butonu: `.artdeco-modal button.artdeco-button--primary`
833
+ - Iptal butonu: `.artdeco-modal button.artdeco-button--secondary`
834
+
835
+ ### 7.5 Gorunurluk Secici Modali
836
+
837
+ Gonderi olusturma sirasinda "Herkes" butonuna tiklandiginda:
838
+
839
+ | Secenek | Aciklama |
840
+ |---------|----------|
841
+ | Herkes (Anyone) | Herkese acik |
842
+ | Yalnizca Baglantilar (Connections only) | Sadece 1. derece |
843
+ | Grup Uyeleri | Belirli bir gruba ozel |
844
+
845
+ ### 7.6 Rapor/Sikayet Modali
846
+
847
+ Gonderinin uc nokta menusunden "Raporla" secildiginde:
848
+ - Cok adimli form
849
+ - Neden secimi (spam, yaniltici, uygunsuz icerik vb.)
850
+ - Opsiyonel aciklama
851
+
852
+ ### 7.7 Yaygin Overlay'ler ve Popup'lar
853
+
854
+ | Overlay | Tetikleyici | Kapatma |
855
+ |---------|------------|---------|
856
+ | Cookie Uyarisi | Ilk ziyaret | `button[action-type='ACCEPT']` veya banner icindeki buton |
857
+ | Premium Teklifi | Cesitli islemler | `.artdeco-modal__dismiss` veya `button[aria-label*='Kapat' i]` |
858
+ | "Uygulamayi indir" banner | Mobil goruntuleme | `button[aria-label*='Kapat' i]` |
859
+ | Bildirim izni | Tarayici API | Tarayici seviyesinde ele al |
860
+ | Profil tamamlama | Profil ziyareti | Modal kapatma butonu |
861
+
862
+ ---
863
+
864
+ ## 8. Ek Teknik Bilgiler
865
+
866
+ ### 8.1 LinkedIn'in Kullandigi Teknolojiler
867
+
868
+ - **Ember.js** (eski), **React** (yeni sayfalar) - karma kullanim
869
+ - **Quill.js** - Metin editoru (gonderi ve yorum alanlarinda)
870
+ - **ArtDeco Design System** - LinkedIn'in kendi tasarim sistemi (sinif adlari `artdeco-*` ile baslar)
871
+ - **Voyager API** - LinkedIn'in dahili REST API'si (browser isteklerinde gorulur)
872
+
873
+ ### 8.2 DOM Yapisi Ipuclari
874
+
875
+ - LinkedIn'in DOM'u genellikle cok derin (20+ seviye nesting)
876
+ - `ember-view` sinifi eski sayfalarda bulunur
877
+ - `scaffold-layout` ana sayfa iskeleti icin kullanilir
878
+ - `authentication-outlet` ve `app__container` ust seviye konteynerler
879
+ - Feed gonderileri `occludable-update` sinifli container'lar icinde yer alir (lazy loading/virtualization)
880
+
881
+ ### 8.3 Lazy Loading ve Sonsuz Scroll
882
+
883
+ LinkedIn feed sayfasi sonsuz scroll kullanir:
884
+ - Gonderiler sayfa asagi indikce yuklenir
885
+ - Yuklenmemis gonderiler icin scroll yapilmasi gerekir
886
+ - `window.scrollTo()` veya `page.mouse.wheel()` kullanilabilir
887
+ - Her scroll sonrasi 2-3 saniye beklenmeli (icerik yuklemesi icin)
888
+ - Tipik olarak 5-10 gonderi ayni anda goruntulenir
889
+
890
+ ### 8.4 Dil Destegi
891
+
892
+ LinkedIn arayuzu kullanicinin dil ayarina gore degisir. Selector'larda `aria-label` degerleri de bu dile gore degisir:
893
+
894
+ | Turkce | Ingilizce |
895
+ |--------|-----------|
896
+ | "Begen" | "Like" |
897
+ | "Yorum yap" | "Comment" |
898
+ | "Yeniden paylas" | "Repost" |
899
+ | "Gonder" | "Send" |
900
+ | "Baglanti kur" | "Connect" |
901
+ | "Takip et" | "Follow" |
902
+ | "Mesaj" | "Message" |
903
+ | "Gonderi paylas" | "Post" |
904
+ | "Gonderi baslat" | "Start a post" |
905
+ | "Daha fazla" | "More" |
906
+
907
+ **ONEMLI:** Selector'larda her iki dili de fallback olarak eklemek gerekir. `[aria-label*='baglanti' i]` ve `[aria-label*='Connect' i]` seklinde. `i` flag'i buyuk-kucuk harf duyarsiz esleme saglar (CSS4, Playwright destekler).
908
+
909
+ ### 8.5 Yanit Kodlari ve Hata Mesajlari
910
+
911
+ LinkedIn sayfasinda gorulebilecek hata durumlari:
912
+
913
+ | Durum | Gorunum | Cozum |
914
+ |-------|---------|-------|
915
+ | 429 Too Many Requests | Sayfa yuklenmez veya bos gelir | Bekle, hizi dusur |
916
+ | Hesap kisitlamasi | Banner mesaji | Dur, kullaniciyi bilgilendir |
917
+ | CAPTCHA | Dogrulama ekrani | Dur, manuel cozum gerekir |
918
+ | Oturum sona erdi | Giris sayfasina yonlendirme | Tekrar login gerekir |
919
+ | "Something went wrong" | Hata sayfasi | Sayfayi yenile |
920
+ | Profil bulunamadi | 404 sayfasi | URL kontrol et |
921
+
922
+ ### 8.6 Sayfa Yukleme Stratejisi
923
+
924
+ LinkedIn sayfalari SPA (Single Page Application) olarak calisir:
925
+ - Ilk yukleme yavastir (3-5 saniye)
926
+ - Sayfa ici navigasyon daha hizlidir (1-2 saniye)
927
+ - `page.goto()` kullanildiginda tam sayfa yuklemesi olur
928
+ - Navigasyon link'lerine tiklandiginda kismi yukleme olur (daha hizli ama selector bekleme gerekir)
929
+
930
+ **Onerilen strateji:**
931
+ 1. `page.goto(url, { waitUntil: 'domcontentloaded' })` kullan (`networkidle` cok uzun surebilir)
932
+ 2. Hedef elementi `page.waitForSelector(selector, { timeout: 10000 })` ile bekle
933
+ 3. Ek olarak 1-2 saniye ekstra bekle (AJAX istekleri icin)
934
+
935
+ ---
936
+
937
+ ## 9. Sik Karsilasilan Sorunlar ve Cozumleri
938
+
939
+ ### 9.1 Selector Degisiklikleri
940
+
941
+ LinkedIn sinif adlarini sik degistirir. Guvenilirlik sirasi:
942
+ 1. `aria-label` (en guvenilir - erisilebilirlik standardi)
943
+ 2. `role` (sabit - HTML standardi)
944
+ 3. `data-control-name` (nispeten sabit)
945
+ 4. `id` (nadiren degisir ama her element'te yok)
946
+ 5. `class` icinde `artdeco-*` (nispeten sabit)
947
+ 6. Obfuscated class adlari (EN AZ guvenilir - her build'de degisir)
948
+
949
+ ### 9.2 Modal Kapanmama Sorunu
950
+
951
+ Bazen modal kapatma butonu calismaz:
952
+ - `Escape` tusuna bas (`page.keyboard.press('Escape')`)
953
+ - Modal disina tikla (`page.click('.artdeco-modal-overlay')`)
954
+ - Sayfayi yenile (son care)
955
+
956
+ ### 9.3 Contenteditable Alanlara Yazma
957
+
958
+ LinkedIn'in Quill editor'u normal `fill()` ile her zaman calismaz:
959
+ - Oncelikle alana tikla (fokus al)
960
+ - `page.keyboard.type(text, { delay: 50 })` kullan
961
+ - Alternatif: `page.evaluate()` ile dogrudan DOM manipulasyonu (ama LinkedIn bunu algilayabilir)
962
+ - `pressSequentially()` de iyi calisir
963
+
964
+ ### 9.4 Bos Feed/Yuklenmeyen Icerik
965
+
966
+ Feed bos gorunuyorsa:
967
+ - Scroll yap (lazy loading tetikle)
968
+ - `waitForSelector('.feed-shared-update-v2', { timeout: 15000 })` ile bekle
969
+ - Sayfa yenile
970
+
971
+ ### 9.5 Popup/Banner Engelleri
972
+
973
+ Islem sirasinda beklenmeyen popup'lar cikarsa:
974
+ - "Premium" teklifi: `.artdeco-modal__dismiss` ile kapat
975
+ - Cookie banner: `button[action-type='ACCEPT']` ile kabul et
976
+ - Bildirim izni: Tarayici ayarlarindan engellenebilir
977
+ - "Uygulamayi indir": Kapatma butonuna tikla
978
+
979
+ ---
980
+
981
+ ## 10. Platform Spesifik Bilgiler
982
+
983
+ ### 10.1 LinkedIn Karakter Sinirlari
984
+
985
+ | Alan | Sinir |
986
+ |------|-------|
987
+ | Gonderi metni | 3.000 karakter |
988
+ | Yorum | 1.250 karakter |
989
+ | Makale basligi | 100 karakter |
990
+ | Makale icerigi | 125.000 karakter |
991
+ | Baglanti istegi notu | 300 karakter |
992
+ | Mesaj | 8.000 karakter |
993
+ | Profil basligi (headline) | 220 karakter |
994
+ | Profil ozeti (about) | 2.600 karakter |
995
+ | Sirket aciklamasi | 2.000 karakter |
996
+ | Hashtag (gonderi basi onerilen) | 3-5 adet |
997
+
998
+ ### 10.2 En Iyi Gonderi Zamanlari (Turkiye)
999
+
1000
+ | Gun | Saat | Neden |
1001
+ |-----|------|-------|
1002
+ | Sali-Persembe | 08:00-10:00 | Is baslangicindan once |
1003
+ | Sali-Persembe | 12:00-13:00 | Ogle arasi |
1004
+ | Carsamba | 09:00-11:00 | Hafta ortasi en yuksek etkilesim |
1005
+
1006
+ ### 10.3 Algoritma Ipuclari
1007
+
1008
+ - Ilk 60 dakikadaki etkilesim gonderinin erisimini belirler
1009
+ - Yorum, begenden daha degerli (algoritmik olarak)
1010
+ - Dis link paylasimi erisimi dusurur (linki yoruma koy)
1011
+ - Carousel/belge gonderileri en yuksek erisimi alir
1012
+ - Video gonderileri uzun kalma suresi saglar
1013
+ - Hashtag kullanimi kesfedilebilirligi arttirir (3-5 arasi ideal)