LoginSignup
3
3

More than 3 years have passed since last update.

小説家になろうのPython用非公式APIクライアントを作ってみた

Last updated at Posted at 2021-03-21

成果物

使い方

pip install -U narou-api
import narou_api

r = narou_api.get(out="json", st=1, lim=500, order="quarterpoint")
print(r.text)

説明

小説家になろうは、日本最大級の小説投稿サイトです。
いわゆる「なろう系」と呼ばれている作品を数多く生み出してきた所でもあります。
それらの作品群を検索するのに便利なAPIが公式から提供されています。

今回、そのAPIをpythonで簡単に実行できることを目的とした非公式APIクライアントを作成することにしました。
パッケージ化することで今後の開発の利便性の向上と、広く利用してもらうための周知、PyPIを用いたプロジェクトのパッケージ化と配布方法の理解が本記事の目的です。

手順

こちらの方の記事が大変参考になりましたのでご紹介させていただきます。

基本的にはこちらの記事をほぼほぼ参考にしてパッケージ化を実施しました。
それ以外の差異としては、コアとなるAPI実行機能でAPIの仕様変更があっても柔軟に対応できるように、GETパラメータを可変長引数で渡せるように実装したことと、それをCLIでも利用できるようにしたことです。

__init__.py
import sys

import requests


def get(**kwargs):
    """
    なろう小説API
    @see https://dev.syosetu.com/man/api/
    """
    url = "https://api.syosetu.com/novelapi/api/"
    return exec_get(url, **kwargs)

"""
中略
"""

def exec_get(url, **kwargs):
    """共通GETエクゼキューター"""
    is_first_loop = True
    for k, v in kwargs.items():
        if is_first_loop:
            url += "?"
            is_first_loop = False
        else:
            url += "&"
        url += f"{k}={v}"

    return requests.get(url)


commands = locals()


def main() -> None:
    if sys.argv[1] in commands:
        func = commands[sys.argv[1]]
        r = func(**dict(arg.split('=') for arg in sys.argv[2:]))
        print(r.text)

(3/22追記:なろう小説API以外のAPIにも対応しました。詳細はREADMEを参照ください)

locals()を使うと、以下のような関数の名前と関数の辞書を取得できます。

{
  (略)
  'get': <function get at 0x10fa533a0>, 
  (略)
}

CLIの第一引数を取得するsys.argv[1]はString型として扱われるので、locals辞書と合わせることで、CLIで複数の関数をコマンドとして実行するように対応しました。

setup.pyの作成し、以下のコマンドでローカルインストールしたら、CLIで実行可能になります。

pip install -U -e .

実行コマンド例

python -m narou_api get lim=1 out=json
narou_api get lim=1 out=json

配布物を作成します。

pip install --upgrade pip setuptools wheel
python setup.py bdist_wheel

whlファイルが作成できたら、適当なプロジェクトにインストールしてテストします。

pip install ../narou_api/dist/narou_api-0.0.1-py3-none-any.whl

プロジェクトをPyPIにアップロードする

配布物が作成できたことを確認できたら、以下を参考にPyPIにアップロードする準備をします。

まずは、PyPIアカウントを作成します。
次にAPIトークンを作成します。
トークン名はパッケージ名と同じ、スコープは「All Project」で問題ないです。
作成されたトークンはセキュリティの関係で一度しか表示されないので、必ず控えるようにしてください。
控えたトークンを元に以下のように.pypircを作成します。

$HOME/.pypirc
[pypi]
username = __token__
password = <the token value, including the `pypi-` prefix>

これでアップロードできる準備が整いましたので、後は以下のコマンドを実行してアップロードします。

twine check dist/*
twine upload dist/*

成功するとこのような感じでパッケージが作成されます。

以上でパッケージの作成と配布は完了です。

意外とあっさりとパッケージが作成できたなという印象です。
これを使用することでpythonでも簡単になろう小説を検索できるようになります。
簡単なスクレイピングの実施などに是非ご活用ください。

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