C#
QiitaAPI

Qiitaの記事をバックアップしてみたい(C#)

きっかけ

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があればいいかな、と。

QiitaArticleModel.cs
    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」を使った実装にしてみるところか...