pixivのイラストをブックマークするのをブックマーク追加画面に遷移せずに行いたい

やりたい事

  • イラスト表示画面からブクマ
    • タイトル・キャプション・登録タグからグループを自動追加
  • 過不足分を手動で削除・追加


一通りパーツがそろったらグリモン化したい。
jQueryを使うとする。

イラスト表示画面でjQueryを使うにあたっての注意点

なぜか$(/*何がし*/)でindex:0に全件分のa要素が入ったjQueryオブジェクトが返ってくる件調査(jQuery AOPを使ってみた。) - 文殊堂で調べたが、
script.aculo.usとjQuery1.2.6のバッティング問題があり、
jQueryによる要素の取得が正しく行えないので、
jQuery本体が修正されるまではjQuery.makeArrayに以下のようにパッチを当ててやらないといけない。

jQuery.makeArray=function( array ) {
	var ret = [];

	if( array != null ){
		var i = array.length;
		//the window, strings and functions also have 'length'
		if( i == null || array.split || array.setInterval || array.apply )
			ret[0] = array;
		else
			while( i )
				ret[--i] = array[i];
	}
	return ret;
};

今開いているイラストをブックマークする

とりあえずのたたき台

  • 公開設定:公開
  • コメント:無し
  • グループ:引数dataのgroupに半角スペース区切りで設定


illust_idはURLから取得してくる

(function(data){
var originalData = data;
data = {};
$.each(location.search.slice(1).split('&'),function(i,n){
	var keyValue = n.split('=');
	if(keyValue[0] == 'illust_id'){
		$.extend(data,{id:keyValue[1]});
	}
});

$.extend(data,{
	mode:'add'
	,type:'illust'
	,restrict:'0'
	,comment:''
	},originalData);
$.ajax({
	type:'POST'
	,url:'http://www.pixiv.net/bookmark_add.php'
	,data:data
});

})({group:'東方 咲夜 レミリア'});

グループ一覧の取得

http://www.pixiv.net/bookmark_group_setting.phpからスクレイピングする。
Twittelienと同じように空divのinnerHTMLにHTMLを代入するのは上手く行かなかった。

	var temp = $('<div/>');
	temp.get(0).innerHTML = html;

なので、↓のグリモンの101〜105行目を参考に、HTMLからDocumentオブジェクトを作ってみた。
http://d.hatena.ne.jp/Sybian/20071217/p1
これはoAutoPagerizeのコードが元のようだ。

これ以降2008/10/15修正
$.ajax({
type:'GET'
,url:'http://www.pixiv.net/bookmark_group_setting.php'
,success:function(html){
	var frag = html.replace(/^([\n\r]|.)*?<html.*?>|<\/html([\r\n]|.)*$/ig,"");
	var htmlDoc=document.implementation.createDocument(null,"html",null);
	var r=document.createRange();
	r.setStartAfter(document.body);
	htmlDoc.documentElement.appendChild(r.createContextualFragment(frag));
	groups = $('#mypixiv_list>div[class^=bg_] a',htmlDoc).map(function(i,n){
		return $(n).text();
	}).get();
	groups.pop();
	console.info(groups);
}
});


mapメソッドとか使わないで以下のようなコードを使っているのは、
なぜか$(/*何がし*/)でindex:0に全件分のa要素が入ったjQueryオブジェクトが返ってくるため。
ブックマーク登録ページだと普通にindex:0〜nに各a要素が入ったjQueryオブジェクトが返ってくる。
謎だ。

解決したのでコードも修正した。

これ以降2008/10/15追記

タイトル・コメント・登録タグ一覧取得

title = $('title').text();
comment = $('#illust_comment').text();
tags = $('#tags a').map(function(i,n){
	return $(n).text();
}).get();

タイトル・コメント・登録タグ一覧にあるグループを絞り込む

tagPattern= new RegExp(tags.join('|'),'g');
$.grep(groups,function(n){
	if(tagPattern.test(n))return true;
	var groupPattern = new RegExp(n,'g');
	return groupPattern.test(title) || 
		groupPattern.test(comment) ;
});

TODO

  • 肝心のブックマーク登録用のDialogを出す
  • グループ一覧をクライアント側でキャッシュ
  • マッチの際の表記揺れ*1対応の為の辞書登録機能
  • グリモン化

*1:キャラクタ名なら、フルネーム、名字のみ、名前のみ、愛称など