9
1

More than 1 year has passed since last update.

お題は不問!Qiita Engineer Festa 2023で記事投稿!

初投稿のPVが爆増したのがtrocco®とQiita APIでよくわかった話

Last updated at Posted at 2023-07-12

はじめに

7月8日に「【合格体験記】DB初心者が2か月でSnowPro Coreに合格した」という記事を投稿しました。嬉しいことに、そのPVが想像以上に爆増していたので、詳細について書いてみようと思います。

実際のPVの数値は以下の通りです。
image.png

なんという爆増具合でしょう・・・!

なぜ、日次の数値があるのか?

そうです、実はこの記事にはちょっとした背景があります。私が所属している株式会社primeNumberでは、trocco®というデータ統合自動化SaaSを運営しているのですが、自分ではまだ触ったことがなかった転送元HTTP (S)のコネクタを使ってみたいと考えていました。そんなときに少し調べてみると、

Qiitaにはデータ取得用のAPIが存在する

じゃないですか!

そこで、初めての記事を投稿してすぐに、Qiitaの数値を取得するパイプラインを遊びで組んでみたところ、早速面白いことが起きてしまったのです。

ということで、以下でtrocco®の構築方法と、Qiita APIの気になったことのメモ書きを残しておきますね。

trocco®でQiita APIを叩いて各種数値を取得する方法

データパイプラインは下記の通り、非常にシンプルな形です。
image.png

  • trocco®の転送元HTTP (S)でQiita APIを叩いてデータを取得
  • 取得したデータをBigQueryに格納
  • Looker StudioからBigQueryのデータを参照

Qiitaの個人用アクセストークンを取得する

はじめに、Qiitaの個人用アクセストークンを取得します。

  • 設定>アプリケーション>個人用アクセストークン「新しくトークンを発行する」>read_qiitaにチェックで「発行する」
    image.png
    image.png

ちなみにトークンなしでも一部のAPIは使えますが、取得する理由は下記の2点になります。

  • 認証をかけることでAPIリクエスト制限が緩和される(IPアドレスごとに認証済1000回/h;非認証60回/h)
  • PV数は認証済でないと取得できない

ユーザーデータの転送設定を作成

次に、ユーザーデータの転送設定を作成します。個別の投稿記事の前にユーザーデータを取得するのは、投稿記事ではpageのパラメーター付与が必須なのですが、そのためには投稿済の記事数を把握する必要があるからです。

{
  "description": "Hello, world.",
  "facebook_id": "qiita",
  "followees_count": 100,
  "followers_count": 200,
  "github_login_name": "qiitan",
  "id": "qiita",
  "items_count": 300,
  "linkedin_id": "qiita",
  "location": "Tokyo, Japan",
  "name": "Qiita キータ",
  "organization": "Qiita Inc.",
  "permanent_id": 1,
  "profile_image_url": "https://s3-ap-northeast-1.amazonaws.com/qiita-image-store/0/88/ccf90b557a406157dbb9d2d7e543dae384dbb561/large.png?1575443439",
  "team_only": false,
  "twitter_screen_name": "qiita",
  "website_url": "https://qiita.com",
  "image_monthly_upload_limit": 1048576,
  "image_monthly_upload_remaining": 524288
}
  • HTTPヘッダのAuthorizationの値にBearer [取得したトークンの値]
    image.png
  • BigQueryの各種設定(接続情報の設定は省略)
    image.png
  • 転送モードを「追記(APPEND)」にしておく
    image.png
  • 自動データ設定を実行
    image.png
  • すごい!JSONからカラムやデータ型を自動で判別してくれる!
    image.png
    image.png
  • 転送日時カラムを追加しておく
    image.png

投稿記事データの転送設定を作成

続けて、投稿記事データの転送設定を作成します。大体設定はユーザーデータと同じなので、違うところのみ記載します。

