🐈

[techブログ] zennとqiitaで投稿した記事タイトルとURLをワンライナーで取得!

2023/01/01に公開約4,400字

対象読者

  • zennで投稿記事分析をGoogle Analyticsで分析する人
  • 上記対象の内、データをダウンロードをした後にURLとタイトルのマッピングがしたい人
  • 当記事内容に興味がある方

前提

zennをGoogle Analyticsに連携した後にAnalyticsからデータをダウンロードすると以下のようなURL毎のアクセス集計されたデータが取得できます。

このurlとタイトルのマッピングを手動で毎回するのがめんどくさいなという事で、何かいいやり方ないかとwebでくぐってみました。

pythonでは以下、

Next.jsでは以下、

の記事は見つかりましたが、専用の環境作るのは若干面倒です。

利用者は少なさそうですが、どうせならワンライナーで動く環境一式を作って公開しました。

尚、zennのAPIは現状あくまでzenn.dev内部用として公開されているようですので、突然の変更などの可能性はあります。

https://github.com/zenn-dev/zenn-community/issues/209

やり方

以下のリポジトリをcloneなどしてきてください。

https://github.com/chikugoy/zenn-qiita-article-info

docker-compose.ymlの中のzennとqiita用のユーザー名を設定してください。
zennだけ利用する場合はqiitaの環境変数設定は削除。
qiitaだけ利用する場合zennの環境変数設定は削除します。

    environment:
      ZENN_USER_NAME: your_name
      QIITA_USER_NAME: your_name

後はワンライナーコマンドを実行するだけです。

docker-compose up -d --build  && docker-compose exec node-dev npm install && docker-compose exec node-dev npm run dev

実行結果の例として以下のような出力が得られます。

[INFO] 05:23:11 ts-node-dev ver. 2.0.0 (using ts-node ver. 10.9.1, typescript ver. 4.9.4)
zenn: output start >>>>>>>>>>>>>>>>>>>>>>>>>>
/chiku_dev/articles/7c6760fb34e894	【セキュリティ】モバイルルーターの通信方式にはWPA3を設定して、念の為MAC Addressフィルタリングも使おう
/chiku_dev/articles/6e2c9c802c84d6	Chrome拡張機能を紹介!
/chiku_dev/articles/5b2ac9e604f87f	[2023] Web開発者おすすめのモダンなツールの紹介!
/chiku_dev/articles/beb0847136113d	爆速爆安の正規表現サービスの構築(React + Firestore + Rails)
/chiku_dev/articles/6304e03358a6ad	海外のTechメディアから技術情報を収集する
/chiku_dev/articles/a5122037d9080e	RustのWasmでDOM操作、Canvas操作、API操作のサンプルを作ってみた
/chiku_dev/articles/c9863e988f0f8f	Reactの設計手法について調べてみた
/chiku_dev/articles/632bc79a47d372	Rails API + Firestore Local Emulator 開発の雛形
/chiku_dev/articles/4cbde2f1115db0	Rails AWS DynamoDBの使用
/chiku_dev/articles/29ae4b8afa6fd4	Rails API (Docker) の作成
zenn: output end <<<<<<<<<<<<<<<<<<<<<<<<<<<<

qiita: output start >>>>>>>>>>>>>>>>>>>>>>>>>>
/chiku_dev/items/713912e32c1a3ab98e73	Windows 10(WSL2) vs Ubuntu パフォーマンス計測
/chiku_dev/items/df5258cd36761f565817	単位根(ADF)検定と分数次差分
/chiku_dev/items/e30475179724241a6f34	Python 3 エンジニア認定データ分析試験の対策
/chiku_dev/items/d18593e47b064d61f385	VSCodeからPyCharmへ移行
qiita: output end <<<<<<<<<<<<<<<<<<<<<<<<<<<<

得られた出力はタブ区切りとなっていますので、ターミナルから出力をコピーして、一旦テキストエディアにコピー。テキストエディタから出力対象を再度コピーしてスプレッドシートに貼り付けます。

Analyticsから出力されたシートにタイトル列を追加してvlookupでパスからタイトルを取得します。

vlookup例)

=VLOOKUP(B2&"*",tool_output!$B$1:$C$10,2, FALSE)

ちなみに#N/Aとなっている列は削除した記事と計測パスの後半に余計なものが付与されている為になります。 /chiku_dev/articles/017fef9df9b60f?twclid=2-4o484rfjponn82ptktokfh6ha

実行コードはシンプルでこれだけです。

import Parser from "rss-parser"
import 'dotenv/config'

const ZENN_URL = 'https://zenn.dev'
const QIITA_URL = 'https://qiita.com'

const getTitleAndPath = (feed: any, replaceUrl: string): Array<any> => {
  if (!feed || !feed.items) throw new Error(`no feed: ${replaceUrl}`);

  return feed.items.map((record: any) => {
    return {
      title: record?.title || 'empty title',
      path: (record?.link || 'empty title').replace(replaceUrl, ''),
    }
  })
}

const outputTitleAndPath = (target: string, records: Array<any>) => {
  if (!records) throw new Error(`no title and path: ${target}`);

  console.log(`${target}: output start >>>>>>>>>>>>>>>>>>>>>>>>>>`)
  records.forEach((record: any) => {
    console.log(record.path + "\t" + record.title)
  })
  console.log(`${target}: output end <<<<<<<<<<<<<<<<<<<<<<<<<<<<`)
  console.log('')
}

(async () => {
  const parser = new Parser()
  // @ts-ignore
  if (process.env.ZENN_USER_NAME) {
    // @ts-ignore
    const feedForZenn = await parser.parseURL(`${ZENN_URL}/${process.env.ZENN_USER_NAME}/feed`)
    const resultsByZenn = getTitleAndPath(feedForZenn, ZENN_URL)
    outputTitleAndPath('zenn', resultsByZenn)
  }

  // @ts-ignore
  if (process.env.QIITA_USER_NAME) {
    // @ts-ignore
    const feedForQiita = await parser.parseURL(`${QIITA_URL}/${process.env.QIITA_USER_NAME}/feed`)
    const resultsByQiita = getTitleAndPath(feedForQiita, QIITA_URL)
    outputTitleAndPath('qiita', resultsByQiita)
  }
})();

ご活用下さい!

参考

https://b.0218.jp/202104131234.html

https://zenn.dev/gakin/scraps/4cc16e7761d1ef

Discussion

ログインするとコメントできます