<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Openpyxl on デジタルアーカイブシステムの技術ブログ</title><link>https://tech.ldas.jp/ja/tags/openpyxl/</link><description>Recent content in Openpyxl on デジタルアーカイブシステムの技術ブログ</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Tue, 05 May 2026 08:00:00 +0900</lastBuildDate><atom:link href="https://tech.ldas.jp/ja/tags/openpyxl/index.xml" rel="self" type="application/rss+xml"/><item><title>東北大学デジタルアーカイブの公開 API 調査 — OAI-PMH 経由で setSpec ごとに Excel 出力する</title><link>https://tech.ldas.jp/ja/posts/tohoku-digital-archives-oai-pmh/</link><pubDate>Tue, 05 May 2026 08:00:00 +0900</pubDate><guid>https://tech.ldas.jp/ja/posts/tohoku-digital-archives-oai-pmh/</guid><description>&lt;blockquote>
&lt;p>本記事は生成AIと共同で執筆しています。事実関係は可能な範囲で公式ドキュメント等と照合していますが、誤りが含まれている可能性があります。重要な判断を行う前にご自身でも一次情報をご確認ください。&lt;/p>&lt;/blockquote>
&lt;p>東北大学デジタルアーカイブ（&lt;a href="https://touda.tohoku.ac.jp/collection/">touda.tohoku.ac.jp/collection&lt;/a>）にあるデルゲ版チベット大蔵経 DB を見ていて、JSON で取得できる経路がないかと気になり、公開 API の有無を一通り確認しました。最終的に OAI-PMH 経由で setSpec ごとに Excel 化するところまで動かせたので、その手順を整理します。スクレイピングは利用しない方針で進めています。&lt;/p>
&lt;h2 id="公開されているエンドポイントの一覧">公開されているエンドポイントの一覧&lt;/h2>
&lt;p>調査した範囲で確認できた状態は次のとおりです（2026-04-30 時点）。&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>種別&lt;/th>
 &lt;th>エンドポイント&lt;/th>
 &lt;th>状態&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>OAI-PMH&lt;/td>
 &lt;td>&lt;code>https://touda.tohoku.ac.jp/collection/oai&lt;/code>&lt;/td>
 &lt;td>公開（3 形式）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>IIIF Presentation v3 manifest&lt;/td>
 &lt;td>&lt;code>https://touda.tohoku.ac.jp/collection/iiif/scripture/{ID}/manifest.json&lt;/code>&lt;/td>
 &lt;td>公開（個別レコード単位）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>IIIF Image API v2&lt;/td>
 &lt;td>manifest 内の service URL&lt;/td>
 &lt;td>公開&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Sitemap&lt;/td>
 &lt;td>&lt;code>https://touda.tohoku.ac.jp/collection/sitemap.xml&lt;/code>&lt;/td>
 &lt;td>公開（後述のとおりカバレッジ部分的）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Drupal JSON:API（&lt;code>/jsonapi&lt;/code>）&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>確認した範囲では未公開&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Drupal REST（&lt;code>?_format=json&lt;/code>）&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>500 が返る&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>OpenSearch / RSS / Atom / IIIF Search / Solr 直叩き&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>404&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>
&lt;p>サイト基盤は Drupal で動いているようで、&lt;code>?_format=hal_json&lt;/code> でリクエストすると &lt;code>application/hal+json&lt;/code> の 406 が返ってきました。&lt;code>?_format=json&lt;/code> / &lt;code>?_format=hal_json&lt;/code> は Drupal Core の RESTful Web Services（&lt;code>rest&lt;/code>）モジュール、&lt;code>/jsonapi&lt;/code> は同じく Core 同梱の JSON:API モジュールが提供する仕様で、いずれも Drupal 標準の機能ではあります。ただし Drupal 8.4 以降、これらは既定で無効になっており、管理者が明示的に有効化したうえでエンティティ単位の REST resource と権限設定を行う必要があります。touda の挙動（406 / 500 / &lt;code>/jsonapi&lt;/code> 非公開）は、エンドユーザ向けには有効化されていない状態と読めました。バルクで取得したい場合の現実的な経路は OAI-PMH になりそうでした。&lt;/p></description></item></channel></rss>