Open12

Qiitaの記事バックアップしてZennにインポートする

unsoluble_sugarunsoluble_sugar

古い記事はそもそも使えなくなってるものも多いので、一旦バックアップするところまではやっておきたい。さっきQiita落ちてて自分の記事内容確認できず震えたので。

unsoluble_sugarunsoluble_sugar

goはじめてさわるのでインストール
環境はMac。とりあえず動かしたいのでbrewで入れる。

% brew install go
% go version
go version go1.15.5 darwin/amd64
% go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/unsoluble_sugar/Library/Caches/go-build"
GOENV="/Users/unsoluble_sugar/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/unsoluble_sugar/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/unsoluble_sugar/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/Cellar/go/1.15.5/libexec"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.15.5/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/n0/8tv8447n48987lzt0vgn6wr80000gn/T/go-build228143020=/tmp/go-build -gno-record-gcc-switches -fno-common"
unsoluble_sugarunsoluble_sugar

正直全然わからなかったのでとりあえずバックアップだけするのに別のツール試した。
https://qiita.com/i-tanaka730/items/6ba423abbcddde62c187
https://github.com/i-tanaka730/qiita_backupper

インストール

% git clone https://github.com/i-tanaka730/qiita_backupper

実行

% cd qiita_backupper
% ./backup.sh unsoluble_sugar md

mdファイルダウンロード

