小村のポートフォリオサイト開発(7) DjangoRestFramework はてなブログの記事取得



目次

  1. はてなブログの記事を取得するためのAPIの調査
  2. 認証方法を決める
  3. はてなブログAPI呼び出し用のAPIを用意(空処理)
  4. PythonはてなブログAPIを呼び出す



記録

はてなブログの記事を取得するためのAPIの調査



認証方法を決める

  • はてなブログAPIを利用するのに認証が必要だが、認証方法に下記がある

    • Basic認証

      • ユーザIDとパスワードによるオーソドックスな認証
      • 一番実装が簡単
      • クライアント側にパスワードをあずける必要がある
      • リクエストにユーザIDとパスワードを乗せる関係で盗聴怖い
      • そのためはてなブログAPIではHTTPSでなければBasic認証使用不可
    • WSSE認証

      • HTTPのX-WSSEヘッダを用いて認証用文字列を送信する認証手段
      • WSSE とは?
        • 「パスワードと日時とセキュリティトークンを SHA1 でハッシュしたもの」
      • どうやらHTTP通信の場合はBasic認証よりよいらしいが、HTTPSなら変わらないみたい
    • OAuth認証

      • 参考:OAuth認証をBasic認証と比較してみる
      • あれのことか!最近よくあるログイン機能!
      • GoogleアカウントとかTwitterアカウントでログインとかするやつ
      • あれのこと。外部サービスを利用した認証だね
      • クライアント自体にパスワードを保持する必要がないのがメリット
  • 調べてみて、Basic認証でいいなと判断しました

  • パスワード(APIキー)ははてなブログで管理されてるし、問題ないでしょ



はてなブログAPI呼び出し用のAPIを用意(空処理)

  • まずはblogs/captureにPOSTでアクセスすれば処理が走るようにします

  • やることは下記

    • urlsblogsをルーティング

    • viewsblogpyを用意し、空処理を実行


f:id:kom314_prog:20210814152137p:plain
f:id:kom314_prog:20210814152209p:plain
  • viewsではまだblog用のmodelを用意してませんが、ModelViewsetを使います

    • 将来的にDBを使うことは確定なので
  • ひとまず仮のmodelとして、テスト用に作成していたUserモデルを拝借します

  • その後api/blogs/captureにpostでアクセスし、正常に動作することを確認しました


f:id:kom314_prog:20210814152619p:plain



はてなブログAPIに必要な情報を環境変数に追加

  • 次にはてなブログAPIの認証で使用するAPIKeyを取り扱いましょうか

  • まずははてなブログの設定画面より、AtomPubAPI Keyを確認

  • そしてUbuntuとHerokuの環境変数HATENA_API_KEYを設定します

    • (秘密情報なのでスクショなし)
  • ついでにHATENA_API_USERHATENA_API_BLOGも設定しておきましょう



はてなブログAPIを呼び出す

f:id:kom314_prog:20210814163409p:plain
# coding: utf-8
import os
import requests

from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response

from ..models import User
from ..serializer import UserSerializer


class BlogViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    @action(detail=False, methods=['post'])
    def capture(self, request, pk=None):
        url = self.getHatenaApiUrl('entry')
        auth = self.getHatenaApiAuth()
        res = requests.get(url, auth=auth)
        return Response(res.text)

    def getHatenaApiUrl(self, action):
        HATENA_API_URL_HEADER = 'https://blog.hatena.ne.jp'
        HATENA_API_USER = os.environ.get('HATENA_API_USER')
        HATENA_API_BLOG = os.environ.get('HATENA_API_BLOG')
        HATENA_API_URL_FUTTER = 'atom'

        url = [
            HATENA_API_URL_HEADER,
            HATENA_API_USER,
            HATENA_API_BLOG,
            HATENA_API_URL_FUTTER,
            action
        ]
        return os.path.join(*url)

    def getHatenaApiAuth(self):
        HATENA_API_USER = os.environ.get('HATENA_API_USER')
        HATENA_API_KEY = os.environ.get('HATENA_API_KEY')

        return (HATENA_API_USER, HATENA_API_KEY)
  • views/blog.pyのコードを上記のように変更しました。

  • これでapi/blogs/captureにpostでアクセスすると下記レスポンスになります


f:id:kom314_prog:20210814163913p:plain



おわりに

  • Pythonで問題なくはてなブログAPIを取得ができました!!!

  • 次はこのxmlデータをjsonに加工して、いい感じにmodelに格納が必要ですね!

  • ひとまず今回はここまでにします!

  • またね~~~ちゃお!!!