アゴ乗せ日記

適当なポジティブ日記

スポンサーリンク

【はてなAPI】もらったブックマークをまとめて確認【初心者OK】

2弾目!!

前回の記事はこちら

www.agonose-nikki.com

どんなものが確認できるのか

ブックマークしてくれた人、コメント、どの記事か

を一覧で表示させる。

f:id:agonosetaro:20200330202120p:plain

経緯

これまで自分の記事につけられたブックマークを確認したことがなかった。
よくわからんが、記事を1個1個見に行かないと全部見れないのであろうか。(それは面倒くさい)

まとめてみれたら楽だなと思い作った。

結果、

素敵なコメントで満たされていた。

さっそく作ろう

準備

前回と同様、無料でPythonを実行できるGoogle Colabに書いていく。

f:id:agonosetaro:20200331194931p:plain:h200

(画像追加しました。miyutoさんコメントでお知らせありがとうございますmm)

ソース

以下のソースをそのまま貼り付ける。

import requests
import xml.etree.ElementTree as ET
import json
import pandas as pd

# --------------------------------------------------
# ここ修正ください
# --------------------------------------------------
api_url = "https://blog.hatena.ne.jp/agonosetaro/agonosetaro.hatenablog.com/atom/entry"
auth = ('ユーザID', 'APIキー')
max_page_num = 1

# --------------------------------------------------
# 記事の一覧を取得
# --------------------------------------------------
entries = []
cnt = 0
while True:
  res = requests.get(api_url, auth=auth)
  root = ET.fromstring(res.text)
  api_url = None

  for child in root:
      if 'rel' in child.attrib and child.attrib['rel'] == 'next':
        api_url = child.attrib['href']

      if child.tag.endswith('entry'):
        is_public = False
        title = None
        link = None

        for item in child:
          if item.tag.endswith('control'):
            ctrl = child.find(item.tag)
            for item in ctrl:
              if item.tag.endswith('draft'):
                is_public = ctrl.find(item.tag).text == 'no'
          if item.tag.endswith('title'):
            title = child.find(item.tag).text
          if item.tag.endswith('link') and 'rel' in item.attrib and item.attrib['rel'] == 'alternate':
            link = item.attrib['href']

        if is_public and title:
          entry = {
              'title': title,
              'link': link
          }
          entries.append(entry)
  if not api_url:
    break
  cnt = cnt + 1
  if cnt >= max_page_num:
    break
  
# --------------------------------------------------
# 各記事からブックマーク情報を取得
# --------------------------------------------------
result = {}
for entry in entries:
  bm_url = "https://b.hatena.ne.jp/entry/json/?url="
  res = requests.get(bm_url + entry['link'])
  bm_json = json.loads(res.text)

  if bm_json and 'bookmarks' in bm_json:
    for current in bm_json['bookmarks']:        
        user = {
            "name": current['user'],
            "comment": current['comment'],
        }
        if bm_json['title'] in result:
          users = result[bm_json['title']]['users']
          if users:
            users.append(user) 
          else:
            users = []
          result[bm_json['title']] = {
              "title": bm_json['title'],
              "count": result[bm_json['title']]['count'] + 1,
              "users": users
          }
        else:
          result[bm_json['title']] = {
              "title": bm_json['title'],
              "count": 1,
              "users": [user]
          }

arr = []
for key in result.keys():
  arr.append(result[key])

pd.set_option("display.max_colwidth", 200)
pd.set_option('display.max_rows', max_page_num * 100)
pd.io.json.json_normalize(arr, meta=['title'], record_path='users')

各ユーザごとに修正する部分

はてなブログの管理画面から設定 > 詳細設定 > AtomPub と進み記載されている情報をコピペする。

f:id:agonosetaro:20200330203935p:plain

ソースの以下の部分を修正する。

# --------------------------------------------------
# ここ修正ください
# --------------------------------------------------
api_url = "https://blog.hatena.ne.jp/agonosetaro/agonosetaro.hatenablog.com/atom/entry"
auth = ('ユーザID', 'APIキー')
max_page_num = 1
  • api_urlは画面上のルートエンドポイントに置き換えて、末尾に/entryを付け加える。
  • authのユーザIDは基本的に画面上の赤い下線が引いてある部分だ。
  • APIキーは画面上のAPIキーをそのまま入力
  • max_page_numは取ってくる記事のブロック数。
    • 1でだいたい10記事くらいかな(下書きは表示されない)
    • 全部取得したい場合は999999とかにする

実行

max_page_num1のままの設定にしていればすぐに結果が出る。

f:id:agonosetaro:20200330204953p:plain

表で出力したので、前回より結果が見やすくなったと思う。
(あとで前回記事の結果も見やすいように記事更新しておく)

感想

ありがてぇ。

のと全然気づけなくてごめんなさいorzの両方。

おわり

コメントって嬉しいね

以上!!

\ いつもスターやコメント、ブックマークありがとうございます! /
スポンサーリンク