[OK!] 【入門】Electron完全に理解した
[OK!] GitHubでOrganizationから除外したユーザーが作成したissueを検索する方法
[OK!] 完全に理解した人達の「Web技術」Talk #2 勉強会レポート
[OK!] 完全に理解した人達の「Web技術」Talk #4 勉強会レポート
[OK!] HTTPステータスコード 完全に理解した
[OK!] Qiitaの記事にSpeaker DeckやSlideShareのサムネ付きリンクを貼る方法
[OK!] SlackとGitHubを連携してissueコメントやプルリク通知をチャンネルに流す方法(2020年版)
[OK!] curlでヘッダ情報やHTTPステータスコードのみを出力する方法
[OK!] claspの導入でGoogle Apps Scriptのローカル開発&git管理を実現する
[OK!] FlutterのWebViewからBasic認証ページにアクセスする
[OK!] iOS SimulatorでFlutter WebViewのlocalhost参照でページが真っ白になる件
[OK!] Android EmulatorでnetERR_CLEARTEXT_NOT_PERMITTEDが出た時の対処法
[OK!] Android EmulatorでnetERR_CONNECTION_REFUSEDが出た時の対処法
[OK!] Nodejs + Express + passportjsでローカルサーバーにBasic認証ページを立てる
[OK!] Twitter APIで使うBearer Tokenの取得方法
[OK!] 完全に理解した人達の「Web技術」Talk #1 勉強会レポート
[OK!] jqコマンドでcurlのJSONレスポンスを見やすくする
[OK!] UnityでAndroidビルドエラーUnityEditorBuildPlayerWindow+BuildMethodExceptionが出た時のライブラリ競合解決が辛過ぎて泣いた
[OK!] VTuberのホームページをGitHubのプルリクだけで更新していったらどうなるのか?企画に参戦してみた
[OK!] 挑戦者求む!GCPでWordPress立ち上げRTA
[OK!] VSCodeのファイルエクスプローラーから不要ファイルを非表示にする方法
[OK!] Flutter Meetup Tokyo #13 参加レポート
[OK!] Android Emulatorへのコピペがダルい問題
[OK!] FlutterでFirebase Authenticationを使ったGoogleアカウントログインを実装してみた
[OK!] Flutterのパッケージインストールで詰んだ初心者
[OK!] flutter packages getでCould not find a file named pubspecyaml in git@githubcom エラーが出たときの対処法
[OK!] 実機iPhoneのSafariでWebインスペクタを使ってデバッグする方法
[OK!] 実機Android端末のChromeでデベロッパーツールを使ってデバッグする方法
[OK!] FlutterでローカルのJSONファイルを読み込む
[OK!] flutter upgradeで最新バージョンへ更新されない時に確認すること
[OK!] Firebase Cloud MessagingのFCMトークン更新タイミングについて
[OK!] Dartのbuild_runnerエラー「pub finished with exit code 1」でハマった件
[OK!] FlutterからJavaObjective-Cのネイティブコードを呼んでみた
[OK!] FlutterからKotlinSwiftのネイティブコードを呼んでみた
[OK!] FlutterでHello worldを動かすまでの環境構築手順(iOS, Android)
[OK!] Googleスライドで取り消し線を使う方法
[OK!] Visual Studio Codeで「The NET CLI tools cannot be located」エラーが出続ける件の対処法
[OK!] Visual Studio Codeのミニマップを非表示にする方法
[OK!] Visual Studio CodeのReference informationを非表示にする方法
[OK!] MacでHomebrew使ってPython 37系をインストールしてみた
[OK!] curlで日本語を含むJSONレスポンスを見やすく整形する方法
[OK!] 有効期限が無期限のFacebookページアクセストークンの取得方法
[OK!] Facebook Messenger botのmmeリンクの確認方法
[OK!] FacebookのIDマッチングAPIでPage scoped IDを取得する方法
[OK!] Facebookアプリのappsecret_proofの生成手順
[OK!] Facebookアプリのapp_access_tokenの生成手順 
[OK!] Facebookアプリのapp secretの確認方法
[OK!] Facebook Messenger PlatformのSend APIで発生したエラーと原因メモ
[OK!] GASのProperties Serviceを使ってスクリプトのプロパティを読み書きをする
[OK!] JSONstringifyの出力結果を整形して可読性を向上させる
[OK!] SlackのチャンネルIDを確認する方法
[OK!] Google Apps Scriptデプロイ時に発生したclaspの「Push failed Errors」
[OK!] Macのターミナルでファイルの文字コードを確認する
[OK!] Sublime Textのステータスバーにファイルの文字コードを表示する
[OK!] Sublime Text 3のインデント設定を変更する
[OK!] Facebook APIのアクセストークンのタイプや有効期限を確認する方法
[OK!] Sequel Proを使ったMySQLのテーブルデータ追加方法
[OK!] Sublime Text 3でSlimのシンタックスハイライト
[OK!] bundle installでmysql2のgemがインストールできなかった時に試したこと
[OK!] 新しいMacでGitHubのSSH接続をするまでの環境構築手順
[OK!] bundle installで「Downloading xxx revealed dependencies not in the API or the lockfile」というエラーが出た時の対処法
[OK!] MacでRuby on Rails環境構築
[OK!] Macに複数バージョンのUnityをインストールする
[OK!] Unityで出力したXcodeプロジェクトがiOS11の実機デバッグで起動直後にクラッシュする件の対応
[OK!] Xcodeで特定プロジェクトのコード補完が効かなくなった時の対処法
[OK!] iPadでUIActivityViewControllerを呼ぶとクラッシュする現象の対応
[OK!] UnityのiOSビルドで出力されるXcodeプロジェクトの設定自動化。ファイル毎のARC無効設定を追加する
[OK!] UnityのiOSビルドで出力されるXcodeプロジェクトのEnable Bitcodeを自動でNoにする
[OK!] MacでVPNの「接続解除中」が終わらない時の対処法
[OK!] Homebrewのアップデート時に出た5つのWarningと解決方法
[OK!] MonoDevelopのソースコード折りたたみ機能を有効にする
[OK!] MonoDevelopで閉じ括弧を自動補完してくれるようにする設定
[OK!] Unityで「There are 2 audio listeners in the scene」というメッセージが表示された場合の対応
[OK!] Photon Unity Networking(PUN)のPhotonViewisMineがfalseしか返さない件
[OK!] Mac OS Xのアップデート後にEclipseが起動しなくなった時の対応
[OK!] GitHubのpushやプルリク通知をSlackに投げる
[OK!] よく使うgitコマンドのエイリアスを設定して開発効率をアップする
[OK!] GitHubのコメントでLINEスタンプライクにLGTM画像を貼り付けられるChrome拡張機能「LTTM」を使ってコミュニケーションを加速させる
[OK!] GitHubリポジトリのデフォルトブランチをdevelopに変更する
[OK!] Unity3dBuilder Pluginを使ってJenkinsでUnityのビルドを自動化。Androidのapkを作ってみた
[OK!] Jenkinsのユーザー作成と権限管理
[OK!] Jenkinsのビルド結果をSlackに通知させる
[OK!] Cocos2d-xで作ったAndroidアプリに内包されているOpenSSLのバージョンを確認する
[OK!] MacにHomebrewでインストールしたJenkinsのホームディレクトリの確認方法
[OK!] Unityのログファイル(EditorLog)を直接エディタで開く
[OK!] MonoDevelopのテーマとフォントを変更する
[OK!] MacにHomebrewを使ってJenkinsをインストールする方法
[OK!] MacにHomebrewをインストールする手順とWarningの解決方法
[OK!] ConoHaに作ったWordPressブログに独自ドメインでアクセスできるようにする方法
[OK!] Qiitaに1件も投稿していない時の画像アップロード容量の上限は月間2MBまで

