html Qiita API v2で取得できる投稿のHTML形式の本文を利用してみた
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了html Qiita API v2で取得できる投稿のHTML形式の本文を利用してみた相关的知识,希望对你有一定的参考价值。
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Qiitaのrendered_bodyをつかってみた</title>
<style>
.item {
padding: 16px;
max-width: 1200px;
display: block;
font-size: 14px;
}
pre {
padding: 10px;
display: block;
overflow-x: auto;
box-sizing: inherit;
}
img {
width: 100%;
}
</style>
</head>
<body>
<div class="item"><h2>
<span id="概要" class="fragment"></span><a href="#%E6%A6%82%E8%A6%81"><i class="fa fa-link"></i></a>概要</h2>
<p><a href="https://qiita.com/api/v2/docs">Qiita API</a>が便利でよく利用しているのですが、毎回<code>curl</code> やスクリプトを組むのが面倒だったので、CLIツールを作ってみました。<del>何番煎じか数えるのはやめましたw</del></p>
<p>利用イメージ<br>
<a href="https://camo.qiitausercontent.com/b2e7cd04430f857cf4481cb8d98d6e5e5594570e/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34383534392f63326533633265632d633530312d663464632d306636342d3665663435636238316563302e706e67" target="_blank" rel="nofollow noopener"><img width="645" alt="Hyper-2.png" src="https://camo.qiitausercontent.com/b2e7cd04430f857cf4481cb8d98d6e5e5594570e/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34383534392f63326533633265632d633530312d663464632d306636342d3665663435636238316563302e706e67" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/48549/c2e3c2ec-c501-f4dc-0f64-6ef45cb81ec0.png"></a></p>
<h2>
<span id="インストール方法" class="fragment"></span><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95"><i class="fa fa-link"></i></a>インストール方法</h2>
<p>さくっと作ったので、PyPiへの登録はしていません。GitHubからソースを取得してインストールします。</p>
<div class="code-frame" data-lang="sh"><div class="highlight"><pre class="prettyprint"><span class="o">></span> git clone https://github.com/kai-kou/qiita-py-cli.git
<span class="o">></span> <span class="nb">cd </span>qiita-py-cli
<span class="o">></span> pip <span class="nb">install</span> <span class="nt">-r</span> requirements.txt
<span class="o">></span> python setup.py <span class="nb">install</span>
<span class="c"># ターミナルの再起動(bash)</span>
<span class="o">></span> <span class="nb">exec</span> <span class="nv">$SHELL</span> <span class="nt">-l</span>
<span class="c"># ターミナルの再起動(fish)</span>
<span class="o">></span> <span class="nb">exec </span>fish <span class="nt">-l</span>
</pre></div></div>
<p>アンインストールする場合は、以下のようにします。</p>
<div class="code-frame" data-lang="sh"><div class="highlight"><pre class="prettyprint"><span class="o">></span> python setup.py <span class="nb">install</span> <span class="nt">--record</span> files.txt
<span class="o">></span> <span class="nb">cat </span>files.txt | xargs <span class="nb">rm</span> <span class="nt">-rf</span>
</pre></div></div>
<p>以下の記事を参考にさせてもらいました。</p>
<p>setup.pyを用いてインストールしたモジュールのアンインストール方法<br>
<a href="https://qiita.com/orion46/items/dfe476067e499cca8535" class="autolink" id="reference-365d3ce829ab07968a82">https://qiita.com/orion46/items/dfe476067e499cca8535</a></p>
<h2>
<span id="使い方" class="fragment"></span><a href="#%E4%BD%BF%E3%81%84%E6%96%B9"><i class="fa fa-link"></i></a>使い方</h2>
<p>Qiitaのアクセストークンが必要となります。アクセストークンはQiitaに認証していると以下のURLから取得できます。</p>
<p><a href="https://qiita.com/settings/tokens/new" class="autolink">https://qiita.com/settings/tokens/new</a></p>
<p>POST系のコマンドを利用する場合にはスコープの<code>write_qiita</code> が必要になります。情報取得だけで利用するのなら、<code>read_qiita</code> があれば十分です。<br>
<a href="https://camo.qiitausercontent.com/2538bc7fa78f303eba374fa91b6383cf79c061c3/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34383534392f35633266613539612d393635332d616139302d336236652d3262326266323734623137392e706e67" target="_blank" rel="nofollow noopener"><img width="1082" alt="Qiita.png" src="https://camo.qiitausercontent.com/2538bc7fa78f303eba374fa91b6383cf79c061c3/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34383534392f35633266613539612d393635332d616139302d336236652d3262326266323734623137392e706e67" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/48549/5c2fa59a-9653-aa90-3b6e-2b2bf274b179.png"></a></p>
<p>取得できたら<code>qiita init</code> コマンドでアクセストークンを設定します。</p>
<div class="code-frame" data-lang="sh"><div class="highlight"><pre class="prettyprint"><span class="c"># アクセストークンの設定</span>
<span class="o">></span> qiita init
Qiitaのアクセストークンを入力してください:
</pre></div></div>
<p>環境変数にアクセストークンを設定することもできます。</p>
<div class="code-frame" data-lang="sh"><div class="highlight"><pre class="prettyprint"><span class="c"># bash</span>
<span class="o">></span> <span class="nb">export </span><span class="nv">QIITA_PY_CLI_ACCESS_TOKEN</span><span class="o">=</span><Qiitaのアクセストークン>
<span class="c"># fish</span>
<span class="o">></span> <span class="nb">set</span> <span class="nt">-x</span> QIITA_PY_CLI_ACCESS_TOKEN <Qiitaのアクセストークン>
</pre></div></div>
<p>アクセストークンが設定できたらコマンドを実行してみます。</p>
<div class="code-frame" data-lang="sh"><div class="highlight"><pre class="prettyprint"><span class="o">></span> qiita get_user kai_kou
<span class="o">{</span><span class="s2">"description"</span>: <span class="s2">"2004-2011 フリーランス。2011-2018 株式会社グリーティングワークスでEC、バックヤード開発をプレイングマネージャーとしてAWSを超積極的に導入。サーバレス大好きっ子。Python、Ruby、TypeScript、C#とかが好み。2018/7からCloudpackにJoin。</span><span class="se">\r\n\r\n</span><span class="s2">Qiita記事は誰かひとりの琴線に触れたらそれでいい^^"</span>, <span class="s2">"facebook_id"</span>: <span class="s2">"kokaorz"</span>, <span class="s2">"followees_count"</span>: 429, <span class="s2">"followers_count"</span>: 79, <span class="s2">"github_login_name"</span>: <span class="s2">"kai-kou"</span>, <span class="s2">"id"</span>: <span class="s2">"kai_kou"</span>, <span class="s2">"items_count"</span>: 79, <span class="s2">"linkedin_id"</span>: <span class="s2">""</span>, <span class="s2">"location"</span>: <span class="s2">"Osaka, Japan"</span>, <span class="s2">"name"</span>: <span class="s2">"甲斐 甲"</span>, <span class="s2">"organization"</span>: <span class="s2">"アイレット株式会社"</span>, <span class="s2">"permanent_id"</span>: 48549, <span class="s2">"profile_image_url"</span>: <span class="s2">"https://qiita-image-store.s3.amazonaws.com/0/48549/profile-images/1524132209"</span>, <span class="s2">"twitter_screen_name"</span>: <span class="s2">"k_aik_ou"</span>, <span class="s2">"website_url"</span>: <span class="s2">"https://twitter.com/k_aik_ou"</span><span class="o">}</span>
</pre></div></div>
<p>取得結果はJSONとなりますので、<code>jq</code> コマンドなどで整形する前提です。</p>
<div class="code-frame" data-lang="sh"><div class="highlight"><pre class="prettyprint"><span class="o">></span> qiita get_user kai_kou | jq
<span class="o">{</span>
<span class="s2">"description"</span>: <span class="s2">"2004-2011 フリーランス。2011-2018 株式会社グリーティングワークスでEC、バックヤード開発をプレイングマネージャーとしてAWSを超積極的に導入。サーバレス大好きっ子。Python、Ruby、TypeScript、C#とかが好み。2018/7からCloudpackにJoin。</span><span class="se">\r\n\r\n</span><span class="s2">Qiita記事は誰かひとりの琴線に触れたらそれでいい^^"</span>,
<span class="s2">"facebook_id"</span>: <span class="s2">"kokaorz"</span>,
<span class="s2">"followees_count"</span>: 429,
<span class="s2">"followers_count"</span>: 79,
<span class="s2">"github_login_name"</span>: <span class="s2">"kai-kou"</span>,
<span class="s2">"id"</span>: <span class="s2">"kai_kou"</span>,
<span class="s2">"items_count"</span>: 79,
<span class="s2">"linkedin_id"</span>: <span class="s2">""</span>,
<span class="s2">"location"</span>: <span class="s2">"Osaka, Japan"</span>,
<span class="s2">"name"</span>: <span class="s2">"甲斐 甲"</span>,
<span class="s2">"organization"</span>: <span class="s2">"アイレット株式会社"</span>,
<span class="s2">"permanent_id"</span>: 48549,
<span class="s2">"profile_image_url"</span>: <span class="s2">"https://qiita-image-store.s3.amazonaws.com/0/48549/profile-images/1524132209"</span>,
<span class="s2">"twitter_screen_name"</span>: <span class="s2">"k_aik_ou"</span>,
<span class="s2">"website_url"</span>: <span class="s2">"https://twitter.com/k_aik_ou"</span>
<span class="o">}</span>
</pre></div></div>
<p><code>jq</code> コマンドについては下記が参考になります。</p>
<p>jq コマンドを使う日常のご紹介<br>
<a href="https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af" class="autolink" id="reference-69c4aa23e0a46a1ae927">https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af</a></p>
<h2>
<span id="実装" class="fragment"></span><a href="#%E5%AE%9F%E8%A3%85"><i class="fa fa-link"></i></a>実装</h2>
<h3>
<span id="コマンドラインパーサー" class="fragment"></span><a href="#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%91%E3%83%BC%E3%82%B5%E3%83%BC"><i class="fa fa-link"></i></a>コマンドラインパーサー</h3>
<p>パラメータ設定はdocoptを利用しています。パーサーを自動的に作成してくれるので、お手軽です。メソッド名をいちいち書くのが面倒だったので、下記を参考にメソッドを洗い出して、必要なものだけを記載するようにしました。パラメータは、、、自力でコツコツと。。。</p>
<p>Python: オブジェクトのメソッド一覧を取得する<br>
<a href="https://qiita.com/suin/items/b15f908aaf8023a8a1fc" class="autolink" id="reference-13ec1176b6f41c018d32">https://qiita.com/suin/items/b15f908aaf8023a8a1fc</a></p>
<div class="code-frame" data-lang="python">
<div class="code-lang"><span class="bold">実装の一部抜粋</span></div>
<div class="highlight"><pre class="prettyprint"><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="n">_USAGE</span> <span class="o">=</span> <span class="s">'''
Qiita API CLI
Usage:
qiita init
qiita create_access_token [--params=<kn> --headers=<kn>]
qiita create_item [--params=<kn> --headers=<kn>]
qiita create_item_comment <item_id> [--params=<kn> --headers=<kn>]
qiita delete_access_token <token> [--params=<kn> --headers=<kn>]
qiita delete_comment <id> [--params=<kn> --headers=<kn>]
qiita delete_item <id> [--params=<kn> --headers=<kn>]
qiita follow_tag <id> [--params=<kn> --headers=<kn>]
qiita follow_user <user_id> [--params=<kn> --headers=<kn>]
qiita get_authenticated_user [--params=<kn> --headers=<kn>]
qiita get_authenticated_user_items [--params=<kn> --headers=<kn>]
qiita get_comment <id> [--params=<kn> --headers=<kn>]
qiita get_item <id> [--params=<kn> --headers=<kn>]
qiita get_item_stock <item_id> [--params=<kn> --headers=<kn>]
qiita get_tag <id> [--params=<kn> --headers=<kn>]
qiita get_tag_following <id> [--params=<kn> --headers=<kn>]
qiita get_user <id> [--params=<kn> --headers=<kn>]
qiita get_user_following <user_id> [--params=<kn> --headers=<kn>]
qiita list_item_comments <item_id> [--params=<kn> --headers=<kn>]
qiita list_item_stockers <item_id> [--params=<kn> --headers=<kn>]
qiita list_items [--params=<kn> --headers=<kn>]
qiita list_tag_items <id> [--params=<kn> --headers=<kn>]
qiita list_tags [--params=<kn> --headers=<kn>]
qiita list_user_followees <user_id> [--params=<kn> --headers=<kn>]
qiita list_user_followers <user_id> [--params=<kn> --headers=<kn>]
qiita list_user_following_tags <user_id> [--params=<kn> --headers=<kn>]
qiita list_user_items <user_id> [--params=<kn> --headers=<kn>]
qiita list_user_stocks <user_id> [--params=<kn> --headers=<kn>]
qiita list_users [--params=<kn> --headers=<kn>]
qiita stock_item <item_id> [--params=<kn> --headers=<kn>]
qiita unfollow_tag <id> [--params=<kn> --headers=<kn>]
qiita unfollow_user <user_id> [--params=<kn> --headers=<kn>]
qiita unstock_item <item_id> [--params=<kn> --headers=<kn>]
qiita update_comment <id> [--params=<kn> --headers=<kn>]
qiita update_item <id> [--params=<kn> --headers=<kn>]
Options:
--help ヘルプを表示
--params=<kn> params [default: None]
--headers=<kn> headers [default: None]
'''</span>
<span class="n">all_params</span> <span class="o">=</span> <span class="n">docopt</span><span class="p">(</span><span class="n">_USAGE</span><span class="p">)</span>
</pre></div>
</div>
<p>docopt<br>
<a href="http://docopt.org/" class="autolink" rel="nofollow noopener" target="_blank">http://docopt.org/</a></p>
<p>Pythonのdocopt使い方メモ<br>
<a href="https://qiita.com/ymdymd/items/651245d80964393b12c5" class="autolink" id="reference-89ec1283cdae53da24aa">https://qiita.com/ymdymd/items/651245d80964393b12c5</a></p>
<p>PythonでCLIツールを作成するのにdocoptでパラメータのパーサー作成を自動化する<br>
<a href="https://qiita.com/kai_kou/items/5ff0958264c56ecf0a17" class="autolink" id="reference-92c09470e62ccfd99253">https://qiita.com/kai_kou/items/5ff0958264c56ecf0a17</a></p>
<h3>
<span id="qiita-apiへのアクセス" class="fragment"></span><a href="#qiita-api%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9"><i class="fa fa-link"></i></a>Qiita APIへのアクセス</h3>
<p>下記で紹介されているラッパーを利用させてもらいました。一部APIの実装が足りていなかったので、フォークしました。</p>
<p>Qiita API v2のPythonラッパー実装した<br>
<a href="https://qiita.com/petitviolet/items/deda7b66852635264508" class="autolink" id="reference-3bb118e321de0f061bdb">https://qiita.com/petitviolet/items/deda7b66852635264508</a></p>
<p>kai-kou/qiita_py: Python Wrapper for Qiita API v2<br>
<a href="https://github.com/kai-kou/qiita_py" class="autolink" rel="nofollow noopener" target="_blank">https://github.com/kai-kou/qiita_py</a></p>
<p>基本的にはラッパーで実装されているメソッドをパラメータとして引き渡し実行しているだけです。お手軽!</p>
<div class="code-frame" data-lang="python">
<div class="code-lang"><span class="bold">実装の一部抜粋</span></div>
<div class="highlight"><pre class="prettyprint"> <span class="n">command</span> <span class="o">=</span> <span class="p">[</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">all_params</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span> <span class="o">==</span> <span class="bp">True</span><span class="p">]</span>
<span class="n">params</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">v</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">all_params</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s">r'\<.*\>'</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span> <span class="ow">and</span> <span class="n">v</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">]</span>
<span class="n">options</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">all_params</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s">r'^\-'</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span> <span class="ow">and</span> <span class="n">v</span> <span class="o">!=</span> <span class="s">'None'</span><span class="p">]</span>
<span class="n">params</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">options</span><span class="p">)</span>
<span class="p">(</span><span class="err">略</span><span class="p">)</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">QiitaClient</span><span class="p">(</span><span class="n">access_token</span><span class="o">=</span><span class="n">access_token</span><span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">command</span><span class="p">[</span><span class="mi">0</span><span class="p">])(</span><span class="o">*</span><span class="n">params</span><span class="p">)</span>
</pre></div>
</div>
<p><code>getattr</code> を利用して、メソッドを動的に呼んでいます。下記が詳しく参考になりました。</p>
<p>pythonで動的にクラスとメソッドをCallする<br>
<a href="https://yuji0602.hatenablog.jp/entry/2018/03/21/225700" class="autolink" rel="nofollow noopener" target="_blank">https://yuji0602.hatenablog.jp/entry/2018/03/21/225700</a></p>
<h2>
<span id="まとめ" class="fragment"></span><a href="#%E3%81%BE%E3%81%A8%E3%82%81"><i class="fa fa-link"></i></a>まとめ</h2>
<p>CLIツールを初めて作ってみましたが、便利なライブラリが充実しているので、とても簡単に実装することができました。</p>
<p>さくっと実装したので、テストも書いてない状態なので、テストを書いたらPyPiに登録してみたいと思います^^</p>
<h2>
<span id="参考" class="fragment"></span><a href="#%E5%8F%82%E8%80%83"><i class="fa fa-link"></i></a>参考</h2>
<p>docopt<br>
<a href="http://docopt.org/" class="autolink" rel="nofollow noopener" target="_blank">http://docopt.org/</a></p>
<p>Pythonのdocopt使い方メモ<br>
<a href="https://qiita.com/ymdymd/items/651245d80964393b12c5" class="autolink">https://qiita.com/ymdymd/items/651245d80964393b12c5</a></p>
<p>Qiita API v2のPythonラッパー実装した<br>
<a href="https://qiita.com/petitviolet/items/deda7b66852635264508" class="autolink">https://qiita.com/petitviolet/items/deda7b66852635264508</a></p>
<p>Pythonにおけるリフレクション<br>
<a href="https://qiita.com/icoxfog417/items/bf04966d4e9706eb9e04" class="autolink" id="reference-d43ee73d970089e70014">https://qiita.com/icoxfog417/items/bf04966d4e9706eb9e04</a></p>
<p>pythonで動的にクラスとメソッドをCallする<br>
<a href="https://yuji0602.hatenablog.jp/entry/2018/03/21/225700" class="autolink" rel="nofollow noopener" target="_blank">https://yuji0602.hatenablog.jp/entry/2018/03/21/225700</a></p>
<p>Python: オブジェクトのメソッド一覧を取得する<br>
<a href="https://qiita.com/suin/items/b15f908aaf8023a8a1fc" class="autolink">https://qiita.com/suin/items/b15f908aaf8023a8a1fc</a></p>
<p>Python: PyPI にないパッケージを依存パッケージにするには<br>
<a href="https://blog.amedama.jp/entry/2016/02/18/221555" class="autolink" rel="nofollow noopener" target="_blank">https://blog.amedama.jp/entry/2016/02/18/221555</a></p>
<p>Pythonで関数の引数にリスト、タプル、辞書を展開して渡す<br>
<a href="https://note.nkmk.me/python-argument-expand/" class="autolink" rel="nofollow noopener" target="_blank">https://note.nkmk.me/python-argument-expand/</a></p>
<p>Pythonでリストとタプルを相互に変換するlist(), tuple()<br>
<a href="https://note.nkmk.me/python-list-tuple-convert/" class="autolink" rel="nofollow noopener" target="_blank">https://note.nkmk.me/python-list-tuple-convert/</a></p>
<p>Pythonで対応する値に基づいて辞書型のキーをフィルターしたい<br>
<a href="https://teratail.com/questions/3731" class="autolink" rel="nofollow noopener" target="_blank">https://teratail.com/questions/3731</a></p>
<p>Python Prompt Toolkitで対話的な選択コマンドを作る<br>
<a href="https://vaaaaaanquish.hatenablog.com/entry/2017/12/25/183927" class="autolink" rel="nofollow noopener" target="_blank">https://vaaaaaanquish.hatenablog.com/entry/2017/12/25/183927</a></p>
<p>Pythonでyamlファイルを設定ファイルとして使う<br>
<a href="http://www.bokupy.com/detail/74" class="autolink" rel="nofollow noopener" target="_blank">http://www.bokupy.com/detail/74</a></p>
<p>pythonでホームディレクトリの取得<br>
<a href="https://qiita.com/sotetsuk/items/d7b32b12f94a341c79a5" class="autolink" id="reference-f5bb3aad3ede4b23371f">https://qiita.com/sotetsuk/items/d7b32b12f94a341c79a5</a></p></div>
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=desert"></script>
</body>
</html>
以上是关于html Qiita API v2で取得できる投稿のHTML形式の本文を利用してみた的主要内容,如果未能解决你的问题,请参考以下文章
json TSLint v5.7.0时点で指定できる全规则を网罗した。
html [html:标题attr的标注] HTML5のフォームインプットバリデーションの注釈は标题でできるぽい。#html
markdown 轨道を开発する环境を何度でもさくっと用意できるように
csharp DIできる状态で,动的にオブジェクトを生成する(普通にGameObject.Instantiateすると,生成されたオブジェクトにはDIされない))