はじめに
本記事では、Qiita APIでの記事投稿の際に記事本文にPythonのテンプレートエンジンであるJinja2の出力を利用する方法を紹介します。
本記事自身をQiita APIとJinja2テンプレートを使って投稿しています。
テンプレートの準備
template.md.j2
というファイル名のJinja2に使うテンプレートを用意します。
本記事では、記事一覧表示のサンプル部分の表を変数で埋め込みます。
記事一覧表示のサンプル
自分の投稿記事一覧を取得して、表形式で表示します。
実行結果
テンプレート部分
テンプレート
| No | 記事 |
|:-----------|:------------|
{% for article in sample_articles -%}
| {{ loop.index }} | [{{ article.title }}]({{ article.url }}) |
{% endfor %}
記事一覧の取得
Qiita APIを使って記事を取得するPythonコードは以下を使っています。
記事一覧の取得
# Qiita APIを利用して、記事を取得する
def get_articles(query = None):
ret = []
# クエリパラメータの準備
params = {
'page': '1',
'per_page': '100'
}
if (query is not None):
params['query'] = query
req_headers = {}
url = "https://qiita.com/api/v2/items?" + urllib.parse.urlencode(params)
# Qiita APIから結果を取得
req = urllib.request.Request(url, headers=req_headers)
with urllib.request.urlopen(req) as res:
body = json.load(res)
for article in body:
ret.append({"url": article["url"], "title": article["title"]})
return ret
テンプレートエンジンでの本文作成
Jinja2を使ったMarkdown形式の投稿本文作成部分のPythonコードは以下です。
本文作成
# Jinja2を使って、投稿記事の本文を生成する
def create_article_content(sample_articles):
env = Environment(loader=FileSystemLoader('.'))
template = env.get_template('template.md.j2')
data = {'sample_articles': sample_articles}
markdown_text = template.render(data)
return markdown_text
記事投稿
Qiita APIを使って記事を投稿するPythonコードは以下を使っています。
記事の投稿
# Qiita APIを利用して、記事を投稿する
# 以下では、「"private": True」として、限定共有状態で投稿します
def post_article(token, content):
url = 'https://qiita.com/api/v2/items'
data = {
"body": content,
"private": True,
"tags": [
{
"name": "Qiita"
},
{
"name": "QiitaAPI"
},
{
"name": "Python"
},
{
"name": "jinja2"
}
],
"title": "[Python]Qiita APIとテンプレートエンジンJinja2で記事を投稿する",
}
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
}
req = urllib.request.Request(url, json.dumps(data).encode(), headers)
try:
with urllib.request.urlopen(req) as res:
body = json.load(res)
print("投稿記事URL: " + body["url"])
except urllib.error.HTTPError as err:
print(err.code)
except urllib.error.URLError as err:
print(err.reason)
メイン関数
ここまでを合わせたPythonのメイン関数部分は、以下のようになります。
メイン関数
def main():
# 自分の投稿記事を取得
sample_articles = get_articles('user:mochi_yu2')
# 投稿記事のMarkdown形式の本文をJinja2で生成
content = create_article_content(sample_articles)
# Qiitaに投稿
post_article(ACCESS_TOKEN, content)
if __name__ == "__main__":
main()
参考
本記事の作成にあたり以下の記事を参考にさせていただきました。
付録: Pythonコード全体
post_article.py
import urllib.request
import json
from jinja2 import Template, Environment, FileSystemLoader
# Qiita APIのアクセストークン
ACCESS_TOKEN = 'YOUR ACCESS_TOKEN'
# Qiita APIを利用して、記事を取得する
def get_articles(query = None):
ret = []
# クエリパラメータの準備
params = {
'page': '1',
'per_page': '100'
}
if (query is not None):
params['query'] = query
req_headers = {}
url = "https://qiita.com/api/v2/items?" + urllib.parse.urlencode(params)
# Qiita APIから結果を取得
req = urllib.request.Request(url, headers=req_headers)
with urllib.request.urlopen(req) as res:
body = json.load(res)
for article in body:
ret.append({"url": article["url"], "title": article["title"]})
return ret
# Qiita APIを利用して、記事を投稿する
# 以下では、「"private": True」として、限定共有状態で投稿します
def post_article(token, content):
url = 'https://qiita.com/api/v2/items'
data = {
"body": content,
"private": True,
"tags": [
{
"name": "Qiita"
},
{
"name": "QiitaAPI"
},
{
"name": "Python"
},
{
"name": "jinja2"
}
],
"title": "[Python]Qiita APIとテンプレートエンジンJinja2で記事を投稿する",
}
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
}
req = urllib.request.Request(url, json.dumps(data).encode(), headers)
try:
with urllib.request.urlopen(req) as res:
body = json.load(res)
print("投稿記事URL: " + body["url"])
except urllib.error.HTTPError as err:
print(err.code)
except urllib.error.URLError as err:
print(err.reason)
# Jinja2を使って、投稿記事の本文を生成する
def create_article_content(sample_articles):
env = Environment(loader=FileSystemLoader('.'))
template = env.get_template('template.md.j2')
data = {'sample_articles': sample_articles}
markdown_text = template.render(data)
return markdown_text
def main():
# 自分の投稿記事を取得
sample_articles = get_articles('user:mochi_yu2')
# 投稿記事のMarkdown形式の本文をJinja2で生成
content = create_article_content(sample_articles)
# Qiitaに投稿
post_article(ACCESS_TOKEN, content)
if __name__ == "__main__":
main()