🔥

ZoteroのAPIとStreamlitを使ったアプリ開発

2024/07/11に公開

概要

ZoteroのAPIとStreamlitを使ったアプリを試作しました。

https://nakamura196-zotero.streamlit.app/

本記事は、このアプリ開発におけるメモです。

Streamlit

以下の記事がとても参考になりました。

https://qiita.com/sypn/items/80962d84126be4092d3c

ZoteroのAPI

ZoteroのAPIについて、以下で説明されています。

https://www.zotero.org/support/dev/web_api/v3/start

今回は上記のページで紹介されている以下のライブラリを使用しました。

https://github.com/urschrei/pyzotero

APIの利用にあたっては、personal library IDAPI keyを取得する必要がありますが、READMEのQuickstartの手順に従うと、それらを取得することができました。

以下は、API keyを発行した際の画面です。

Streamlitを用いた開発

以下のリポジトリでソースコードを公開しています。

https://github.com/nakamura196/zotero_streamlit

機密情報

機密情報は、/.streamlit/secrets.tomlというファイルを作成し、そこに記載するようでした。.gitignoreに記載することも忘れないようにしてください。

/.streamlit/secrets.toml
[zotero]
library_id="xxx"
library_type="user"
api_key="xxx"

そして、以下のように呼び出すことができました。

def init_zotero():
    library_id = st.secrets["zotero"]["library_id"]
    library_type = st.secrets["zotero"]["library_type"]
    api_key = st.secrets["zotero"]["api_key"]
    return zotero.Zotero(library_id, library_type, api_key)

Zoteroライブラリのコレクション一覧の取得

以下ので、Zoteroライブラリからコレクションの一覧を取得することができました。

def fetch_collections(zot):
    """ Zoteroライブラリからコレクション一覧を取得する """
    collections = zot.collections()
    # 各コレクションからタイトルとキー(ID)を取得
    collection_list = [{"name": collection['data']['name'], "key": collection['data']['key']} for collection in collections]
    return collection_list

コレクション内のアイテムの取得

以下でコレクション内のアイテムを取得できました。itemTypeattachmentのものはスキップする処理を加えています。

# 文献データをDataFrameに変換
def create_df(zot, collection_id):
    if not collection_id:
        return pd.DataFrame()

    try:
        items = zot.collection_items(collection_id)
        rows = [{
            'title': item['data']['title'],
            "itemType": item['data']['itemType'],
            "creators": ", ".join(f"{creator['firstName']} {creator['lastName']}" for creator in item['data'].get('creators', [])),
            "date": item['data'].get('date', "")
        } for item in items if item['data']['itemType'] != "attachment"]
        
        return pd.DataFrame(rows)
    except Exception as e:
        st.error(f"Failed to load items from collection: {e}")
        return pd.DataFrame()

メタタグ設定

以下のような形で、タイトルなどのページ設定を行うことができました。

# ページの設定
st.set_page_config(
    page_title="Zotero x Streamlit",  # ブラウザのタイトルバーに表示されるタイトル
    page_icon="🧊",               # ブラウザのタブに表示されるアイコン
    # layout="wide",                # レイアウトを広いものに設定
    # initial_sidebar_state="expanded",  # サイドバーの初期状態を展開に設定
    menu_items={                  # 追加のメニューオプションとともにメタタグ設定
        'Get Help': "https://github.com/nakamura196/zotero_streamlit/",
        'Report a bug': 'https://github.com/nakamura196/zotero_streamlit/issues',
        'About': "App development using [Zotero](https://www.zotero.org/)'s API and Streamlit"
    }
)

デプロイ

開発中の画面の右上の「Deploy」ボタンから、Streamlit Community Cloudに簡単にデプロイできました。

その際、Advanced settingsにおいて、/.streamlit/secrets.tomlに記載した情報を追加することで、サーバ上でも機密情報を利用することができました。

まとめ

Streamlitを使うことで、Webアプリを簡単に作成することができました。

Zotero APIの利用など、参考になりましたら幸いです。

Discussion