はじめに
自分が公開した投稿のまとめを作ろうにもイマイチ作りにくい。
タイトルと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はノウハウを公開することを促すことが多いような気がするなあ。)