image.png

  • こちらも入力ファイルはJSONPathで$(全て取得)
    • ちなみにAPIで返ってくるデータ形式は以下の通りで、こちらはJSONの配列形式(公式ドキュメント
[
  {
    "rendered_body": "<h1>Example</h1>",
    "body": "# Example",
    "coediting": false,
    "comments_count": 100,
    "created_at": "2000-01-01T00:00:00+00:00",
    "group": {
      "created_at": "2000-01-01T00:00:00+00:00",
      "description": "This group is for developers.",
      "name": "Dev",
      "private": false,
      "updated_at": "2000-01-01T00:00:00+00:00",
      "url_name": "dev"
    },
    "id": "c686397e4a0f4f11683d",
    "likes_count": 100,
    "private": false,
    "reactions_count": 100,
    "stocks_count": 100,
    "tags": [
      {
        "name": "Ruby",
        "versions": [
          "0.0.1"
        ]
      }
    ],
    "title": "Example title",
    "updated_at": "2000-01-01T00:00:00+00:00",
    "url": "https://qiita.com/Qiita/items/c686397e4a0f4f11683d",
    "user": {
      "description": "Hello, world.",
      "facebook_id": "qiita",
      "followees_count": 100,
      "followers_count": 200,
      "github_login_name": "qiitan",
      "id": "qiita",
      "items_count": 300,
      "linkedin_id": "qiita",
      "location": "Tokyo, Japan",
      "name": "Qiita キータ",
      "organization": "Qiita Inc.",
      "permanent_id": 1,
      "profile_image_url": "https://s3-ap-northeast-1.amazonaws.com/qiita-image-store/0/88/ccf90b557a406157dbb9d2d7e543dae384dbb561/large.png?1575443439",
      "team_only": false,
      "twitter_screen_name": "qiita",
      "website_url": "https://qiita.com"
    },
    "page_views_count": 100,
    "team_membership": {
      "name": "Qiita キータ"
    },
    "organization_url_name": "qiita-inc"
  }
]
  • こちらも自動データ設定をすると、勝手にいい感じにしてくれる!

日次で動かすワークフローを作成

最後に下記の流れで処理を設計していきます。

  • 1つ目の処理:ユーザーデータを取得(これは普通に実行)
  • 2つ目の処理:1日1行のデータになっているかをクエリを叩いてチェック
  • 3つ目の処理:記事数に合わせて投稿記事データをループ処理で取得

image.png

  • 下記のクエリを叩いて、データが1行であることを確認
select
  count(*) as cnt
from
  `project-name.dataset_name.qiita_api_authenticated_user_SoySoySoyB`
where
  date(timestamp_add(transferred_at, interval 9 hour)) = current_date('Asia/Tokyo')
having
  cnt = 1
  • troccoのワークフローにはBigQueryのクエリ結果でループ実行という便利機能があります。
    image.png
  • 下記のクエリで処理する
select
  page
from
  unnest(generate_array(1, (
    select div(items_count - 1, 100) + 1
    from `project-name.dataset_name.qiita_api_authenticated_user_SoySoySoyB`
    where date(timestamp_add(transferred_at, interval 9 hour)) = current_date('Asia/Tokyo')
    ))) page

まだ1記事しかないので、ループ処理もなにもpage=1にしかならないのですが、これなら記事が増えても安心ですね。

さいごに

以上ご紹介したように、trocco®でのQiitaのデータ取得は非常に簡単に行うことができます。無料で利用できるフリープランも提供していますので、ぜひご活用くださいませ!(trocco®サービスページはこちら

おまけ:Qiita APIについて気になったこと

自分のデータを取れるってなったら、組織のデータを全部取りたくなるじゃないですか。それでやろうとしてみたのですが・・・

  • APIのうち、組織をベースにして取れるデータがない
  • ユーザーデータは取得できるが、組織を限定した取得ができない
  • 投稿記事データでは、公式ドキュメントに記載がないが、一部の条件を限定して抽出ができる
  • 前述の通り、PVを取得するには当該ユーザーによる認証が必要

ということで、組織のデータを取得するには、自分ものとは別の工夫や手間が必要になりそうです。

9
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1