
Instagram Private API Swift
Bitte beachte, dass SwiftyInsta nicht mehr aktiv gewartet wird.
Weitere Informationen findest du unter #244.
Schau dir Swiftagram an, wenn du nach aktuellen Alternativen suchst.
Instagram bietet Entwicklern zwei Arten von APIs an. Die Instagram API Platform (extrem eingeschränkt in der Funktionalität und kurz vor der Einstellung) und die Instagram Graph API nur für Business- und Creator-Konten.
Allerdings verwenden Instagram-Apps eine dritte Art von API, die sogenannte Private API oder Unofficial API, und SwiftyInsta ist ein iOS, macOS, tvOS und watchOS Client dafür, vollständig in Swift geschrieben. Du kannst versuchen, eine bessere Instagram-Erfahrung für deine Benutzer zu schaffen oder Bots zur Automatisierung verschiedener Aufgaben schreiben.
Diese Private API benötigt weder Token noch App-Registrierung, ist aber von Instagram nicht für die externe Nutzung autorisiert. Verwendung auf eigene Gefahr.
File/Swift Packages/Add Package Dependency… aus dem Menü.https://github.com/TheM4hd1/SwiftyInsta.git ein.CocoaPods ist ein Abhängigkeitsmanager für Cocoa-Projekte. Du kannst ihn mit dem folgenden Befehl installieren:
$ gem install cocoapods
Um SwiftyInsta mit CocoaPods in dein Xcode-Projekt zu integrieren, gib es in deinem Podfile an:
use_frameworks!
target '<Your Target Name>' do
pod 'SwiftyInsta', '~> 2.0'
end
Führe dann den folgenden Befehl aus:
$ pod install
SwiftyInsta benötigt CryptoSwift und keychain-swift.
Credentials// these need to be strong references.
self.credentials = Credentials(username: /* username */, password: /* password */, verifyBy: .text)
self.handler = APIHandler()
handler.authenticate(with: .user(credentials)) {
switch $0 {
case .success(let response, _):
print("Login successful.")
// persist cache safely in the keychain for logging in again in the future.
guard let key = response.persist() else { return print("`Authentication.Response` could not be persisted.") }
// store the `key` wherever you want, so you can access the `Authentication.Response` later.
// `UserDefaults` is just an example.
UserDefaults.standard.set(key, forKey: "current.account")
UserDefaults.standard.synchronize()
case .failure(let error):
if error.requiresInstagramCode {
/* update interface to ask for code */
} else {
/* notify the user */
}
}
}
Sobald der Benutzer den Zwei-Faktor-Authentifizierungscode oder den Challenge-Code eingegeben hat, tust du einfach Folgendes:
self.credentials.code = /* the code */
Und der completionHandler im vorherigen authenticate(with: completionHandler:) wird die Antwort automatisch abfangen.
LoginWebViewControllerlet login = LoginWebViewController { controller, result in
controller.dismiss(animated: true, completion: nil)
// deal with authentication response.
guard let (response, _) = try? result.get() else { return print("Login failed.") }
print("Login successful.")
// persist cache safely in the keychain for logging in again in the future.
guard let key = response.persist() else { return print("`Authentication.Response` could not be persisted.") }
// store the `key` wherever you want, so you can access the `Authentication.Response` later.
// `UserDefaults` is just an example.
UserDefaults.standard.set(key, forKey: "current.account")
UserDefaults.standard.synchronize()
}
if #available(iOS 13, *) {
present(login, animated: true, completion: nil) // just swipe down to dismiss.
} else {
present(UINavigationController(rootViewController: login), // already adds a `Cancel` button to dismiss it.
animated: true,
completion: nil)
}
Oder implementiere deinen eigenen benutzerdefinierten UIViewController mit LoginWebView und übergib ihn an eine APIHandler-authenticate-Methode mit .webView(/* your login web view */).
Authentication.ResponseWenn du bereits eine Authentication.Response eines Benutzers persistiert hast:
// recover the `key` returned by `Authentication.Response.persist()`.
// in our example, we stored it in `UserDefaults`.
guard let key = UserDefaults.standard.string(forKey: "current.account") else { return print("`key` not found.") }
// recover the safely persisted `Authentication.Response`.
guard let cache = Authentication.Response.persisted(with: key) else { return print("`Authentication.Response` not found.") }
// log in.
let handler = APIHandler()
handler.authenticate(with: .cache(cache)) { _ in
/* do something here */
}
Alle Endpunkte sind von deiner APIHandler-Instanz aus leicht zugänglich.
let handler: APIHandler = /* a valid, authenticated handler */
// for instance you can…
// …fetch your inbox.
handler.messages.inbox(with: .init(maxPagesToLoad: .max),
updateHandler: nil,
completionHandler: { _, _ in /* do something */ })
// …fetch all your followers.
handler.users.following(user: .me,
with: .init(maxPagesToLoad: .max),
updateHandler: nil,
completionHandler: { _, _ in /* do something */ })
Darüber hinaus zeigen Antworten jetzt jeden einzelnen Wert, der in der von der API zurückgegebenen JSON-Datei enthalten ist: Greife einfach auf das rawResponse einer beliebigen ParsedResponse zu und beginne zu stöbern, oder bleibe bei den vorgeschlagenen Zusätzen (z.B. username, name von User usw. und aspectRatio, takenAt, content von Media usw.).
Pull Requests und Issues sind mehr als willkommen.
1.* Betreuer2.* BetreuerWir suchen aktiv nach Betreuern.
Weitere Informationen findest du unter #244.
SwiftyInsta ist unter der MIT-Lizenz lizenziert. Weitere Informationen findest du unter LICENSE.