Swift로 Qiita의 추세를 얻고 표시합니다.
Qiita API에는 추세를 얻는 API가 없습니다.
현재 SwiftUI에서 Qiita 기사를 볼 수 있는 클라이언트 앱을 만드는 중입니다.
트렌드 기사를 나열하고 표시할 수 있으면 좋겠다고 생각한다면 설마의 API 자체 제공되어 있지 않다...
다른 Qiita의 기사에서도 같은 것을 실현시키려고 새롭게 Qiita의 트렌드 API를 비공식으로 공개하고 있는 엔지니어도...
이번 iOS 네이티브 앱을 만들고 있으므로 Swift만으로 해결할 수 없는지 시도해 보았습니다!
SwiftSoup
Qiita 톱 페이지 분석
import SwiftSoup
import Combine
// Qiitaのページ(1日)
let urlString = "https://qiita.com/"
// 週間: https://qiita.com/?scope=weekly
// 月間: https://qiita.com/?scope=monthly
// タスクの初期化
var task = : AnyCancellable?
// URLに変換
let url = URL(string: urlString)!
// HTMLを取得
task = URLSession.shared.dataTaskPublisher(for: url)
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: { completion in
switch completion {
case .finished:
print("成功")
case let .failure(error):
print(error)
}
}, receiveValue: { data, _ in
do {
let text = String(data: data, encoding: .utf8)!
// ここからSwiftSoupでパース
let doc: Document = try SwiftSoup.parse(text)
let link: Element = try doc.select("div[data-hyperapp-app=Trend]").first()!
let json: Data = try link.attr("data-hyperapp-props").data(using: .utf8)!
// Codableでデコード
let response = try JSONDecoder()
.decode(TrendResponse.self,
from: json)
/// edgesにトレンドの記事が格納される
print(response.trend.edges)
} catch {
print("エラー")
}
})
Codable
struct TrendResponse: Codable {
let scope: String
var trend: Trend
}
struct Trend: Codable {
let edges: [Edges]
}
struct Edges: Codable {
let followingLikers: [Author]
let isLikedByViewer: Bool
let isNewArrival: Bool
let hasCodeBlock: Bool
let node: Node
}
struct Node: Codable {
let createdAt: String
let likesCount: Int
let title: String
let uuid: String
let author: Author
}
struct Author: Codable {
let profileImageUrl: String
let urlName: String
}
완성된 화면
요약
참고 기사
Reference
이 문제에 관하여(Swift로 Qiita의 추세를 얻고 표시합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shira-shun/items/cd4059cf6433d78a3da9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)