
Instagram Приватный API Swift
Обратите внимание: SwiftyInsta больше не поддерживается активно.
Подробнее см. в #244.
Если вы ищете актуальные альтернативы, обратите внимание на Swiftagram.
Instagram предлагает разработчикам два вида API. Instagram API Platform (крайне ограничен по функциональности и скоро будет отключён) и Instagram Graph API только для бизнес- и создатель-аккаунтов.
Однако приложения Instagram используют третий тип API, так называемый Private API (неофициальный API), и SwiftyInsta — это iOS, macOS, tvOS и watchOS клиент для них, написанный полностью на Swift. Вы можете попытаться создать улучшенный опыт использования Instagram для ваших пользователей или написать ботов для автоматизации различных задач.
Эти Private API не требуют токена или регистрации приложения, но они не авторизованы 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 '<Имя вашей цели>' 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("Вход выполнен успешно.")
// безопасно сохраняем кэш в связку ключей для повторного входа в будущем.
guard let key = response.persist() else { return print("`Authentication.Response` не удалось сохранить.") }
// сохраните ключ в любом удобном месте, чтобы потом получить `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("Вход выполнен успешно.")
// безопасно сохраняем кэш в связку ключей для повторного входа в будущем.
guard let key = response.persist() else { return print("`Authentication.Response` не удалось сохранить.") }
// сохраните ключ в любом удобном месте, чтобы потом получить `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), // уже добавляет кнопку «Отмена» для закрытия.
animated: true,
completion: nil)
}
Или реализуйте свой собственный UIViewController, используя LoginWebView, и передайте его в метод authenticate объекта APIHandler через .webView(/* ваш login web view */).
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
/* что-то делаем здесь */
}
Все конечные точки легко доступны через экземпляр APIHandler.
let handler: APIHandler = /* валидный аутентифицированный обработчик */
// например, вы можете…
// …получить ваш inbox.
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 — aspectRatio, takenAt, content и т.д.).
Pull requests и issues приветствуются.
1.* сопровождающий2.* сопровождающийМы активно ищем сопровождающих.
Подробнее см. в #244.
SwiftyInsta распространяется под лицензией MIT. Подробнее см. в LICENSE.