Hugo の記事の一部を Qiita へも投稿してみる。
ポイント
- API v2 Document
 - 新規記事は 
POST、既存記事の更新はPATCH。 - 
title,body,tagsヘッダが無いと、400 Bad Request が返ってくる。 - 「下書き」に関する項目は見つけられていない。
ヘッダprivateは限定公開に関するものの様子。 
サンプルコード
- 
API Token は、環境変数
QIITA_TOKENに保管してとってくる。 - 
cryogen だとカスタムヘッダを追加できない・・
 
# -*- coding: utf-8 -*-
#
# Update an article via Qiita API
#
import sys
import os
import logging
import json
import requests
QIITA_URL = 'https://qiita.com/api/v2/items'
TAGS = ["qiita_id", "title", "tags"]
def parse(filepath, max_header_lines=10):
    u'''Parse original article (Cryogen format)'''
    title = None
    qiita_id = None
    tags = [{"name": "update_via_api", "version": []}]
    body = ''
    line_count = 0
    with open(filepath) as f:
        for line in f:
            line_count += 1
            if line.find(':qiita_id ') > 0:
                try:
                    qiita_id = line.strip().split()[1]
                except IndexError:
                    qiita_id = ''
            if line.find(':title ') > 0:
                title = line.strip().split(' ', 1)[1]
            if line.find(':tags ') > 0:
                keys = line.strip().split(' ', 1)[1]
                for k in json.loads(keys):
                    tags.append({"name": k, "version": []})
            if line.rstrip().endswith('}') or line_count > max_header_lines:
                break
        if qiita_id is None:
            return None
        for line in f:
            body += line
    return {
        'title': title,
        'qiita_id': qiita_id,
        'tags': tags,
        'body': body,
        'tweet': False,
        'private': False,
    }
def submit(item, token, url=QIITA_URL, article_id=None):
    u'''Submit to Qiita v2 API'''
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer {}'.format(token)
    }
    if article_id is None or article_id == '':
        res = requests.post(url, headers=headers, json=item)
    else:
        url = "{}/{}".format(url, article_id)
        res = requests.patch(url, headers=headers, json=item)
    if res.status_code >= 400:
        logging.error(res.json())
    res.raise_for_status()
    logging.info(json.dumps(res.json(), indent=2))
    return res
def execute(filepath, token):
    item = parse(filepath)
    if item is None:
        logging.warning("SKIP. No qiita_id tag found.")
        return
    logging.debug(json.dumps(item, indent=2))
    res = submit(item, token=token, article_id=item['qiita_id'])
if __name__ == "__main__":
    token = os.environ['QIITA_TOKEN']
    for arg in sys.argv[1:]:
        execute(arg, token)