65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Python 和 Microsoft Graph API 将 OneNote 转换为 Markdown

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2021 年 12 月 2 日

CPOL

4分钟阅读

viewsIcon

11585

本文创建的 Python Web 应用程序将对企业开发人员非常有用,他们可以将其作为起点,并将 Markdown 转换代码替换为可将内容转换为业务所需的任何输出格式的代码。

在本文中,我们将构建一个 Flask Web 应用程序,让用户能够查看其 OneNote 页面的列表,选择一个页面,将其作为 HTML 查看,并将该页面下载为 Markdown。

OneNote 提供了出色的笔记记录和内容创建体验。用户可以将页面导出为 Word 文档和 PDF,这确实很有用。然而,许多企业要求员工以其他格式(如 Markdown)提交内容以供发布。因此,与其下载 Word 文档并手动转换,不如让我们的应用程序为我们完成这项工作。

在我们第一篇文章中,我们使用 Flask 创建了一个 Python Web 应用程序,该应用程序进行了一个简单的 Graph API 调用。我们将在此代码实践文章中继续构建此应用程序,并进行更高级的 Graph 调用以访问我们的一些文件。

要参与,您将需要

  • 我们第一篇文章中列出的项目先决条件以及我们创建的代码
  • 一些您自己的 OneNote 文件以供实验

您可以在 Github 上查看此项目的 完整代码

配置调整

首先,我们需要调整我们的配置,以便我们的应用程序可以访问我们的 OneNote 文件。

app_config.py 文件中,将 SCOPE 的值更改为以下内容:

SCOPE = ["User.Read.All", "Notes.ReadWrite.All"]

现在,当用户进行身份验证时,Microsoft 身份平台将要求他们同意代表他们授予应用程序在 Graph 中的这些权限。

我们正在进行一些更高级的 Graph API 调用,为了方便测试所有这些调用和权限,让我们转到Graph Explorer - Microsoft Graph。Graph Explorer 将确认我们应用程序的预期返回结果,并提供出色的实验体验。因为它默认使用示例已登录用户,所以请登录以使用您自己的帐户。

创建入口点

现在,让我们让我们的应用程序能够访问我们的 OneNote 文件。首先,我们在主页上提供一个链接,供用户访问他们的 OneNote 页面。

将以下代码添加到 templates/index.html 文件中

<a class="btn btn-primary btn-lg" href="/onenote-demo" role="button">OneNote Demo</a>

接下来,打开 app.py 文件,并添加以下函数来处理对 /onenote-demo 路由的调用,该路由会获取用户的所有页面。

@app.route("/onenote-demo")
def onenote_demo():
    if not session.get("user"):
        return redirect(url_for("login"))
    token = get_token(app_config.SCOPE)
    one_notes = requests.get(  # Use token to call downstream service
        'https://graph.microsoft.com/v1.0/me/onenote/pages',
        headers={'Authorization': 'Bearer ' + token['access_token']},
    ).json()        
    return render_template('onenote-demo/index.html', result=one_notes)

在进行 Graph API 调用之前,我们需要从我们在第一篇文章中构建的缓存中获取我们的令牌。我们使用会话来存储令牌,尽管如果需要,我们也可以将其配置为使用 Redis 缓存或数据库。此令牌将随 Graph 调用一起发送。

我们需要 HTML 来渲染此 onenote_demo 函数运行后的内容。在 templates/onenote-demo 目录下,创建一个名为 index.html 的文件,并包含以下代码:

{% extends "base.html" %}
{% block mainheader %}OneNote Pages{% endblock %}
{% block content %}
  <a class="btn btn-primary btn-md" href="/" role="button">Back Home</a>
  <a class="btn btn-danger btn-md" href="/logout" role="button">Logout</a>
    <ul class="list-group list-group-flush">
      {% for x in result.value %}
      <li class="list-group-item">
        <div class="row justify-content-between">
          <div class="col-4">
            {{ x.title }}
          </div>
          <div class="col-4">
            <a class="btn btn-primary btn-sm" href="/onenotepage?page_url={{ x.contentUrl }}" role="button">View as
              HTML</a>
            <a class="btn btn-primary btn-sm" href="/onenotepagemd?page_url={{ x.contentUrl }}"
              download="page_download.md" role="button">Download as Markdown</a>
            </div>
          </div>
      </li>
{% endfor %}
</ul>
{% endblock %}

此 HTML 显示了从 Graph 调用返回的所有 OneNote 页面的列表。它还提供了将它们作为 HTML 查看或将其下载为 Markdown 的按钮。

为了方便用户,我们还提供了返回主页和注销的按钮。

让我们准备好让我们的函数处理这个新页面。回到 app.py 文件,添加以下代码:

@app.route("/onenotepage")
def fetch_onenote_page():
    token = get_token(app_config.SCOPE)
    page = requests.get(  # Use token to call downstream service
        request.args['page_url'],
        headers={'Authorization': 'Bearer ' + token['access_token']},
    )
    return page.text # returns HTML

与之前一样,我们重用我们的 get_token 函数从缓存中获取令牌,如果不存在令牌,则重定向到登录页面。这将把我们的 OneNote 页面渲染为 HTML。

转换为 Markdown

我们可以利用 Python 丰富的库生态系统。其中之一是 Markdownify,它将为我们把 OneNote 转换为 Markdown。如果我们还需要其他格式,可以轻松地将其替换。

我们首先在我们的环境中安装这个库:

pip install markdownify

app.py 文件的顶部,将以下行添加到您已导入的库列表中:

from markdownify import markdownify as md

另外,添加此代码:

@app.route("/onenotepagemd")
def fetch_onenote_page_md():
    token = get_token(app_config.SCOPE)
    page = requests.get(  # Use token to call downstream service
        request.args['page_url'],
        headers={'Authorization': 'Bearer ' + token['access_token']},
    )
    markdown = md(page.text, heading_style='ATX')
    return markdown

在这里,我们获取页面,将其转换为 Markdown,然后返回转换后的页面。

应用运行

登录后,我们会看到一个简单的菜单:

当我们选择 OneNote Demo 时,应用程序会显示将我们的页面作为 HTML 查看或将它们下载为 Markdown 的选项:

选择 View as HTML 按钮将显示我们选定的 OneNote 页面:

选择 Download as Markdown 选项并在 VS Code 中打开下载的文件,应该会输出类似以下内容:

将此页面预览为渲染的 Markdown,将显示类似以下内容:

多么了不起的成就!这比手动尝试将文件转换为 Markdown 要容易得多,而且我们在几分钟内就用很少的代码创建了这个功能强大的应用程序。

您可能想进行实验,并将 Markdown 代码替换为其他格式,或者更改 Graph 调用以查看节,或创建一个新页面。此项目有很多扩展范围的潜力。我们在第一篇文章中创建的身份验证基础 — 一个安全且灵活的基础 — 是创建此类应用程序的绝佳跳板。

有关其他用例的说明,请参阅OneNote REST API 文档

本系列的最后一篇文章中,我们将再次基于第一篇文章中设置的身份验证进行构建。我们将创建一个可以创建新的 Teams 频道并邀请利益相关者提供更新以协助事件管理的应用程序。

© . All rights reserved.