小村のポートフォリオサイト開発(7) DjangoRestFramework はてなブログの記事取得
こんばんは、小村だよ!
下記のポートフォリオサイトを構築していくよ
- サイト:Little Village
DjangoRestFramework(以下DRF)関連の設定が完了したので、さっそく触ります!
よろしくね!
目次
記録
はてなブログの記事を取得するためのAPIの調査
まずはこれを知らなきゃどうしようもないので、検索していきます
ふむふむふむふむ!!!!
だいたい以下のことが必要そうですね
ぐちってても始まらないのでやっていきましょう!
認証方法を決める
はてなブログAPIを利用するのに認証が必要だが、認証方法に下記がある
WSSE認証
-
- 参考:OAuth認証をBasic認証と比較してみる
- あれのことか!最近よくあるログイン機能!
- GoogleアカウントとかTwitterアカウントでログインとかするやつ
- あれのこと。外部サービスを利用した認証だね
- クライアント自体にパスワードを保持する必要がないのがメリット
調べてみて、Basic認証でいいなと判断しました
はてなブログAPI呼び出し用のAPIを用意(空処理)
まずは
blogs/capture
にPOSTでアクセスすれば処理が走るようにしますやることは下記
urls
でblogs
をルーティングviews
にblogpy
を用意し、空処理を実行
views
ではまだblog用のmodelを用意してませんが、ModelViewset
を使います- 将来的にDBを使うことは確定なので
ひとまず仮のmodelとして、テスト用に作成していた
User
モデルを拝借しますその後
api/blogs/capture
にpostでアクセスし、正常に動作することを確認しました
はてなブログAPIに必要な情報を環境変数に追加
まずははてなブログの設定画面より、
AtomPub
のAPI Key
を確認そしてUbuntuとHerokuの環境変数に
HATENA_API_KEY
を設定します- (秘密情報なのでスクショなし)
ついでに
HATENA_API_USER
とHATENA_API_BLOG
も設定しておきましょう
はてなブログAPIを呼び出す
# 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でアクセスすると下記レスポンスになります