やったぜ

unsoluble_sugarunsoluble_sugar

画像もDLしたかったので別のツールを試してみる(自分で作る気力が一切沸かないほどQiitaへの気持ちが薄れている)
https://github.com/yumetodo/qiita_export_all

% export QIITA_ACCESS_TOKEN=xxxxxxxxxx
% npx qiita_export_all
npx: 30個のパッケージを6.367秒でインストールしました。
info: Requesting items...
debug: request limit remain: 999/1000
info: 90 items found.

info: creating image save directory...
info: created.

info: Requesting comments/images...
debug: request limit remain: 991/1000
info: request limit remain: 991/1000
info: Request finidhed.

info: Replacing Image path...
info: Replace finished.

info: Writing items/comments...
write finished.

unsoluble_sugarunsoluble_sugar

画像DL出来たけどファイル名の規則性が謎くてちょっと困る…
画像は記事単位でまとまっているわけでもないので、これをZennとかに持っていくとなるとしんどい。

記事フォルダにhtmlが吐かれるのは良い感じ。
自分はVSCodeでmdファイルプレビューするのであまり使わないけど。

.
├── img
│   ├── 0_7.png
│   ├── 1_7.png
┊   ┊
├── items
│   ├── [ネタ]私のTLのみんながpure HTMLが何かを理解してくれない件
│   │   ├── comments
│   │   │   ├── 2017-02-02T145121+0900
│   │   │   │   ├── index.html
│   │   │   │   ├── info.json
│   │   │   │   └── README.md
│   │   │   ├── 2017-02-02T153542+0900
│   │   │   │   ├── index.html
│   │   │   │   ├── info.json
│   │   │   │   └── README.md
│   │   │   ├── 2017-02-02T160946+0900
│   │   │   │   ├── index.html
│   │   │   │   ├── info.json
│   │   │   │   └── README.md
│   │   │   ├── 2017-02-02T173054+0900
│   │   │   │   ├── index.html
│   │   │   │   ├── info.json
│   │   │   │   └── README.md
│   │   │   └── 2017-02-02T181039+0900
│   │   │       ├── index.html
│   │   │       ├── info.json
│   │   │       └── README.md
│   │   ├── index.html
│   │   ├── info.json
│   │   └── README.md
┊   ┊
unsoluble_sugarunsoluble_sugar

WindowsのPowerShell専用だけど理想的なスクリプトを作られている方が居た…
Qiita記事URLでのフォルダ・ファイル名、画像も元ファイル名で超最高のやつだった。
https://qiita.com/shiena/items/bec74e0f0c0e46644d64

unsoluble_sugarunsoluble_sugar

PowerShellスクリプト実行の権限エラーで詰まった
https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750

> PowerShell -ExecutionPolicy Bypass .\qiita-item-exporter.ps1

これで実行するとitemsフォルダ配下に記事と画像バックアップが作成される。

- items
  +- readme.md                                   # 各記事へのリンク
  +- xxxxxxxxxxxxxxxxxxxx                        # 記事のID
     +- xxxxxxxxxxxxxxxxxxxx.md                  # ダウンロードした記事
     +- readme.md                                # 画像のURLを置換した記事
     +- ffffffff-ffff-ffff-ffff-ffffffffffff.png # 記事中の画像
     +- meta.json                                # 作成日時、更新日時、タイトル、タグを保存したJSON

最高。

unsoluble_sugarunsoluble_sugar

このスクリプトで落としてきたQiitaのmdファイル、エンコードがUTF-16 LEになってた。
ZennのCLIツールで作成されるmdファイルはUTF-8なので変換が必要。