7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Qiitaで自分が投稿した記事の一覧を得る

Last updated at Posted at 2019-01-02

はじめに

自分が公開した投稿のまとめを作ろうにもイマイチ作りにくい。
タイトルとURLのリストがあれば、いろいろ作りやすそうなので、やってみる。

コード

#!/usr/bin/env python36
# coding: utf-8
"""Qiitaの自身の限定共有以外の投稿を一覧表示する."""

import configparser
import os
from pathlib import Path
import requests
import json
import yaml

def get_headers(access_token):
    """カスタムヘッダーを得る."""
    return {'Authorization': "Bearer %s" % (access_token)}


def get_items_count(access_token):
    """公開されたアイテム数を得る."""
    url = 'https://qiita.com/api/v2/authenticated_user'
    headers = get_headers(access_token)
    resp = requests.get(url, headers=headers)
    return json.loads(resp.text).get('items_count')


def get_items(access_token):
    """限定共有を除く、すべてのアイテムを得る."""
    PER_PAGE_MAX = 100
    items = []

    # 全てのアイテムを得る
    url = 'https://qiita.com/api/v2/authenticated_user/items'
    page = 1
    while True:
        params = {'page': page, 'per_page': PER_PAGE_MAX}
        headers = get_headers(access_token)
        resp = requests.get(url, headers=headers, params=params)
        page_items = json.loads(resp.text)
        if len(page_items) == 0:
            break
        items.extend(page_items)
        page += 1

    # 限定共有を除く
    items = filter(lambda x: not x['private'], items)

    return list(items)


def process_items(items):
    """タイトルとURLを抽出する."""
    ret = []
    for item in items:
        d = {'title': item['title'], 'url': item['url']}
        ret.append(d)
    return ret


def print_yaml(items):
    """YAMLで出力する."""
    args = {'allow_unicode': True, 'default_flow_style': False}
    print(yaml.dump(items, **args))


if __name__ == '__main__':
    # 設定を読む
    config = configparser.ConfigParser()
    path = Path(os.getenv('HOME'), '.qiita.ini')
    config.read_file(open(path))
    access_token = config['DEFAULT']['access_token']

    # 処理する
    items = get_items(access_token)
    items = process_items(items)
    print_yaml(items)

設定

$HOME/.qiita.ini に次のファイルを置いておく。

[DEFAULT]
access_token = 71da9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

実行結果

$ ./qiita_items_list.py
- title: Pythonでデフォルト値、環境変数、オプションで値を指定する
  url: https://qiita.com/kumarstack55/items/eedd8c6beac7fad0052a

ポイント

authentication_user の投稿数を知る唯一の属性 item_count は限定共有の投稿は含まれない。一方で、投稿を読む場合には限定共有の記事が含まれる。そのため、公開した n ページを読む、という処理はかけない。結果、限定共有ではないすべての投稿を得るには読める投稿数がゼロになるまで読み続ける実装にせざるを得ない。

(編集画面を見ても、Qiitaはノウハウを公開することを促すことが多いような気がするなあ。)

7
6
1

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
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?