4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RSSとAWS-Lambdaを使って自社ホームページにQiita記事を掲載する方法メモ

Last updated at Posted at 2022-11-14

はじめに

RSSとAWSのLAMBDAを使って自社ホームページにQiita記事を掲載する方法のメモ
Qiitaに限らず、CORS制限のかかっているRSS取得全般で使えるのではないかと思う
本メモでは主に、
・QiitaのRSS取得ロジック(Lambda関数内)
・非同期でLambda関数呼び出し、XML形式からJsonへの変換(JS)
を記録している

株式会社Growfit HP

目次

  1. 前提条件
  2. 調べて分かったこと
  3. 解決方法
  4. 参考文献

前提条件

・QiitaのRSS(記事情報)を取得してHtmlファイル(ホームページ)に追記したい
・Html,Css,Javascriptの構成で、バックエンドの言語とサーバー非使用

調べて分かったこと

・QiitaのRSSは、JSから非同期通信する際にCORS制限があり(バックエンドの)サーバーを経由しないといけなかった
・QiitaのRSSはXML形式で取得できる
・JSでは、XML形式からJsonへの変換は自力でやる必要がある

解決方法

・AWSのLambdaでQiitaのRSS(記事情報)を取得し、それを返す関数作成
・Javascriptで上記関数を非同期通信し、取得
・xmlからjsonに変換し、表示

以下、Lambda

https://qiita.com/organizations/{組織名}/activities.atom
でorganizationの最新投稿記事4件を取得できる
urllib.requestを使い、読み込む

lambda_function.py

import json
import urllib.request

def lambda_handler(event, context):
    url = 'https://qiita.com/organizations/{会社の組織名}/activities.atom'
    with urllib.request.urlopen(url) as response:
        xml = response.read().decode("utf-8")

    return {
        'statusCode': 200,
        'body': xml
    }

以下、javascript

・fetchQiitaRss関数でfetchを使い非同期通信
・formatXmlToJson関数でjson形式にする
・createList関数でhtml要素的なものを作成
・fetchQiita関数で指定の場所にDOM作成、上記の関数を実行

api.js

/**
 * Qiitaのrssデータを取得する.
 */
function fetchQiitaRss () {
    var url = "Lambda関数で発行されたURL";
    return fetch(url)
}

/**
 * Qiita記事情報をxmlからjsonに整形して値を渡す.
 */
function formatXmlToJson (txt) {
    var parser = new DOMParser();
    var doc = parser.parseFromString(txt, "application/xml")
    var data = []
    $(doc).find("feed entry").each(function(index, item){
        data[index] = []
        data[index]['title']     = $(item).find('title').text()
        data[index]['published'] = $(item).find('published').text()
        data[index]['author']    = $(item).find('author').find('name').text()
        data[index]['url']       = $(item).find('url').text()
    })
    return data
}

/**
 * Qiita記事のDOMを生成する.
 */
 function createList(data) {
    var lists = '';
    for (var i = 0; i < data.length; i++) {
        var date = new Date(data[i]['date']);
        var year = date.getFullYear().toString().padStart(4, '0');
        var month = (date.getMonth() + 1).toString().padStart(2, '0');
        var day = date.getDate().toString().padStart(2, '0');

        lists += '<li class="top-qiita-articles__item">' +
                 '  <div class="top-qiita-articles__item-wrap">' +
                 '    <a href="' + data[i]['page_url'] + '" target="_blank">' +
                 '      <div class="top-qiita-articles__item-inner">' +
                 '        <div class="top-qiita-articles__item-inner-div">' +
                 '          <p>' + year + '-' + month + '-' + day + '</p>' +
                 '          <p class="content-title">' + data[i]['title'] + '</p>' +
                 '          <p> by ' + data[i]['author'] + '</p>' +
                 '        </div>' +
                 '      </div>' +
                 '    </a>' +
                 '  </div>' +
                 '</li>'
        ;
    }
    return lists;
}

function fetchQiita () {
    var selector = $('#anchor-qiita-articles .top-qiita-articles__contents');
    if (selector.length) {
        fetchQiitaRss()
            .then(function (response) {
                return response.text()
            })
            .then(formatXmlToJson)
            .then(createList)
            .then(function (lists) {
                selector.append(lists);
            })
    }
}

参考文献

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?