
Instagram Private API Swift
يُرجى ملاحظة أن SwiftyInsta لم يعد يُصان بنشاط.
راجع #244 للمزيد من المعلومات.
اطّلع على Swiftagram إذا كنت تبحث عن بدائل محدّثة.
Instagram يقدم نوعين من واجهات برمجة التطبيقات (API) للمطورين. منصة Instagram API (محدودة للغاية في الوظائف وقريبة من التوقف)، و Instagram Graph API لحسابات الأعمال والمبدعين فقط.
ومع ذلك، تعتمد تطبيقات Instagram على نوع ثالث من واجهات API، تُسمى الخاصة (Private API) أو غير الرسمية (Unofficial API)، و SwiftyInsta هو عميل لأنظمة iOS وmacOS وtvOS وwatchOS لها، مكتوب بالكامل بلغة Swift. يمكنك محاولة إنشاء تجربة أفضل لـ Instagram لمستخدميك، أو كتابة روبوتات لأتمتة المهام المختلفة.
هذه الـ API الخاصة لا تتطلب رمزًا مميزًا (token) أو تسجيل تطبيق ولكنها غير مصرح بها من قبل Instagram للاستخدام الخارجي. استخدمها على مسؤوليتك الخاصة.
File/Swift Packages/Add Package Dependency… من القائمة.https://github.com/TheM4hd1/SwiftyInsta.git.CocoaPods هو مدير تبعيات لمشاريع Cocoa. يمكنك تثبيته باستخدام الأمر التالي:
$ gem install cocoapods
لتضمين SwiftyInsta في مشروع Xcode الخاص بك باستخدام CocoaPods، حدده في ملف Podfile الخاص بك:
use_frameworks!
target '<Your Target Name>' do
pod 'SwiftyInsta', '~> 2.0'
end
ثم قم بتشغيل الأمر التالي:
$ pod install
SwiftyInsta يعتمد على CryptoSwift و keychain-swift.
Credentials// هذه تحتاج إلى مراجع قوية.
self.credentials = Credentials(username: /* اسم المستخدم */, password: /* كلمة المرور */, verifyBy: .text)
self.handler = APIHandler()
handler.authenticate(with: .user(credentials)) {
switch $0 {
case .success(let response, _):
print("تم تسجيل الدخول بنجاح.")
// حفظ مؤقت في keychain بأمان لتسجيل الدخول مرة أخرى في المستقبل.
guard let key = response.persist() else { return print("تعذر حفظ `Authentication.Response`.") }
// قم بتخزين المفتاح `key` في أي مكان تريده لتتمكن من الوصول إلى `Authentication.Response` لاحقًا.
// `UserDefaults` مجرد مثال.
UserDefaults.standard.set(key, forKey: "current.account")
UserDefaults.standard.synchronize()
case .failure(let error):
if error.requiresInstagramCode {
/* تحديث الواجهة لطلب الرمز */
} else {
/* إبلاغ المستخدم */
}
}
}
بمجرد أن يكتب المستخدم رمز المصادقة الثنائية أو رمز التحدي، يمكنك ببساطة القيام بما يلي:
self.credentials.code = /* الرمز */
وسيقوم completionHandler في authenticate(with: completionHandler:) السابق بالتقاط الاستجابة تلقائيًا.
LoginWebViewControllerlet login = LoginWebViewController { controller, result in
controller.dismiss(animated: true, completion: nil)
// التعامل مع استجابة المصادقة.
guard let (response, _) = try? result.get() else { return print("فشل تسجيل الدخول.") }
print("تم تسجيل الدخول بنجاح.")
// حفظ مؤقت في keychain بأمان لتسجيل الدخول مرة أخرى في المستقبل.
guard let key = response.persist() else { return print("تعذر حفظ `Authentication.Response`.") }
// قم بتخزين المفتاح `key` في أي مكان تريده لتتمكن من الوصول إلى `Authentication.Response` لاحقًا.
// `UserDefaults` مجرد مثال.
UserDefaults.standard.set(key, forKey: "current.account")
UserDefaults.standard.synchronize()
}
if #available(iOS 13, *) {
present(login, animated: true, completion: nil) // فقط اسحب لأسفل للإغلاق.
} else {
present(UINavigationController(rootViewController: login), // يضيف بالفعل زر `Cancel` للإغلاق.
animated: true,
completion: nil)
}
أو قم بتنفيذ UIViewController خاص بك باستخدام LoginWebView، ثم مرره إلى طريقة authenticate الخاصة بـ APIHandler باستخدام .webView(/* عرض الويب الخاص بتسجيل الدخول */).
Authentication.Responseإذا كنت قد قمت بالفعل بحفظ Authentication.Response لمستخدم:
// استرداد المفتاح `key` الذي أرجعته `Authentication.Response.persist()`.
// في مثالنا، قمنا بتخزينه في `UserDefaults`.
guard let key = UserDefaults.standard.string(forKey: "current.account") else { return print("لم يتم العثور على `key`.") }
// استرداد `Authentication.Response` المحفوظة بأمان.
guard let cache = Authentication.Response.persisted(with: key) else { return print("لم يتم العثور على `Authentication.Response`.") }
// تسجيل الدخول.
let handler = APIHandler()
handler.authenticate(with: .cache(cache)) { _ in
/* قم بفعل شيء هنا */
}
جميع نقاط النهاية (endpoints) يمكن الوصول إليها بسهولة من نسخة APIHandler الخاصة بك.
let handler: APIHandler = /* معالج صالح ومصادق عليه */
// على سبيل المثال يمكنك…
// …جلب صندوق الوارد الخاص بك.
handler.messages.inbox(with: .init(maxPagesToLoad: .max),
updateHandler: nil,
completionHandler: { _, _ in /* قم بفعل شيء */ })
// …جلب جميع متابعيك.
handler.users.following(user: .me,
with: .init(maxPagesToLoad: .max),
updateHandler: nil,
completionHandler: { _, _ in /* قم بفعل شيء */ })
علاوة على ذلك، تعرض الاستجابات الآن كل قيمة فردية موجودة في ملف JSON الذي ترجعه الـ API: فقط قم بالوصول إلى أي rawResponse من ParsedResponse وابدأ التصفح، أو التزم بالملحقات المقترحة (مثل User's username, name, إلخ و Media's aspectRatio, takenAt, content, إلخ).
طلبات السحب (Pull requests) و القضايا (Issues) مرحب بها جدًا.
1.*2.*نحن نبحث بنشاط عن مشرفين.
راجع #244 للمزيد من المعلومات.
SwiftyInsta مرخص بموجب ترخيص MIT. اطّلع على LICENSE للمزيد من المعلومات.