ldb-logo

ライブドアブログってタグ一覧機能がないですよね
検索してもライブドアブログの独自タグとか関係ないのばっかり出てきます
全く出てこないのでタグはカテゴリと違ってRSSとかもなさそうです

ブログパーツのタグの出し方をみてもJSでAPI呼んでるわけじゃなくて独自タグみたいに HTML に埋め込まれています
API 自体がほぼないみたいなので自動でやるのは諦めてある程度は手動、だいたい自動にすることにしました


管理画面に行くとページャだし検索できないし並び替えれないしで不満だらけなタグ画面があります

taglist


ここでネットワークを監視してみるとこんなデータを受信してます

all_entries, data, entries, pager, status

entries に今のページャのタグのリストが入っていて、 pager に今のページ数とか全部で何ページとかが入っています
ですがよくみると all_entries というのがあるんです
中身を見てみると

ld-tags

こんなのが全部のタグ分あります

これあるならページャ全部みなくてもいいじゃん!

ということで、こんなコードを管理画面でコンソールに打てばクリップボードに一覧がコピーされます
var burl= Object(location.href.match(/\/blog\/(.*?)\/config\//))[1]
if(!burl){
throw new Error("cannnot obtain blog url from this page url.")
alert("このページでは使えません")
}

var url = `http://livedoor.blogcms.jp/blog/${burl}/config/tag/tag_pager`
var sortKey = "label" // "label" or "regist_datetime"

var cp = copy // CommandLineAPI を実行する用
Array.prototype.sortBy = function(key){
return this.slice().sort((a,b) => {
return (a[key] > b[key]) ? 1 : -1
})
}

fetch(url, {credentials: "include"})
.then(e => e.json())
.then(format)

function format(obj){
cp(obj.all_entries.sortBy(sortKey).map(e => e.label).join("\n"))
console.log()
}

エラーが出なかったら適当なエディタで貼付けを押すだけで
20周年
2DS
3Gキャンペーン
5pb
AQUAPAZZA
AQUAPLUS
ARマーカー
Amazon
AmazonMasterCard
AmazonS3
:
:
:

とソート済みのタグリストが貼り付けられます


ですが all_entries にはタグがつけられた記事数の情報がないです
entries だとついてるので、元々やる予定だった 全ページを見てタグリストを作る方法をやってみます
var burl= Object(location.href.match(/\/blog\/(.*?)\/config\//))[1]
if(!burl){
throw new Error("cannnot obtain blog url from this page url.")
alert("このページでは使えません")
}

var url = `http://livedoor.blogcms.jp/blog/${burl}/config/tag/tag_pager`
var sortKey = "label" // "label" or "regist_datetime"

var cp = copy
Array.prototype.sortBy = function(key){
return this.slice().sort((a,b) => {
return (a[key] > b[key]) ? 1 : -1
})
}

fetch(url, {credentials: "include"})
.then(e => e.json())
.then(allpage)

function allpage(data){
var last = data.pager.last_page
var all_entries = []
var promise = Promise.resolve()
for(var i=1;i<=last;i++){
promise = promise
.then(nextLoad(i))
.then(wait(1000))
}
promise.then(_ => {
cp(all_entries.sortBy(sortKey))
console.log("copied to clipboard")
})

function nextLoad(page){
return function(){
return fetch(url + "?p=" + page, {credentials: "include"})
.then(e => e.json())
.then(data => {
all_entries = all_entries.concat(data.entries)
return true
})
}
}

function wait(msec){
return function(){
return new Promise(resolve => {
setTimeout(resolve, msec)
})
}
}
}
長いですがこっちも貼り付けるだけです

記事数やリンク先もある状態です
[
{
"count": "1",
"regist_datetime": "2014-08-19 15:34:42",
"article_order": "0",
"permalink": "http://nmm.blog.jp/tag/5pb",
"article_count": "1",
"tag_url": "http://nmm.blog.jp/tag/5pb",
"label": "5pb",
"id": "11716039"
},
{
"count": "1",
"regist_datetime": "2014-10-19 23:32:22",
"article_order": "0",
"permalink": "http://nmm.blog.jp/tag/AmazonMasterCard",
"article_count": "1",
"tag_url": "http://nmm.blog.jp/tag/AmazonMasterCard",
"label": "AmazonMasterCard",
"id": "11868926"
},
:
:
:

後は好きに加工すればタグ一覧を作れます

permalink と tag_url の違いですけど、片方はデフォルトのものでもう片方はタグのURLをカスタマイズした場合のものだと思ってましたが違うようでした
変更したら両方変わってました



おまけ(タグのマージ)

タグのマージを楽にする方法です
ライブドアブログのタグは大文字小文字が区別されるのでよく統一されてないタグがついてて直したいって思うんです

ライブドアブログのタグ編集機能が微妙すぎて、似たタグがあるのか調べるのすら面倒です
そこは上で書いた方法で一覧を持ってきてどうこうするとして、ページャの中から変更前のタグを見つけないと変更できないというのは困りものです

そんな面倒を直接リクエストを送ることで解決してしまいましょうってことをやります


適当なタグのマージをして送られているデータを見てみるとこんなのでした

送り先:
http://livedoor.blogcms.jp/blog/ユーザ名/config/tag/tag_merge

データ:
id:6664412   <-- 元のID
tag:TagName   <-- 先のタグ名
article_order:0   <-- 0 降順 1 昇順
article_count:1   <-- 元のタグの個数
rkey:6f2d75fe72788bd413239a1f332b1afce46   <-- パスワードみたいの


コレに合わせたデータを送ります
var burl= Object(location.href.match(/\/blog\/(.*?)\/config\//))[1]
var rkey = $("#rkey").val()
if(!burl || !rkey){
throw new Error("cannnot obtain blog url from this page url.")
alert("このページでは使えません")
}
var url = `http://livedoor.blogcms.jp/blog/${user}/config/tag/tag_merge`

function postTagXHR(url, obj){
var xhr = new XMLHttpRequest();
xhr.onload = function(){
this.status === 200 && (console.log(xhr.responseText))
}
xhr.open("POST", url)
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
xhr.send(toQueryFormat(obj))
}

function postTag(url, obj){
fetch(url, {
credentials: "same-origin",
method:"POST",
headers:{
"Content-Type": "application/x-www-form-urlencoded"
},
body: toQueryFormat(obj)
})
.then(e => e.json())
.then(obj => console.log(obj))
}

function toQueryFormat(data){
return Object.keys(data).map(name => {
return name + "=" + encodeURIComponent(data[name])
}).join("&")
}

var obj = {
id: 7441595, // 変更前のタグのID
tag: "NewTagName", // 新しいタグの文字列
article_order: 0, // タグがついた記事の並び順
rkey: rkey
}
postTag(url, obj)

postTag は 1 つでいいですが 試してる時にうまく動かなかったので 2 つになりました
必要なのは最後の一文で使う方だけです


*使い方*

タグ:from
タグID:123

から

タグ:to
タグID:321

にマージしたいとします
使うのは変更前のタグのID「123」と変更後のタグ名「to」の2つだけです


1)変更元のIDと変更先のタグ名を調べます

2)オブジェクト生成部分を書き換えます

下の方の var obj = のところです

id のコロンの後の数字を from のタグIDの「123」に書き換えます
tag のコロンの後の文字を 「to 」に書き換えます
article_order のコロンの後の数字はタグの記事リストで上に古いのが来て欲しいなら 1 に変更します

3)コードを実行します

わかりやすい確認メッセージはないですし、元に戻せないのでちょっとの打ち間違いですごく困ったことになるのでやる場合は細心の注意でやりましょう