GoogleBloggerをAPI-KEY無しにFeed取得する方法 #Javascript編

2024/11/11

GoogleBlogger Javascript

t f B! P L
eyecatch 前回、概要編として、コストメリットの出るWebサイトの作り方を紹介しましたが、その中のポイントでもある、GoogleBloggerをJavascriptで読み込みするモジュールを作ったので、今回はそれを紹介したいと思います。

ソースコード

このブログの中のJavascriptラベルの一覧を取得するプログラムです。

index.html

<meta charset="utf-8"> <script type="module" src="main.js"></script> <h1>Google Blogger</h1> <div class="content"></div>

main.js

import { Blogger } from "./blogger.js" class Main{ constructor(options){ this.options = options || {} this.promise = new Promise((resolve, reject)=>{ this.resolve = resolve this.reject = reject new Blogger({ blog_id : "1302948195388337515", domain : "blog.myntinc.com", label : "Javascript", type : "posts", response : "summary", orderby : "published", }).promise.then((res)=>{ console.log(res) }) }) } finish(res){ this.resolve(res) } } switch(document.readyState){ case "complete": case "interactive": new Main() break default: window.addEventListener("DOMCOntentLoaded", (()=>new Main())) }

blogger.js

export class Blogger{ constructor(options){ this.promise = new Promise((resolve, reject)=>{ this.time = (+new Date()) this.options = options || {} this.set_callback() this.resolve = resolve this.reject = reject this.load() }) } get domain(){ if(this.options.blog_name){ return `${this.options.blog_name}.blogspot.com` } else if(this.options.domain){ return this.options.domain } else{ return null } } get type(){ switch(this.options.type){ case "pages": case "page": return "pages" case "article": case "posts": default: return "posts" } } get feed(){ // blog_idを指定すると、取得件数が多くできる const feed = this.options.blog_id ? `https://www.blogger.com/feeds/${this.options.blog_id}` : `https://${this.domain}/feeds` switch(this.type){ case "pages": return `${feed}/pages/${this.response}` case "comments": return `${feed}/comments/${this.response}` case "post_comments"://postID/comments return `${feed}/${this.options.post_id}/comments/${this.response}` case "posts": default: return `${feed}/posts/${this.response}` } } get response(){ switch(this.options.response){ case "summary": return "summary" default: return "default" } } get path(){ if(this.options.path){ return this.options.path } else if(this.options.page){ return this.options.page } } get label(){ if(!this.options.label){ return "" } // ラベルが複数(配列)ある場合(AND検索) if(this.options.label.constructor === Array){ // return "/-/" + this.options.label.join("/") return "" } else{ return `/-/${this.options.label}` } } get max_results(){ return this.options.max_results ? this.options.max_results : "" } // 並び順 (published:公開日:default , updated:更新日 ) get orderby(){ return this.options.orderby || "" } get start_index(){ return this.options.start_index || "" } // 公開日(◯日以降): yyyy-mm-dd get published_min(){ return this.options.publiched_min || "" } // 公開日(◯日以前): yyyy-mm-dd get published_max(){ return this.options.publiched_max || "" } // 原稿内検索 (A+B AND検索, A-B NOT検索 , A|B OR検索) get search(){ const datas = [] if(this.options.search && this.options.search.constructor === Array){ for(const word of this.options.search){ datas.push(word) } } else if(typeof this.options.search === "string"){ datas.push(this.options.search) } if(this.options.label && this.options.label.constructor === Array){ for(const label of this.options.label){ datas.push(`label:${label}`) } } return datas.join("|") } get query(){ const datas = [] if(this.max_results){ datas.push(`max-results=${this.max_results}`) } if(this.orderby){ datas.push(`orderby=${this.orderby}`) } if(this.start_index){ datas.push(`start-index=${this.start_index}`) } if(this.published_min){ datas.push(`published-min=${this.published_min}`) } if(this.published_max){ datas.push(`published-max=${this.published_max}`) } if(this.search){ datas.push(`q=${this.search}`) } if(this.path){ datas.push(`path=${this.path}`) } if(datas.length){ return "&"+ datas.join("&") } else{ return "" } } get url(){ if(this.options.url){ return this.options.url } else if(this.type === "pages"){ return `${this.feed}${this.label}?alt=json&callback=window.${this.callback_name}&${this.path}${this.query}` } else{ return `${this.feed}${this.label}?alt=json&callback=window.${this.callback_name}&${this.query}` } } get callback_name(){ return `blogger_callback_${this.time}` } set_callback(){ window[this.callback_name] = this.blogger_callback.bind(this) } load(){ if(!this.domain){ this.finish(null) return } const script = document.createElement("script") // console.log(this.url) script.src = this.url document.body.appendChild(script) } blogger_callback(res){ if(!res || !res.feed || !res.feed.entry){ console.warn(res) this.finish(null) return } const datas = [] for(const entry of res.feed.entry){ const url = entry.link.find(e => e.rel === "alternate").href const path = "/"+ url.split("/").slice(3).join("/") const html = entry.content ? entry.content["$t"] : "" const img = entry["media$thumbnail"] ? entry["media$thumbnail"].url : "" datas.push({ id : entry.id["$t"], date : entry.published["$t"].split("T")[0], time : entry.published["$t"].split("T")[1].split(".")[0], //09:00:00.000+09:00 title : entry.title["$t"], html : html, text : this.get_html2text(html), url : url, path : path, label : entry.category ? entry.category.map(e => e.term) : null, thumbnail : img, img : this.convert_img_size(img, "s1600"), img_middle : this.convert_img_size(img, "s800"), img_small : this.convert_img_size(img, "s400"), }) } this.finish(datas) } get_html2text(html){ const div = document.createElement("div") div.innerHTML = html return div.textContent.trim() } convert_img_size(img, size){ const sp = img.split("/") sp[7] = size return sp.join("/") } finish(res){ this.resolve(res) } }

使い方と解説

上記ソースコードを同じファイルに保存して、httpプロトコル(vscodeのGoLiveや、docker等)でブラウザアクセスすると、ブラウザコンソールに、取得したデータ(記事一覧)が配列で表示されます。
こんな感じです。 少し解説すると、index.htmlで呼び出すmain.jsは、モジュールタイプになっているので、1ファイルですが、クラス構造で記述しています。 blogger.jsのBloggerクラスに、次のようなデータを送ると、記事一覧やページ情報を返してくれるというプログラムです。 { blog_id : "1302948195388337515", domain : "blog.myntinc.com", // domain : "mynt-inc.blogspot.com", label : "Javascript", type : "posts", response : "summary", orderby : "published", // max_results : 200, } それを、new宣言につなげて、.promise.then((res)=>{...})と書くことで、ajax的に取得したデータを、表示につなげることができます。 ※表示方法は、それぞれのサイトにて自作してください。

あとがき

なんか自分で発見した裏技だと思っていたら、すでにWebで紹介している人がいました。 参考ページ : 【徹底解説】Bloggerフィードの各種パラメータと使い方 今回のソースコードのクエリ情報などの参考にもさせてもらいました。 お陰で、これから作るWebページの礎になるモジュールを作ることができました。 Webサイト制作もこれからどんどん効率化していくことでしょう。 そして、この技術も先日作った「Webデスクトップ」にも使えるので、いろいろな機能追加して行こうと思います。 Webデスクトップ : Webデスクトップの制作

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