見出し画像

Pythonで自分のnote記事の閲覧数・スキ数・コメント数を取得する方法

大企業で副業を検討しているまろ@成長サポートラボです。noteにはダッシュボード機能がありますが、現在から一定期間過去の累計データしか見ることができません。そこで、定期的に閲覧状況を確認できるように、記事の情報を取得するPythonコードを作成しました。


私の特性(参考までに)

  • C言語で組込みソフト開発を10年以上経験

  • Pythonは自己流で学習(業務経験なし)

  • ChatGPTを業務で活用

Pythonの環境があれば、コピペしてある程度動作すると思います。ChatGPTに質問したり、他のnoteを参考にしたりしました。

参考にした情報

自動でスキを押すものも作れそうですが、サーバーに負荷がかかる可能性があることや、自分が見ていないものにスキすることに抵抗があるため、今回は作成しませんでした。ログインの処理についてのみ参考にしました。ちなみに動作テスト中、ログインできなくなることがありました。やはり一定時間以内に一定以上の通信を行うと問題がありそうです。

記事の情報を取得するAPIを調べました。具体的には、Copilot in Bingで「作り方を教えて!」と言ったら出てきたAPIを使用しています。何かやりたいことを実現する方法を調べるのに使えそうですね。

実際のコード

切り貼りしながら作ったのでコメントがない部分もありますが、ご了承ください。ログイン情報の部分はご自身の環境に合わせて変更してください。

import requests
import json
import traceback
import csv
from datetime import datetime

####################################################
# ログイン情報
####################################################
user_name = "noteのユーザID"
email_address = "noteログインのためのメールアドレス"
password = "noteログイン用パスワード"

# noteの認証を実施する
def note_auth(session):
    
    user_data = {
        "login":    email_address,
        "password": password
    }

    # 認証
    url = 'https://note.com/api/v1/sessions/sign_in'
    r = session.post(url,json=user_data)

    # ログインエラー判定
    r2 = json.loads(r.text)
    if "error" in r2:
        raise Exception("Login Error")
    else:
        return session

# APIからデータを取得する関数
def get_api_data(session,url,method="get",headers=""):
    # メソッド変更
    if method == "post":
        r = session.post(url,headers=headers)
    else:
        r = session.get(url,headers=headers)
    return r.json()

# 記事一覧を取得する関数
def get_articles(session):
    articles = []
    tdy = datetime.now().strftime('%Y-%m-%d')  # 今日の日付の取得
    page = 1
    while True:
        url = f'https://note.com/api/v1/stats/pv?filter=all&page={page}&sort=pv'
        data = get_api_data(session,url)
        
        if not data['data']['note_stats']:
            break
        
        for item in data['data']['note_stats']:
            id = item.get('id')
            name = item.get('name')
            read_count = item.get('read_count')
            like_count = item.get('like_count')
            comment_count = item.get('comment_count')
            if name is None:
                continue
            else:
                articles.append([tdy, id, name, read_count, like_count, comment_count])
                print('日付: ' + (str(tdy)) + ',id: ' + str(id) + ',記事タイトル: ' + name + ',閲覧数: ' + str(read_count) + ',スキ数: ' + str(like_count) + ', コメント数: ' + str(comment_count))
        page += 1
    
    return articles

# 記事の閲覧状況を取得する関数
def get_article_views(article_id):
    url = f'https://note.com/api/v2/notes/{article_id}'
    response = requests.get(url)
    
    if response.status_code != 200:
        print(f"Error: {response.status_code}")
        return None
    
    try:
        data = response.json()
        print(json.dumps(data, indent=4))  # レスポンスの内容を出力
        return data['data']['note']['read_count']
    except json.JSONDecodeError:
        print("JSON decode error")
        return None

# メイン処理
def main():
    try:
        now = datetime.now()
        print('---Start Script---')
        print(f'start :{now}')
        print('------')

        # sessionオブジェクト生成
        session = requests.session()

        # 認証
        session = note_auth(session)

        articles = get_articles(session)
        with open('./noteList.csv', 'r') as f:
            reader = csv.reader(f)
            data = list(reader)
        
        data.extend(articles)

        # 上書き保存
        with open('./noteList.csv', 'w', newline='') as f:
            writer = csv.writer(f)
            writer.writerows(data)

    except Exception as e:
        print(f'cauth {type(e)}: {e}')
        print(traceback.format_exc())

    finally:
        finish = datetime.now()
        print(' ---Finish---')
        print(f'start :{finish}')

if __name__ == "__main__":
    main()

コードの補足

コードと同じフォルダに noteList.csv を作成してください。必要に応じてファイル作成時に以下のヘッダーを設定しておいてください。

データ取得日,ID,記事タイトル,閲覧数,いいね数,コメント数

入力した情報をもとにnoteにログインし、自分自身のIDの記事一覧を取得します。ID、記事タイトル、閲覧数、いいね数、コメント数をすべての記事について取得し、データは noteList.csv に追加して保存します。

運用イメージ

定期的にこのコードを実行することで、ある時点の閲覧数が1つのファイルに保存されていきます。このcsvファイルをBIツールで取得、加工してデータを表示する予定です。自動実行、自動更新の仕組みも今後作っていきたいと思います。

利用について

Python初心者が作ったコードなので不完全な部分もあるかもしれませんが、自由に活用していただければと思います。

この記事が気に入ったらサポートをしてみませんか?