@emiran/omu-ubys 0.1.0 → 0.2.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.
package/README.md CHANGED
@@ -1,143 +1,147 @@
1
- <div align="center">
2
-
3
- # @emiran/omu-ubys
4
-
5
- **Unofficial TypeScript client for Ondokuz Mayıs University UBYS**
6
-
7
- [![npm version](https://img.shields.io/npm/v/@emiran/omu-ubys?color=cb3837&label=npm)](https://www.npmjs.com/package/@emiran/omu-ubys)
8
- [![Node.js](https://img.shields.io/badge/node-%3E%3D20-339933?logo=nodedotjs&logoColor=white)](https://nodejs.org)
9
- [![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
10
- [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
11
- [![CI](https://github.com/emi-ran/omu-ubys-npm/actions/workflows/ci.yml/badge.svg)](https://github.com/emi-ran/omu-ubys-npm/actions)
12
-
13
- Stop scraping UBYS manually. Get typed, normalized student data with a single client.
14
-
15
- [Getting Started](#getting-started) · [API Reference](./DOCS.md) · [Türkçe](./README.tr.md)
16
-
17
- </div>
18
-
19
- ---
20
-
21
- ## ✨ Features
22
-
23
- - 🔐 **Session-based auth** — cookie jar handling, CSRF tokens, login flow managed for you
24
- - 📊 **Academic data** — grades, transcripts, class details, weekly schedules
25
- - 💬 **Messaging** — conversation lists, recipients, full message history
26
- - 🍽️ **Cafeteria menu** — daily menu without needing to log in
27
- - 🧑‍🏫 **Advisor info** — name & contact for your academic advisor
28
- - 🛡️ **Structured errors** — `LoginError`, `SessionExpiredError`, `ParseError`, and more
29
- - 📦 **ESM + CJS** — works everywhere, with full type exports
30
-
31
- ## Getting Started
32
-
33
- ### Install
34
-
35
- ```bash
36
- npm install @emiran/omu-ubys
37
- ```
38
-
39
- ### Quick Start
40
-
41
- ```ts
42
- import { UBYSClient } from "@emiran/omu-ubys";
43
-
44
- const client = new UBYSClient({
45
- username: process.env.OMU_UBYS_USERNAME,
46
- password: process.env.OMU_UBYS_PASSWORD,
47
- });
48
-
49
- try {
50
- await client.login();
51
-
52
- const profile = await client.getProfile();
53
- const grades = await client.getGrades();
54
- const schedule = await client.getWeeklySchedule();
55
-
56
- console.log(profile.name); // "Emirhan Çetinkaya"
57
- console.log(grades[0]?.courses[0]?.letterGrade); // "AA"
58
- console.log(schedule[0]?.courseName); // "Veri Yapıları"
59
- } finally {
60
- await client.close();
61
- }
62
- ```
63
-
64
- ## 🗂️ Available Methods
65
-
66
- | Category | Method | Auth Required |
67
- |----------|--------|:---:|
68
- | **Auth** | `login()` | — |
69
- | | `clearSession()` | |
70
- | | `close()` | |
71
- | **Academic** | `getProfile()` | |
72
- | | `getGrades()` | ✅ |
73
- | | `getClassDetails(classId)` | ✅ |
74
- | | `getTranscript()` | ✅ |
75
- | | `getWeeklySchedule()` | ✅ |
76
- | **Campus** | `getAdvisor()` | ✅ |
77
- | | `getCafeteriaMenu()` | |
78
- | **Messaging** | `getMessages(options?)` | |
79
- | | `getChatRecipients(options)` | ✅ |
80
- | | `getChatMessages(options)` | ✅ |
81
-
82
- > **State helpers:** `isLoggedIn` · `isClosed`
83
-
84
- ## 🧩 Error Handling
85
-
86
- Every error extends `UBYSError`, so you can catch granularly or broadly:
87
-
88
- ```ts
89
- import { UBYSClient, LoginError, SessionExpiredError } from "@emiran/omu-ubys";
90
-
91
- try {
92
- await client.login();
93
- const grades = await client.getGrades();
94
- } catch (error) {
95
- if (error instanceof LoginError) {
96
- console.error("Invalid credentials.");
97
- } else if (error instanceof SessionExpiredError) {
98
- console.error("Session expired re-login required.");
99
- }
100
- }
101
- ```
102
-
103
- <details>
104
- <summary>All exported error classes</summary>
105
-
106
- - `UBYSError` — base class
107
- - `AuthenticationError`
108
- - `LoginError`
109
- - `SessionExpiredError`
110
- - `NetworkError`
111
- - `HttpError`
112
- - `ParseError`
113
- - `NotImplementedUBYSError`
114
- - `ClientClosedError`
115
-
116
- </details>
117
-
118
- ## 🤔 Why This Package?
119
-
120
- | Without `@emiran/omu-ubys` | With `@emiran/omu-ubys` |
121
- |---|---|
122
- | Manual cookie management | Automatic session handling |
123
- | Parsing raw HTML / Base64 payloads | Clean, typed return values |
124
- | Guessing at UBYS endpoints | Documented, tested methods |
125
- | No error context | Structured error hierarchy |
126
-
127
- ## 📚 Documentation
128
-
129
- | Document | Description |
130
- |----------|-------------|
131
- | [**DOCS.md**](./DOCS.md) | Full API reference with types & examples |
132
- | [**CHANGELOG.md**](./CHANGELOG.md) | Version history & notable changes |
133
- | [**README.tr.md**](./README.tr.md) | Türkçe genel bakış |
134
- | [**CONTRIBUTING.md**](./CONTRIBUTING.md) | Contribution guidelines |
135
- | [**DEVELOPMENT.md**](./DEVELOPMENT.md) | Roadmap & project status |
136
-
137
- ## ⚠️ Legal Notice
138
-
139
- > This is an **unofficial** third-party project for **educational and research purposes only**.
140
- >
141
- > It is not endorsed, approved, or maintained by Ondokuz Mayıs University. Using unofficial APIs or automating access to institutional systems may violate terms of service or applicable law. **You are solely responsible for your usage.**
142
- >
143
- > Takedown or review requests: [`ctnky.emiran@gmail.com`](mailto:ctnky.emiran@gmail.com)
1
+ <div align="center">
2
+
3
+ # @emiran/omu-ubys
4
+
5
+ **Unofficial TypeScript client for Ondokuz Mayıs University UBYS**
6
+
7
+ [![npm version](https://img.shields.io/npm/v/@emiran/omu-ubys?color=cb3837&label=npm)](https://www.npmjs.com/package/@emiran/omu-ubys)
8
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D20-339933?logo=nodedotjs&logoColor=white)](https://nodejs.org)
9
+ [![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
10
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
11
+ [![CI](https://github.com/emi-ran/omu-ubys-npm/actions/workflows/ci.yml/badge.svg)](https://github.com/emi-ran/omu-ubys-npm/actions)
12
+
13
+ Stop scraping UBYS manually. Get typed, normalized student data with a single client.
14
+
15
+ [Getting Started](#getting-started) · [API Reference](./DOCS.md) · [Türkçe](./README.tr.md)
16
+
17
+ </div>
18
+
19
+ ---
20
+
21
+ ## ✨ Features
22
+
23
+ - 🔐 **Session-based auth** — cookie jar handling, CSRF tokens, login flow managed for you
24
+ - 📊 **Academic data** — grades, transcripts, class details, weekly schedules
25
+ - 💬 **Messaging** — conversation lists, recipients, full message history
26
+ - 🍽️ **Cafeteria menu** — daily menu without needing to log in
27
+ - 🧑‍🏫 **Advisor info** — name & contact for your academic advisor
28
+ - 📋 **Survey solving** — detect, fetch, and submit MES course evaluation surveys
29
+ - 🛡️ **Structured errors** — `LoginError`, `SessionExpiredError`, `ParseError`, and more
30
+ - 📦 **ESM + CJS** — works everywhere, with full type exports
31
+
32
+ ## Getting Started
33
+
34
+ ### Install
35
+
36
+ ```bash
37
+ npm install @emiran/omu-ubys
38
+ ```
39
+
40
+ ### Quick Start
41
+
42
+ ```ts
43
+ import { UBYSClient } from "@emiran/omu-ubys";
44
+
45
+ const client = new UBYSClient({
46
+ username: process.env.OMU_UBYS_USERNAME,
47
+ password: process.env.OMU_UBYS_PASSWORD,
48
+ });
49
+
50
+ try {
51
+ await client.login();
52
+
53
+ const profile = await client.getProfile();
54
+ const grades = await client.getGrades();
55
+ const schedule = await client.getWeeklySchedule();
56
+
57
+ console.log(profile.name); // "Emirhan Çetinkaya"
58
+ console.log(grades[0]?.courses[0]?.letterGrade); // "AA"
59
+ console.log(schedule[0]?.courseName); // "Veri Yapıları"
60
+ } finally {
61
+ await client.close();
62
+ }
63
+ ```
64
+
65
+ ## 🗂️ Available Methods
66
+
67
+ | Category | Method | Auth Required |
68
+ |----------|--------|:---:|
69
+ | **Auth** | `login()` | |
70
+ | | `clearSession()` | |
71
+ | | `close()` | |
72
+ | **Academic** | `getProfile()` | ✅ |
73
+ | | `getGrades()` | ✅ |
74
+ | | `getClassDetails(classId)` | ✅ |
75
+ | | `getTranscript()` | ✅ |
76
+ | | `getWeeklySchedule()` | ✅ |
77
+ | **Campus** | `getAdvisor()` | |
78
+ | | `getCafeteriaMenu()` | |
79
+ | **Survey** | `getPendingSurveys()` | ✅ |
80
+ | | `fetchSurvey(surveyUrl)` | ✅ |
81
+ | | `submitSurvey(surveyData, answers)` | ✅ |
82
+ | **Messaging** | `getMessages(options?)` | ✅ |
83
+ | | `getChatRecipients(options)` | ✅ |
84
+ | | `getChatMessages(options)` | ✅ |
85
+
86
+ > **State helpers:** `isLoggedIn` · `isClosed`
87
+
88
+ ## 🧩 Error Handling
89
+
90
+ Every error extends `UBYSError`, so you can catch granularly or broadly:
91
+
92
+ ```ts
93
+ import { UBYSClient, LoginError, SessionExpiredError } from "@emiran/omu-ubys";
94
+
95
+ try {
96
+ await client.login();
97
+ const grades = await client.getGrades();
98
+ } catch (error) {
99
+ if (error instanceof LoginError) {
100
+ console.error("Invalid credentials.");
101
+ } else if (error instanceof SessionExpiredError) {
102
+ console.error("Session expired — re-login required.");
103
+ }
104
+ }
105
+ ```
106
+
107
+ <details>
108
+ <summary>All exported error classes</summary>
109
+
110
+ - `UBYSError` — base class
111
+ - `AuthenticationError`
112
+ - `LoginError`
113
+ - `SessionExpiredError`
114
+ - `NetworkError`
115
+ - `HttpError`
116
+ - `ParseError`
117
+ - `NotImplementedUBYSError`
118
+ - `ClientClosedError`
119
+
120
+ </details>
121
+
122
+ ## 🤔 Why This Package?
123
+
124
+ | Without `@emiran/omu-ubys` | With `@emiran/omu-ubys` |
125
+ |---|---|
126
+ | Manual cookie management | Automatic session handling |
127
+ | Parsing raw HTML / Base64 payloads | Clean, typed return values |
128
+ | Guessing at UBYS endpoints | Documented, tested methods |
129
+ | No error context | Structured error hierarchy |
130
+
131
+ ## 📚 Documentation
132
+
133
+ | Document | Description |
134
+ |----------|-------------|
135
+ | [**DOCS.md**](./DOCS.md) | Full API reference with types & examples |
136
+ | [**CHANGELOG.md**](./CHANGELOG.md) | Version history & notable changes |
137
+ | [**README.tr.md**](./README.tr.md) | Türkçe genel bakış |
138
+ | [**CONTRIBUTING.md**](./CONTRIBUTING.md) | Contribution guidelines |
139
+ | [**DEVELOPMENT.md**](./DEVELOPMENT.md) | Roadmap & project status |
140
+
141
+ ## ⚠️ Legal Notice
142
+
143
+ > This is an **unofficial** third-party project for **educational and research purposes only**.
144
+ >
145
+ > It is not endorsed, approved, or maintained by Ondokuz Mayıs University. Using unofficial APIs or automating access to institutional systems may violate terms of service or applicable law. **You are solely responsible for your usage.**
146
+ >
147
+ > Takedown or review requests: [`ctnky.emiran@gmail.com`](mailto:ctnky.emiran@gmail.com)
package/README.tr.md CHANGED
@@ -1,106 +1,110 @@
1
- <div align="center">
2
-
3
- # @emiran/omu-ubys
4
-
5
- **Ondokuz Mayıs Üniversitesi UBYS için gayriresmî TypeScript istemcisi**
6
-
7
- [![npm version](https://img.shields.io/npm/v/@emiran/omu-ubys?color=cb3837&label=npm)](https://www.npmjs.com/package/@emiran/omu-ubys)
8
- [![Node.js](https://img.shields.io/badge/node-%3E%3D20-339933?logo=nodedotjs&logoColor=white)](https://nodejs.org)
9
- [![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
10
- [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
11
-
12
- UBYS'yi elle kazımayı bırakın. Tek bir istemciyle tipli, normalize öğrenci verisi alın.
13
-
14
- [Başlarken](#başlarken) · [API Dokümantasyonu](./DOCS.md) · [English](./README.md)
15
-
16
- </div>
17
-
18
- ---
19
-
20
- ## ✨ Özellikler
21
-
22
- - 🔐 **Oturum tabanlı kimlik doğrulama** — cookie jar, CSRF token ve login akışı sizin için yönetilir
23
- - 📊 **Akademik veriler** — notlar, transkript, ders detayları, haftalık program
24
- - 💬 **Mesajlaşma** — konuşma listesi, katılımcılar, tam mesaj geçmişi
25
- - 🍽️ **Yemekhane menüsü** — giriş yapmadan günlük menü
26
- - 🧑‍🏫 **Danışman bilgisi** — akademik danışmanınızın adı ve iletişim bilgisi
27
- - 🛡️ **Yapılandırılmış hatalar** — `LoginError`, `SessionExpiredError`, `ParseError` ve dahası
28
- - 📦 **ESM + CJS** — her ortamda çalışır, tam tip dışa aktarımı
29
-
30
- ## Başlarken
31
-
32
- ### Kurulum
33
-
34
- ```bash
35
- npm install @emiran/omu-ubys
36
- ```
37
-
38
- ### Hızlı Başlangıç
39
-
40
- ```ts
41
- import { UBYSClient } from "@emiran/omu-ubys";
42
-
43
- const client = new UBYSClient({
44
- username: process.env.OMU_UBYS_USERNAME,
45
- password: process.env.OMU_UBYS_PASSWORD,
46
- });
47
-
48
- try {
49
- await client.login();
50
-
51
- const profile = await client.getProfile();
52
- const grades = await client.getGrades();
53
-
54
- console.log(profile.name); // "Emirhan Çetinkaya"
55
- console.log(grades[0]?.courses[0]?.letterGrade); // "AA"
56
- } finally {
57
- await client.close();
58
- }
59
- ```
60
-
61
- ## 🗂️ Mevcut Metodlar
62
-
63
- | Kategori | Metod | Giriş Gerekli |
64
- |----------|-------|:---:|
65
- | **Kimlik** | `login()` | — |
66
- | | `clearSession()` | |
67
- | | `close()` | |
68
- | **Akademik** | `getProfile()` | |
69
- | | `getGrades()` | ✅ |
70
- | | `getClassDetails(classId)` | ✅ |
71
- | | `getTranscript()` | ✅ |
72
- | | `getWeeklySchedule()` | ✅ |
73
- | **Kampüs** | `getAdvisor()` | ✅ |
74
- | | `getCafeteriaMenu()` | |
75
- | **Mesajlaşma** | `getMessages(options?)` | |
76
- | | `getChatRecipients(options)` | ✅ |
77
- | | `getChatMessages(options)` | ✅ |
78
-
79
- > **Durum yardımcıları:** `isLoggedIn` · `isClosed`
80
-
81
- ## 🤔 Neden Bu Paket?
82
-
83
- | `@emiran/omu-ubys` olmadan | `@emiran/omu-ubys` ile |
84
- |---|---|
85
- | Manuel cookie yönetimi | Otomatik oturum yönetimi |
86
- | Ham HTML / Base64 payload parse etme | Temiz, tipli dönüş değerleri |
87
- | UBYS endpoint'lerini tahmin etme | Dökümante edilmiş, test edilmiş metodlar |
88
- | Hata bağlamı yok | Yapılandırılmış hata hiyerarşisi |
89
-
90
- ## 📚 Dokümantasyon
91
-
92
- | Döküman | Açıklama |
93
- |---------|----------|
94
- | [**DOCS.md**](./DOCS.md) | Tam API referansı, tipler ve örnekler |
95
- | [**CHANGELOG.md**](./CHANGELOG.md) | Sürüm geçmişi ve önemli değişiklikler |
96
- | [**README.md**](./README.md) | English overview |
97
- | [**CONTRIBUTING.md**](./CONTRIBUTING.md) | Katkı rehberi |
98
- | [**DEVELOPMENT.md**](./DEVELOPMENT.md) | Yol haritası ve proje durumu |
99
-
100
- ## ⚠️ Hukuki Uyarı
101
-
102
- > Bu proje tamamen **eğitim ve araştırma amacıyla** sunulan **gayriresmî** bir üçüncü taraf çalışmadır.
103
- >
104
- > Ondokuz Mayıs Üniversitesi tarafından onaylanmamış, desteklenmemiş veya bakımı yapılmamaktadır. Gayriresmî API kullanımı veya kurumsal sistemlere otomatik erişim, kullanım koşullarını veya ilgili mevzuatı ihlal edebilir. **Kullanım sorumluluğu tamamen size aittir.**
105
- >
106
- > Kaldırma veya inceleme talepleri: [`ctnky.emiran@gmail.com`](mailto:ctnky.emiran@gmail.com)
1
+ <div align="center">
2
+
3
+ # @emiran/omu-ubys
4
+
5
+ **Ondokuz Mayıs Üniversitesi UBYS için gayriresmî TypeScript istemcisi**
6
+
7
+ [![npm version](https://img.shields.io/npm/v/@emiran/omu-ubys?color=cb3837&label=npm)](https://www.npmjs.com/package/@emiran/omu-ubys)
8
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D20-339933?logo=nodedotjs&logoColor=white)](https://nodejs.org)
9
+ [![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
10
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
11
+
12
+ UBYS'yi elle kazımayı bırakın. Tek bir istemciyle tipli, normalize öğrenci verisi alın.
13
+
14
+ [Başlarken](#başlarken) · [API Dokümantasyonu](./DOCS.md) · [English](./README.md)
15
+
16
+ </div>
17
+
18
+ ---
19
+
20
+ ## ✨ Özellikler
21
+
22
+ - 🔐 **Oturum tabanlı kimlik doğrulama** — cookie jar, CSRF token ve login akışı sizin için yönetilir
23
+ - 📊 **Akademik veriler** — notlar, transkript, ders detayları, haftalık program
24
+ - 💬 **Mesajlaşma** — konuşma listesi, katılımcılar, tam mesaj geçmişi
25
+ - 🍽️ **Yemekhane menüsü** — giriş yapmadan günlük menü
26
+ - 🧑‍🏫 **Danışman bilgisi** — akademik danışmanınızın adı ve iletişim bilgisi
27
+ - 📋 **Anket çözme** — MES ders değerlendirme anketlerini tespit et, getir ve gönder
28
+ - 🛡️ **Yapılandırılmış hatalar** — `LoginError`, `SessionExpiredError`, `ParseError` ve dahası
29
+ - 📦 **ESM + CJS** — her ortamda çalışır, tam tip dışa aktarımı
30
+
31
+ ## Başlarken
32
+
33
+ ### Kurulum
34
+
35
+ ```bash
36
+ npm install @emiran/omu-ubys
37
+ ```
38
+
39
+ ### Hızlı Başlangıç
40
+
41
+ ```ts
42
+ import { UBYSClient } from "@emiran/omu-ubys";
43
+
44
+ const client = new UBYSClient({
45
+ username: process.env.OMU_UBYS_USERNAME,
46
+ password: process.env.OMU_UBYS_PASSWORD,
47
+ });
48
+
49
+ try {
50
+ await client.login();
51
+
52
+ const profile = await client.getProfile();
53
+ const grades = await client.getGrades();
54
+
55
+ console.log(profile.name); // "Emirhan Çetinkaya"
56
+ console.log(grades[0]?.courses[0]?.letterGrade); // "AA"
57
+ } finally {
58
+ await client.close();
59
+ }
60
+ ```
61
+
62
+ ## 🗂️ Mevcut Metodlar
63
+
64
+ | Kategori | Metod | Giriş Gerekli |
65
+ |----------|-------|:---:|
66
+ | **Kimlik** | `login()` | |
67
+ | | `clearSession()` | |
68
+ | | `close()` | |
69
+ | **Akademik** | `getProfile()` | ✅ |
70
+ | | `getGrades()` | ✅ |
71
+ | | `getClassDetails(classId)` | ✅ |
72
+ | | `getTranscript()` | ✅ |
73
+ | | `getWeeklySchedule()` | ✅ |
74
+ | **Kampüs** | `getAdvisor()` | |
75
+ | | `getCafeteriaMenu()` | |
76
+ | **Anket** | `getPendingSurveys()` | ✅ |
77
+ | | `fetchSurvey(surveyUrl)` | ✅ |
78
+ | | `submitSurvey(surveyData, answers)` | ✅ |
79
+ | **Mesajlaşma** | `getMessages(options?)` | ✅ |
80
+ | | `getChatRecipients(options)` | ✅ |
81
+ | | `getChatMessages(options)` | ✅ |
82
+
83
+ > **Durum yardımcıları:** `isLoggedIn` · `isClosed`
84
+
85
+ ## 🤔 Neden Bu Paket?
86
+
87
+ | `@emiran/omu-ubys` olmadan | `@emiran/omu-ubys` ile |
88
+ |---|---|
89
+ | Manuel cookie yönetimi | Otomatik oturum yönetimi |
90
+ | Ham HTML / Base64 payload parse etme | Temiz, tipli dönüş değerleri |
91
+ | UBYS endpoint'lerini tahmin etme | Dökümante edilmiş, test edilmiş metodlar |
92
+ | Hata bağlamı yok | Yapılandırılmış hata hiyerarşisi |
93
+
94
+ ## 📚 Dokümantasyon
95
+
96
+ | Döküman | Açıklama |
97
+ |---------|----------|
98
+ | [**DOCS.md**](./DOCS.md) | Tam API referansı, tipler ve örnekler |
99
+ | [**CHANGELOG.md**](./CHANGELOG.md) | Sürüm geçmişi ve önemli değişiklikler |
100
+ | [**README.md**](./README.md) | English overview |
101
+ | [**CONTRIBUTING.md**](./CONTRIBUTING.md) | Katkı rehberi |
102
+ | [**DEVELOPMENT.md**](./DEVELOPMENT.md) | Yol haritası ve proje durumu |
103
+
104
+ ## ⚠️ Hukuki Uyarı
105
+
106
+ > Bu proje tamamen **eğitim ve araştırma amacıyla** sunulan **gayriresmî** bir üçüncü taraf çalışmadır.
107
+ >
108
+ > Ondokuz Mayıs Üniversitesi tarafından onaylanmamış, desteklenmemiş veya bakımı yapılmamaktadır. Gayriresmî API kullanımı veya kurumsal sistemlere otomatik erişim, kullanım koşullarını veya ilgili mevzuatı ihlal edebilir. **Kullanım sorumluluğu tamamen size aittir.**
109
+ >
110
+ > Kaldırma veya inceleme talepleri: [`ctnky.emiran@gmail.com`](mailto:ctnky.emiran@gmail.com)