きっかけ
Qiitaは便利だから色々投稿してるけど、これが消えたらショックだよなぁ...というのがきっかけ。
「QiitaAPI」を使えば、最低限自分のローカルに記事をバックアップしておくことはできそうだったので、
色々他の方の記事も参考にしながらツールを作ってみることにした(C#)。
アクセストークンを使った認証
アクセストークンをAuthorizationリクエストヘッダに含めることで、認証を行うことができる。
Qiita API v2ドキュメント「認証認可」
アクセストークンは、自分のアカウントの設定画面から発行できる。
使用するAPI
自分の記事一覧を取得する
Qiita API v2ドキュメント「/api/v2/authenticated_user/items」
記事を取得するコード
JSON形式でレスポンスが返ってくる。
public static List<QiitaArticleModel> Execute()
{
var wc = new WebClient();
wc.QueryString = new NameValueCollection
{
["page"] = "1",
["per_page"] = "20",
};
wc.Headers.Add("Authorization", "Bearer " + Constants.QIITA_TOKEN);
var result = wc.DownloadString(Constants.QIITA_REQUEST_URL_AUTHENTICATED_USER_ITEMS);
var articleList = JsonConvert.DeserializeObject<List<QiitaArticleModel>>(result);
return articleList;
}
JSON形式のレスポンスをデシリアライズする
モデルクラスを作成
とりあえずTitleとBodyがあればいいかな、と。
public class QiitaArticleModel
{
[JsonProperty("title")]
public string Title { get; set; }
[JsonProperty("rendered_body")]
public string RenderedBody { get; set; }
}
JsonProperty属性を使えば、プロパティ名と異なるキー名をつけることができる。
(レスポンスに含まれるキー名と異なるプロパティ名にしたいことは多々あるから)
実際にデシリアライズ
var articleList = JsonConvert.DeserializeObject<List<QiitaArticleModel>>(result);
取得した記事をファイル出力
デシリアライズで生成したモデルクラスのリストを、1件ずつ処理してHTMLファイルに出力。
ファイル名に「記事タイトル」、中身はもちろん記事の内容(HTML)。
public static void FileExport(QiitaArticleModel article)
{
var outputFileName = string.Format("{0}.html", article.Title);
var encoding = Encoding.GetEncoding("utf-8");
using (var writer = new StreamWriter(Constants.FILE_OUTPUT_DIRECTORY + outputFileName, true, encoding))
{
writer.WriteLine(article.RenderedBody);
writer.Close();
}
}
参考
C#でJSONの読み書き~Json.NETを使ってみる~
C#でJSONを扱うライブラリ「Json.NET」を使ってみました
開発状況
2018/4/11:
とりあえず「自分の記事を全部取得する」ところまで。
次はファイルに保存する処理を追加する。
2018/4/21:
JSONで返ってきたレスポンスを、デシリアライズするところを作ってみた。
「HTML形式の本文」を取得しているため、今度はHTMLファイルに出力するところを作ってみる。
2018/4/25:
いったんQiitaに投稿した記事を取得して、ファイル出力するまでの処理はできた。
今後改良したい箇所としては、「HttpClient」を使った実装にしてみるところか...