Swift로 Qiita의 추세를 얻고 표시합니다.

9960 단어 HTMLSwiftUIQiita

Qiita API에는 추세를 얻는 API가 없습니다.



현재 SwiftUI에서 Qiita 기사를 볼 수 있는 클라이언트 앱을 만드는 중입니다.
트렌드 기사를 나열하고 표시할 수 있으면 좋겠다고 생각한다면 설마의 API 자체 제공되어 있지 않다...
다른 Qiita의 기사에서도 같은 것을 실현시키려고 새롭게 Qiita의 트렌드 API를 비공식으로 공개하고 있는 엔지니어도...

이번 iOS 네이티브 앱을 만들고 있으므로 Swift만으로 해결할 수 없는지 시도해 보았습니다!

SwiftSoup


  • HTML을 구문 분석 (해석)하는 라이브러리
  • htps : // 기주 b. 코 m / s 신후 / 슈 f ぉ p
  • Cocoapods, Carthage, Swift Package Manager 지원

  • 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
    
    }
    
    

    완성된 화면





    요약


  • Swift로 HTML을 취득해 퍼스 하는 것으로 실현할 수 있었다.
  • 현재 SwiftUI에서 클라이언트 앱을 절찬 개발 중입니다.
  • TestFlight에서 테스트 전송도 하고 있으므로, 관심이 있는 분은, 코멘트 또는 연락해 주세요!

  • 참고 기사


  • Netlify Functions를 사용하여 Qiita 트렌드 API를 비공식으로 만들었습니다.
  • 좋은 웹페이지 즐겨찾기