Qiita 보기 수 얻기

14331 단어 5QiitaAPI

처음에



Qiita의 LGTM 수와 View 수를 취득 할 때,
API의 사양이 바뀌었는지 참고로 한 것으로 취득할 수 없었던 부분이 있었으므로,
취득 방법을 기재해 갑니다.

환경



Go 1.15.2

1. 액세스 토큰 얻기



사용자 관리 화면 에서 토큰 얻기


범위는 read_qiita 및 write_qiita를 선택합니다.


2. 취득하고 싶은 정보의 URL을 확인



공식 문서 보다 취득하고 싶은 정보의 URL을 확인. 이번 이용하는 것은 이하의 2 종류입니다.
GET /api/v2/authenticated_user/items
認証中のユーザの記事の一覧を作成日時の降順で返します。
GET /api/v2/items/:item_id
記事を取得します。

3. json을 변환하는 struct 만들기



공식 문서에서 API를 두드릴 때 반환되는 정보가 Json에서 반환되므로,
반환된 데이터를 다루는 구조를 만듭니다.

UserInfo.go
package data

type UserInfo struct {
    Id               string `json:"id"`
    Likes_count      int    `json:"likes_count"`
    Title            string `json:"title"`
    Page_views_count int    `json:"page_views_count"`
}

4. Qiita API를 두드리는



web.go
package qiita

import (
    "../data"
    "../exporter"
    "encoding/json"
    "io/ioutil"
    "net/http"
)

func GetQiitaViews() {                                      // main.goから呼び出す
    url := "https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=20"
    resp, err := doHttpRequest(url)
    defer resp.Body.Close()                                 // Bodyをクローズ

    body, err := ioutil.ReadAll(resp.Body)                  // レスポンスのBodyから取得

    var userInfos []data.UserInfo
    if err = json.Unmarshal(body, &userInfos); err != nil { // jsonの読み出し
        return
    }

    index := 0
    for _, user := range userInfos {                       // 1記事ずつ読み出す
        url = "https://qiita.com/api/v2/items/" + user.Id  // 記事のIDを利用、view数を取得
        resp, err := doHttpRequest(url)
        defer resp.Body.Close()

        body, err := ioutil.ReadAll(resp.Body)

        if err := json.Unmarshal(body, &user); err != nil {return}
        userInfos[index].Page_views_count = user.Page_views_count
        index += 1
    }
    exporter.ToCsv(userInfos)                                // csv化
}

func doHttpRequest(url string) (*http.Response, error) {     // リクエストを共通化
    req, _ := http.NewRequest("GET", url, nil)

    buf, _ := ioutil.ReadFile("token.txt")
    token := string(buf)                                     // tokenを別ファイルで管理

    req.Header.Set("content-type", "application/json")       // ヘッダーにapplication/jsonを指定
    req.Header.Set("Authorization", "Bearer " + token)       // ヘッダーにtokenを指定

    client := new(http.Client)
    resp, err := client.Do(req)
    return resp, err
}

아래의 API만으로는 얻을 수 없는 것 같고,
URL을 쿼리해야 한다는 것을 처음 깨닫지 못했고 검색할 수 없었습니다.
또한 page_view_count가 null (Go로 struct에 넣으면 0)이 반환되어 버리기 때문에,
조회수는 기사별로 검색해야 하는 것 같습니다.
【Qiita API】 좋다! 조회수 자동 집계 의 기사를 참고로 했습니다.
GET /api/v2/authenticated_user/items
認証中のユーザの記事の一覧を作成日時の降順で返します。

그래서 다음의 API를 이용하고 있습니다.
GET /api/v2/items/:item_id
記事を取得します。

5. CSV 출력



export.go
package exporter

import (
    "../data"
    "encoding/csv"
    "os"
    "strconv"
)

func ToCsv(userInfos []data.UserInfo) {
    file, _ := os.OpenFile("result.csv", os.O_WRONLY|os.O_CREATE, 0600)  //ファイルを開く
    defer file.Close()

    writer := csv.NewWriter(file)
    writer.Write([]string{"title", "like_count", "page_views_count"})   // ヘッダーをつける
    for _, user := range userInfos {
        likesCount := strconv.Itoa(user.Likes_count)                    // intをstringへ変換
        pageViewsCount := strconv.Itoa(user.Page_views_count)
        writer.Write([]string{user.Title, likesCount, pageViewsCount})  // 書き込み
    }
    writer.Flush()
}

마지막으로



소스는 여기에 있습니다.
GitHub에 소스를 올리는 관계상,
token 정보는 main.go와 동일한 디렉토리 내의 다른 파일에서 관리하고 있습니다.
에러 핸들링은 일부 생략하고 있는 부분이 있습니다.

참고문헌



공식
【Qiita API】 좋다! 조회수 자동 집계
Go 언어로 CSV를 내보냅니다! 엑셀 용 SJIS 버전도!
Go의 import cycle not allowed(순환 참조) 대응

좋은 웹페이지 즐겨찾기