forlove
小狐狸
小狐狸
  • UID35339
  • 注册日期2011-02-26
  • 最后登录2014-12-26
  • 发帖数83
  • 经验14枚
  • 威望0点
  • 贡献值0点
  • 好评度2点
阅读:7024回复:4

油猴腳本:豆瓣助手(douban helper)的猫腻

楼主#
更多 发布于:2011-02-26 17:49
安装豆瓣助手脚本之后,浏览淘宝商品链接都会通过j.juandou.com跳转,变成作者的淘宝客链接,并且会有很大部分商品页面无法到达,自动跳转到淘宝首页~~
we10
小狐狸
小狐狸
  • UID25698
  • 注册日期2008-08-04
  • 最后登录2016-06-11
  • 发帖数73
  • 经验12枚
  • 威望0点
  • 贡献值4点
  • 好评度0点
1楼#
发布于:2011-02-26 17:49
代码中无发现  juandou链接啊


// ==UserScript==
// @name                豆瓣助手 douban helper
// @namespace           http://userscripts.org/scripts/show/49911
// @description         为豆瓣(<!-- w --><a class="postlink" href="http://www.douban.com">www.douban.com</a><!-- w -->)添加各种人性化的功能。
// @require             http://js-addon.googlecode.com/files/au ... per.js?t=8
// @include             *
// @version             5.01
/* @reason
(V5.01紧急修正:直播模式的BUG)

再一次,改变一切!
增加:相册增强!高阶相册浏览模式(含自动播放)
增加:相册在当前页面加载下一页
修正:修复相册缩略图无法拖拽打开新标签的BUG
修正:豆瓣日记楼主工具条错位的BUG
优化:讨论增强细分已注销用户的识别
优化:增加识别多个音乐播放表,提供所有音乐链接
优化:识别电影剧照全尺寸大图

提示:(不用快捷键的同学可以无视下文)
      相册浏览模式切图快捷键与默认的翻页快捷键冲突
      同学们最好改一下豆瓣助手的翻页快捷键,按 Alt+Q 可以修改
@end*/
// ==/UserScript==

/* ************************ 备注 ************************ */
/**
 * 看到这的同学,如果希望帮助完善豆瓣助手,请在豆瓣插件小组回复: http://www.douban.com/group/topic/6604219/
 * 如果是看到某些代码还合眼,直接使用就可以了,欢迎感谢我:-)
 *
 * ====== 未来计划: ======
 * 小组、友邻等加载下一页
 * 加载下一页增加动画
 * 楼层数纠正
 * 置顶小组导航条 修复
 * 浮动输入框更便捷的关闭方式
 * 阿尔法城检测是否可入住
 * 友邻工具 应用到小组讨论等版面
 * ctrl + enter 改进用于发邮件和发主题
 * chrome版我说
 * 自动加载下一页
 * 任何页面发表我说
 * 缩略图悬浮显示大图
 *
 * 豆瓣“我的推荐”太杂乱了,有分类功能吗 有些推荐只想作为个人的收藏能否隐藏呢??
 * 增加卓越当当在线试读搜索或侧栏提示
 * 话题更新提醒
 * 自定义关键字的小组话题提醒
 * 当话题有新回复时弹出提醒
 * 日记可否像相册一样加载所有分页,并且缩短为只显示标题
 * 广播小图预览,跟新浪微博看图片那个放大镜的功能。
 * 相册大图用于豆瓣社区友邻等等
 * 剧照、海报外层就可显示大图
 * 双击标题回复、双击内容引用
 * 添加过滤广播功能
 * 预读下一页、无刷新看直播
 * 刷新、翻页后仍保留 高亮/忽略
 * 默认高亮楼主
 * 高亮引用文字
 * 友邻备注
 * 关注某人(自动高亮名字或提醒有新发言)
 * 小组增强按钮 改用全局单一事件捆绑 并不再使用name 改用class
 *
 * 自动电梯美化
 * 将小组图标在两分类中来回移动会导致消失或分类失效
 * 小组可拖离分区(or dbclick?)
 * 分区可折叠
 * 输入框输入页码跳转
 * 翻页附加到浮动工具 开放DIY,可定义快捷键对应页面
 * 中英文区分搜索
 * 鼠标置于相册回复上方自动显示回复内容
 * 推荐到豆瓣
 * 可关闭更新提醒
 * 右上角的提醒和邀请
 * 楼主引用回复
 * 搜索引擎改为全部自定义
 * 建立自定义快捷键哈希表,如有一致就执行
 * 检测是否已加入该小组
 */

/* ************************ 判断执行 ************************ */

//自动更新
GM_getValue('supportHelper', true) || (unsafeWindow.__done__ = true);
typeof(Updater)!='undefined' && new Updater({name: '豆瓣助手 douban helper',id: '49911',version: '5.01'}).check();
// var Douban = /[^9]+\.douban\.com$/i.test(location.hostname);
var Douban = /\.douban\.com/i.test(location.href);
var runHelper = function(){
autoElevator();//自动电梯
exBoard();// 留言板增强
exGroup();//交流增强
albBig(); //相册增强
friendsTool();//友邻工具条
// addPageLoader();//页面加载控件
};
if(self.location == top.location && Douban){
var t1 = new Date();//时间1
hl_input(); //输入框高亮
addSearchBar(); //添加搜索条
hideMSG();//隐藏小组介绍
settingBar();//添加豆瓣助手设置按钮
addTopPager();//置顶翻页导航条

runHelper();//需重复运行的部分

musicLink();//破解音乐人下载链接
ctrlEnter();//快速回复
slideBar();//顶部滑动导航条
multiSearch();//全站搜索
sortGroup();//小组分类
settle();//浮动定位工具
addHotKey(GM_getValue('hk_db', 'alt+Q'),function(){sw_set(false)});//添加快捷键
$('#db_hp').title = '用时:' + (new Date() - t1)/1000 + ' 秒';//记录豆瓣助手耗时
}else{
parent && parent.document.getElementById('fulliframe') && (top.location = self.location);// 对付ISP广告
};
!Douban && openDouban();//秘籍 '↑↑↓↓←→←→' 打开豆瓣
showPic(); //显示链接图片

/* ************************ 基本函数准备 ************************ */

// 获取URL参数
function QueryString(item){
var sValue=location.search.match(new RegExp('[\?\&]'+item+'=([^\&]*)','i'));
return (sValue && sValue[1]!= '')?sValue[1]:0;
};

// 获取Cookie
function getCookie(c_name){
if (document.cookie.length > 0){
c_start = document.cookie.indexOf(c_name + '=');
if (c_start!=-1){
c_start = c_start + c_name.length + 1;
c_end = document.cookie.indexOf(';',c_start);
if (c_end == -1){ c_end = document.cookie.length;}
return unescape(document.cookie.substring(c_start,c_end));
}
}
return '';
};

// 自造 selector
function $$(w){
return document.querySelectorAll(w);
};
function $(select){
var name = select.substring(1);
switch(select.charAt(0)){
case '#':
return document.getElementById(name);
case '.':
return document.getElementsByClassName(name);
case '/':
return document.getElementsByTagName(name);
default:
return document.getElementsByName(select);
}
};

// 赋予多个对象统一样式
function setStyles(obj, css){
for (var o=obj,i=0,j=o.length; i<j; i++){
o.style.cssText = css;
}
};

// Xpath
function xpath(query, context){
    return document.evaluate(context?(query.indexOf('.')==0?query:'.' + query):query, context || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
};

// base64解码 进一步挖掘
function deBase64(str){
var mapDe = {}, mapEn = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
for(var i=0; i<64; i++){mapDe[mapEn] = i;};
var buf = [], arr = str.split(''), map = mapDe, n = arr.length, val, i=0, j=0;
if(n % 4)return;
while(i < n){
val = (map[arr[ i ]] << 18) | (map[arr[i+1]] << 12) | (map[arr[i+2]] << 6) | (map[arr[i+3]]);
buf.push(val>>16,val>>8 & 0xFF,val & 0xFF);
i += 4;
}
while(arr[--n] == '='){buf.pop();}
while(j<buf.length){buf[j] = String.fromCharCode(buf[j++]);}
return buf.join('');
};

// 隐藏或显示
function toggle(obj){
obj.style.display = (obj.style.display == 'none')?'':'none';
return true;
};

// keycode 转换
function getKeys(e){
var codetable={'96':'Numpad 0','97':'Numpad 1','98':'Numpad 2','99':'Numpad 3','100':'Numpad 4','101':'Numpad 5','102':'Numpad 6','103':'Numpad 7','104':'Numpad 8','105':'Numpad 9','106':'Numpad *','107':'Numpad +','108':'Numpad Enter','109':'Numpad -','110':'Numpad .','111':'Numpad /','112':'F1','113':'F2','114':'F3','115':'F4','116':'F5','117':'F6','118':'F7','119':'F8','120':'F9','121':'F10','122':'F11','123':'F12','8':'BackSpace','9':'Tab','12':'Clear','13':'Enter','16':'Shift','17':'Ctrl','18':'Alt','20':'Cape Lock','27':'Esc','32':'Spacebar','33':'Page Up','34':'Page Down','35':'End','36':'Home','37':'←','38':'↑','39':'→','40':'↓','45':'Insert','46':'Delete','144':'Num Lock','186':';:','187':'=+','188':',<','189':'-_','190':'.>','191':'/?','192':'`~','219':'[{','220':'\|','221':']}','222':'"'};
var Keys = '';
e.shiftKey && (e.keyCode != 16) && (Keys += 'shift+');
e.ctrlKey && (e.keyCode != 17) && (Keys += 'ctrl+');
e.altKey && (e.keyCode != 18) && (Keys += 'alt+');
return Keys + (codetable[e.keyCode] || String.fromCharCode(e.keyCode) || '');
};

// 即时显示快捷键
function trans_code(ID, codes){
var cobj = $('#'+ID);
cobj.value = GM_getValue(ID, codes);
cobj.addEventListener('keydown',function(e){
this.value = getKeys(e);
e.preventDefault();
e.stopPropagation();
},false);
};

// 监视并执行快捷键对应的函数
function addHotKey(codes,func){
document.addEventListener('keydown', function(e){
if ((e.target.tagName != 'INPUT') && (e.target.tagName != 'TEXTAREA') && getKeys(e) == codes){
func();
e.preventDefault();
e.stopPropagation();
}
}, false);
};

// 识别本次登录用户名
function getUserName(){
var ck = getCookie('ck'), mixName = GM_getValue('mixName', false);

if(ck){//是否已登录
if(mixName && mixName.indexOf('@'+ck) > 0){//本次登录是否上次保存用户
return mixName.replace('@'+ck, '');
}
GM_xmlhttpRequest({
method: 'GET',
url: 'http://www.douban.com/mine/',
onload: function(resp){
if(resp.status < 200 || resp.status > 300) {return;};
var name = String(resp.responseText).match(/douban\.com\/people\/([^\/]+)\//i)[1];
GM_setValue('mixName', name + '@' + getCookie('ck'));
return name;
}
});
}
return false;
};

/* ************************ 豆瓣助手设置界面 ************************ */

// 添加导航栏按钮
function settingBar(){
var db_hp = document.createElement('a');
db_hp.id = 'db_hp';
db_hp.href = 'javascript:';
db_hp.innerHTML = '豆瓣助手';
var _status = $('#status') || $('.top-nav-info')[0];
if (_status.lastChild.innerHTML){
_status.appendChild(db_hp);
}else{
_status.insertBefore(db_hp, _status.lastChild.previousSibling);
};
$('#db_hp').addEventListener('click', function(){sw_set(false);}, false);

// 加载HTML等
GM_addStyle('\
#db_div {\
background:#fff;\
position:fixed;\
width:500px;\
top:20%;\
left:30%;\
border:1px solid #bbb;\
z-index:100;\
}\
#db_shadow {\
position:absolute;\
width:100%;\
height:100%;\
top:-12px;\
left:-12px;\
border:12px solid #000;\
opacity:0.2;\
z-index:-1;\
}\
#db_div_a {\
position:absolute;\
left:-69px;\
border-top:12px solid #ccc;\
border-bottom:12px solid #ccc;\
}\
#db_div_a a {\
display:block;\
font-weight:bold;\
background:#ccc;\
padding:8px;\
border-right:1px solid #999;\
color:#000;\
opacity:0.7;\
}\
#db_div div {\
padding:20px;\
}\
#db_div label {\
cursor:pointer;\
margin:0 40px 0 0;\
padding:2px;\
}\
#db_div label:hover {\
background:#83bf73;\
color:#fff;\
-moz-border-radius:3px;\
-webkit-border-radius:3px;\
}\
#db_div textarea {\
font-size:12px;\
}\
#db_div .gact a {\
-moz-border-radius:10px;\
-webkit-border-radius:10px;\
padding:2px 20px;\
}\
#db_btm {\
background:#fff;\
display:block;\
position:absolute;\
top:-35px;\
left:-12px;\
border-right:12px solid #ccc;\
border-top:12px solid #ccc;\
border-left:12px solid #ccc;\
text-align:center;\
}\
');
var db_div = document.createElement('div');
db_div.id = 'db_div';
db_div.style.display = 'none';
db_div.innerHTML = '\
<span id="db_shadow">\
</span>\
<span id="db_div_a">\
<a href="javascript:"  style="border-right:1px solid #fff;background:#fff;opacity:1;">功能介绍</a>\
<a href="javascript:">交流增强</a>\
<a href="javascript:">相册增强</a>\
<a href="javascript:">贴图识别</a>\
<a href="javascript:">快速搜索</a>\
<a href="javascript:">其他功能</a>\
</span>\
<div id="功能介绍">\
【全部功能】(在豆瓣网右上角有设置按钮,或者按Alt+Q):\
<br>  1、只看/高亮/忽略某人发言\
<br>  2、显示小组楼层数\
<br>  3、"直播模式"(刷新或翻页后自动只看楼主)\
<br>  4、按 Ctrl + Enter 即可提交回复\
<br>  5、按 Alt+Enter 在回复框中添加个性签名(在豆瓣助手配置中心可自定义内容)\
<br>  6、引用回复按钮+浮动回复框,适用于豆瓣全站讨论页面(快捷键Shift + Enter)\
<br>  7、小组贴图:自动识别网页中的图片链接,并将其显示出来。\
<br>  8、书影音快速搜索链接,可自定义。\
<br>  9、聚焦时高亮输入框,帮助集中注意力\
<br>  10、豆瓣相册直接显示大图(在缩略图上点击鼠标中键单击显示/隐藏大图)\
<br>  11、自动隐藏小组介绍\
<br>  12、浮动定位工具,快速置顶置地,DIY常用链接\
<br>  13、友邻工具条\
<br>  14、全站搜索,在任意页面搜索书影音等\
<br>  15、顶部滑动导航条,快速跳转节省时间\
<br>  16、自动电梯,小组标题提供最后几页链接\
<br>  17、破解音乐人下载链接\
<br>  18、留言板增强,可直接回复至他人留言板\
<br>  19、自定义小组分类\
</div>\
<div id="交流增强" style="display:none;">\
<label><input type="checkbox" id="just_view" />允许只看、高亮、忽略某人发言</label>\
<br>\
<label><input id="hlcolor" size=6 onMouseover="this.style.background=\'#fff\';" onKeyup="this.style.background=this.value" onMouseout="this.style.background=this.value" />高亮背景色</label>\
<br>\
<label><input type="checkbox" id="count" />允许显示楼层数</label>\
<label><input type="checkbox" id="requote" />允许引用、回复某人发言</label>\
<br>\
<label><input type="checkbox" id="tidybar" />使用紧凑工具条</label>\
<label><input type="checkbox" id="auto_hide" />自动隐藏工具条</label>\
<br>\
<label><input type="checkbox" id="exBoard" />增强留言板功能</label>\
<br>\
<label><input id="diylen" size=4 />当引用文字超过该长度,提示是否截断</label><br>\
<textarea rows="10" cols="81" id="diyword"></textarea><br>\
交流增强适用于豆瓣小组与论坛等,快捷键:<br>\
打开浮动回复框为 Shift+Enter<br>\
退出为 Esc(会清空内容)<br>\
提交为 Ctrl+Enter(适用于豆瓣大部分输入框)<br>\
个性签名使用快捷键为 Alt+Enter,可瞬间输入设定文字。(适用于豆瓣大部分输入框)\
</div>\
<div id="相册增强" style="display:none;">\
<label><input type="checkbox" id="highslide" />开启高阶相册浏览模式</label>\
<br>\
<label><input type="checkbox" id="alb_big" />允许缩略图上点击鼠标中键显示大图</label>\
<br>\
<label><input type="checkbox" id="loadAllPic" />允许一键显示全部大图</label>\
<br>\
<label><input type="checkbox" id="down_photo" />允许批量下载大图</label>\
<br>\
<p>开启相册高阶浏览模式后,将提供前所未有的相册浏览体验。\
<br>  从此克服豆瓣看图的种种不便,看图不再是麻烦。\
<br>  此功能配合豆瓣助手自带的加载全部页面功能一起使用,效果更佳。\
<br>  (后续版本将提供更丰富的配置选项)</p>\
<br>\
</div>\
<div id="贴图识别" style="display:none;">\
<label><input type="radio" name="showpic" />不开启图片识别</label><br>\
<label><input type="radio" name="showpic" />只对豆瓣网开启</label><br>\
<label><input type="radio" name="showpic" />对所有网页开启</label><br>\
<label><input type="radio" name="showpic" />对所有网页开启,点击鼠标中键时才加载(速度最快,推荐选项)</label>\
<br>\
<p>本功能为自动识别网页中文字链接中的图片,并将其显示出来。\
<br>  主要用于克服豆瓣小组不能贴图的缺陷,方便看图。\
<br>  (此功能对所有网站适用,默认只识别豆瓣中的图片;可用鼠标中键单击显示/隐藏图片)</p>\
<br>\
</div>\
<div id="快速搜索" style="display:none;">\
<label><input type="checkbox" id="search_bar" />开启快速搜索条</label>\
<label>添加自定义搜索引擎↓</label>\
<textarea rows="10" cols="81" id="otherEngines"></textarea>\
<br><strong>添加其他引擎的使用说明:</strong><br>\
打开 “豆瓣助手” 界面后看到添加其他搜索引擎文本框里有默认的如下内容:<br>\
----------------------------------------------------------<br>\
豆瓣小组|http://www.douban.com/group/search?q={word}<br>\
百度知道|http://zhidao.baidu.com/q?word={gb:word}&amp;ct=17&amp;tn=ikaslist&amp;rn=10<br>\
----------------------------------------------------------<br>\
1、以花括号括起来的部分 {word} 代表搜索的关键字,该关键字将会以 UTF-8 方式编码。如果想要以 GB2312 方式编码,请使用{gb:word},编写地址时要注意这点。<br>\
2、以竖线 | 为分隔符,前面的 “豆瓣小组” 是在页面上显示的链接名称,后面的 http://www.douban.com/group/search?q={word} 是发起搜索的链接地址。<br>\
3、每行对应一个搜索引擎。特别注意每行中必须有个竖线 | 分隔前后两部分。<br>\
你可以仿照例子添加其他搜索,比如雅虎、wiki等等的。\
</div>\
<div id="其他功能" style="display:none;">\
<label>设置界面快捷键<input size=8 id="hk_db"/></label><br><br>\
<label><input type="checkbox" id="hl_input" />高亮焦点输入框 </label>\
<label><input type="checkbox" id="musicLink" />破解音乐人下载链接</label>\
<br>\
<label><input type="checkbox" id="hide_grpinfo" />自动隐藏小组介绍</label>\
<label><input type="checkbox" id="autoElevator" />开启自动电梯</label>\
<br>\
<label><input type="checkbox" id="settler" />开启浮动定位条 </label>\
<label><input type="checkbox" id="sortGroup" />开启小组分类 </label>\
<br>\
<label><input type="checkbox" id="multiSearch" />开启全站搜索  </label>\
<label><input type="checkbox" id="slideBar" />开启顶部滑动导航条</label>\
<br>\
<label><input type="checkbox" id="supportHelper" />通过在卓越、淘宝商城上买书支持豆瓣助手</label>\
<br>\
<br>\
<label><input type="checkbox" id="friendsTool" />开启友邻工具条</label>\
<br>\
<label>浮动定位条快捷键↓</label><br>\
<label>置顶:<input size=8 id="hk_top"/></label>\
<label>置底:<input size=8 id="hk_btm"/></label><br>\
<label>上页:<input size=8 id="hk_pre"/></label>\
<label>下页:<input size=8 id="hk_nxt"/></label><br>\
<label>浮动定位条自定义链接↓(用法与添加自定义搜索引擎类似)</label><br>\
<textarea rows="6" cols="81" id="otherLinks"></textarea>\
<br>\
<label><a href="http://userscripts.org/scripts/show/49911" target=_blank>详细介绍及使用说明</a></label>\
<label><a href="http://www.douban.com/group/topic/6604219/" target=_blank>反馈意见</a></label>\
</div>\
<span id="db_btm">\
<input type="button" title="部分选项需要刷新页面才能生效" id="s_ok" value="√ 确认">\
<input type="button" title="取消本次设定,所有选项还原" id="s_cl" value="X 取消">\
</span>\
';
$('/body')[0].appendChild(db_div);
$('#s_ok').addEventListener('click', function(){sw_set(true);}, false);
$('#s_cl').addEventListener('click', function(){sw_set(false);}, false);

$('#db_div_a').addEventListener('mouseover', function(e){
if(!e.target.id){
setStyles($$('#db_div DIV'), 'display:none;');
$('#'+e.target.innerHTML).style.display = 'block';
setStyles($$('#db_div_a A'), '');
e.target.style.cssText = 'border-right:1px solid #fff;background:#fff;opacity:1;';
}
}, false);
};

// 显示\隐藏设置栏
function sw_set(ch){
toggle($('#db_div'));
if (ch){
//写入图片识别选项
var pic_sw = $('showpic');
for (var i=0,j=pic_sw.length; i<j; i++){if (pic_sw.checked){GM_setValue('choice', i);}};
GM_setValue('hlcolor', $('#hlcolor').value);//写入高亮背景色
GM_setValue('otherEngines', $('#otherEngines').value);//写入自定义搜索引擎
GM_setValue('otherLinks', $('#otherLinks').value);//写入自定义链接
GM_setValue('diyword', $('#diyword').value);//写入个性签名
GM_setValue('diylen', parseInt($('#diylen').value) );//自定义引文截断长度
db_write('just_view');//写入只看、高亮、忽略选项
db_write('search_bar');//写入搜索条选项
db_write('hl_input');//写入高亮输入框选项
db_write('count');//写入数楼选项
db_write('auto_hide');//写入自动隐藏选项
db_write('tidybar');//写入工具条样式
db_write('requote');//写入引用回复选项
db_write('settler');//写入浮动定位工具选项
db_write('hide_grpinfo'); //写入隐藏小组介绍选项
db_write('friendsTool'); //写入友邻工具选项
db_write('multiSearch'); //写入全站搜索选项
db_write('slideBar'); //写入滑动导航条选项
db_write('autoElevator'); //写入自动电梯选项
db_write('exBoard'); //写入留言板增强选项
db_write('musicLink'); //写入音乐下载链接选项
db_write('sortGroup'); //写入小组分类选项
db_write('alb_big');//中键相册大图
db_write('highslide'); //相册浏览模式
db_write('loadAllPic'); //一键显示全部大图
db_write('down_photo'); //批量下载大图
db_write('supportHelper'); //通过在卓越、淘宝商城上买书支持豆瓣助手
GM_setValue('hk_db', $('#hk_db').value);//写入自定义搜索引擎
GM_setValue('hk_top', $('#hk_top').value);//写入置顶快捷键
GM_setValue('hk_btm', $('#hk_btm').value);//写入置底快捷键
GM_setValue('hk_pre', $('#hk_pre').value);//写入上一页快捷键
GM_setValue('hk_nxt', $('#hk_nxt').value);//写入下一页快捷键
}else{                                          
//读取高亮背景色
$('#hlcolor').value = GM_getValue('hlcolor', '#eeffee');
$('#hlcolor').style.background = GM_getValue('hlcolor');
$('showpic')[GM_getValue('choice', 1)].checked = true;//读取图片识别选项
$('#otherEngines').value = GM_getValue('otherEngines', '土豆豆单|http://so.tudou.com/psearch/{word}\n土豆视频|http://so.tudou.com/isearch/{word}\n优酷视频|http://so.youku.com/search_video/q_{word}\n优酷列表|http://so.youku.com/search_playlist/q_{word}\n豆瓣小组|http://www.douban.com/group/search?q={word}\n百度知道|http://zhidao.baidu.com/q?word={gb:word}&ct=17&tn=ikaslist&rn=10');//读取自定义搜索引擎
$('#otherLinks').value = GM_getValue('otherLinks', '我的话题|http://www.douban.com/group/my_topics\n我的评论|http://www.douban.com/mine/discussions\n');//读取自定义链接
$('#diyword').value = GM_getValue('diyword', '个性签名');//读取个性签名
$('#diylen').value = GM_getValue('diylen', 500);//自定义引文截断长度
db_read('just_view',true);//读取只看、高亮、忽略选项
db_read('search_bar',true);//读取搜索条选项
db_read('hl_input',true);//读取高亮输入框选项
db_read('count',true);//读取数楼选项
db_read('auto_hide',false);//读取自动隐藏选项
db_read('tidybar', true);//读取工具条样式
db_read('requote', true);//读取引用回复选项
db_read('settler', true);//读取浮动定位工具选项
db_read('hide_grpinfo',true);//读取隐藏小组介绍选项
db_read('friendsTool',true);//读取友邻工具选项
db_read('multiSearch',true);//读取全站搜索选项
db_read('slideBar',true);//读取滑动导航条选项
db_read('autoElevator',true);//读取自动电梯选项
db_read('exBoard',true);//读取留言板增强选项
db_read('musicLink',true);//读取音乐下载链接选项
db_read('sortGroup',true);//读取小组分类选项
db_read('alb_big',true);//中键相册大图
db_read('highslide',false);//相册浏览模式
db_read('loadAllPic',true);//一键显示全部大图
db_read('down_photo',true);//批量下载大图
db_read('supportHelper',true);//通过在卓越、淘宝商城上买书支持豆瓣助手
trans_code('hk_db', 'alt+Q');//显示豆瓣助手设置界面快捷键
trans_code('hk_top', 'W');//显示置顶快捷键
trans_code('hk_btm', 'S');//显示置底快捷键
trans_code('hk_pre', 'A');//显示上一页快捷键
trans_code('hk_nxt', 'D');//显示下一页快捷键
}              
};

//checkbox通用读取、写入函数
function db_read(id,value){$('#'+id).checked = GM_getValue(id, value);};
function db_write(id){GM_setValue(id, $('#'+id).checked);};


/* ************************ 豆瓣相册处理 ************************ */

// 相册增强
function albBig(){
var photitle = $$('.article>.photitle, .bd>.photitle, .article>.opt-bar-line')[0];// 相册、活动,  小站、阿尔法城图片墙, 剧照、海报
// GM_addStyle('.event-photo-list li {min-width:33%!important;} .photo_wrap {min-width:170px!important;}');

if (/album|photos(?!\/photo)/i.test(location.href) && photitle ){
// 添加相册工具条
photitle.innerHTML += '<br/>'
+ (GM_getValue('highslide', false)
? '<a href="javascript:" id="switchHighslide" class="btn-donate fleft" style="background:#83BF73;color:#fff;" title="点击关闭高阶浏览模式">关闭浏览模式</a>'
: '<a href="javascript:" id="switchHighslide" class="btn-donate fleft" title="点击开启高阶浏览模式,享受浏览图片的乐趣 by豆瓣助手">开启浏览模式</a>'
)
+ '&nbsp;&nbsp;&gt;<a href="javascript:" class="all_page" title="在本页面合并显示所有分页的图片,若分页较多,需耗时较长">加载所有分页</a>'
+ (GM_getValue('loadAllPic', true) && '&nbsp;&nbsp;&gt;<a href="javascript:" id="showAllBig" title="点击显示本页全部大图,再次点击全部还原">显示全部大图</a>')
+ (GM_getValue('down_photo', true) && '&nbsp;&nbsp;&gt;<a href="javascript:" id="downPhoto" title="批量下载本页全部大图的方法介绍,点击后请看右侧栏说明">批量下载大图</a>');

$('#switchHighslide').addEventListener('click', function(){
GM_setValue('highslide', !GM_getValue('highslide', false));
location.reload();
}, false);// 切换高阶浏览模式
GM_getValue('alb_big', true) && alb_all(true);// 允许缩略图上点击鼠标中键显示大图
$('.all_page')[0].addEventListener('click', function(){all_page();}, false);// 顶部加载所有分页
$('#showAllBig') && $('#showAllBig').addEventListener('click', function(){alb_all(false);}, false);// 一键显示全部大图
$('#downPhoto') && $('#downPhoto').addEventListener('click', function(){down_photo();}, false);// 批量下载大图

// 添加加载下一页模块
if($('.paginator')[0]){
GM_addStyle('.btn-donate{display:inline-block;*display:inline;zoom:1;padding:0 8px;vertical-align:middle;*vertical-align:baseline;height:19px;line-height:19px;line-height:21px\9;overflow:hidden;border:1px solid#edceba;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}a.btn-donate:link,a.btn-donate:visited{border-color:#f2ece7;background-color:#fff6ee;color:#99776b}a.btn-donate:hover,a.btn-donate:active{border-color:#edceba;background-color:#fff0e2;color:#99776b}');
var next = document.createElement('span');
next.innerHTML = '<a id="nextPicPage" style="text-align:center;width:80%;" href="javascript:;" title="将下一页加载到当前页面" class="btn-donate">加载下一页∨</a>'
+ '<a style="text-align:center;width:13%;" href="javascript:;" title="在本页面合并显示所有分页,若分页较多,需耗时较长" class="btn-donate all_page">加载所有分页</a>';
$('.paginator')[0].parentNode.appendChild(next);
$('#nextPicPage').addEventListener('click', function(){loadPicPage('next', true);}, false);// 加载下一页
$('.all_page')[1].addEventListener('click', function(){all_page();}, false);// 底部加载所有分页
};

// 相册浏览模式
/**
* Name:    Highslide JS
* Version: 4.1.9 (2010-07-05)
* Author:  Torstein Hønsi
* Support: <!-- w --><a class="postlink" href="http://www.highslide.com/support">www.highslide.com/support</a><!-- w -->
* License: <!-- w --><a class="postlink" href="http://www.highslide.com/#license">www.highslide.com/#license</a><!-- w -->
*/
if(GM_getValue('highslide', true)){

albMark();// set highslide mark

// add JS
!GM_getValue('highslide_js', false) && GM_xmlhttpRequest({
method: 'GET',
url: 'http://js-addon.googlecode.com/files/highslide.js',
onload: function(xhr){
if(xhr.status == 200){
GM_setValue('highslide_js', xhr.responseText);
var a = document.createElement('script');
a.innerHTML = xhr.responseText;
$('/head')[0].appendChild(a);
}
}
});
var a = document.createElement('script');
a.innerHTML = GM_getValue('highslide_js', '');
$('/head')[0].appendChild(a);


// add css
!GM_getValue('highslide_css', false) && GM_xmlhttpRequest({
method: 'GET',
url: 'http://js-addon.googlecode.com/files/highslide.css',
onload: function(xhr){
if(xhr.status == 200){
GM_setValue('highslide_css', xhr.responseText);
GM_addStyle(xhr.responseText);
}
}
});
GM_addStyle(GM_getValue('highslide_css', ''));

// add config
var a = document.createElement('script');
a.innerHTML = "\
hs.align = 'center';\
hs.transitions = ['expand', 'crossfade'];\
hs.fadeInOut = true;\
hs.dimmingOpacity = 0.8;\
hs.wrapperClassName = 'dark borderless floating-caption';\
hs.captionEval = 'this.thumb.alt';\
hs.marginBottom = 155;\
hs.numberPosition = 'caption';\
\
hs.addSlideshow({\
interval: 2000,\
repeat: false,\
useControls: true,\
overlayOptions: {\
className: 'text-controls',\
position: 'bottom center',\
relativeTo: 'viewport',\
offsetY: -60\
},\
thumbstrip: {\
position: 'bottom center',\
mode: 'horizontal',\
relativeTo: 'viewport'\
}\
});\
";
$('/head')[0].appendChild(a);
}
}
};

// 添加相册浏览模式标记
function albMark(){
var unitBox = $$('.photo_wrap, .event-photo-list>ul>li, .poster-col4>li');// 相册、活动,  小站、阿尔法城图片墙, 剧照、海报
for (var a,img,i=0,j=unitBox.length; i<j; i++){
img = unitBox.getElementsByTagName('img')[0];
if(img && !img.alt){
a = unitBox.getElementsByTagName('a')[0];
a.className += ' highslide';
a.setAttribute('onclick', 'return hs.expand(this, {src:"'+img.src.replace(/thumb/, /movie\.douban/i.test(location.href) ? 'raw' : 'photo')+'"});');

desc = unitBox.getElementsByTagName('div')[2] || unitBox.getElementsByTagName('div')[1];
!/\/#comments/i.test(desc.innerHTML) && (desc.innerHTML += ' <a href="'+ a.href +'">0回应</a>');
img.alt = a.title + '<br/>' + desc.innerHTML.replace(/<p>.*<\/p>/, '');//去除小站、阿尔法城图片墙的双重说明文字
}
}
};

// 加载所有分页
function all_page(){
if($('.paginator')[0]){
if($$('.photo_wrap img, .photo-item img, .cover img').length <= 18){loadPicPage('prev')};
loadPicPage('next');
}else{
alert('本相册只有一页无需加载');
}
};

// 相册加载函数
function loadPicPage(page, limit){
return loadPage(
'//*[contains(@class,"photolst") or contains(@class,"event-photo-list") or contains(@class,"poster-col4")]',
!!limit,
function(){
GM_getValue('alb_big', true) && alb_all(true);//中键大图
GM_getValue('highslide', true) && albMark();// 相册浏览模式
},
'//div[@class="paginator"]/span[@class="'+page+'"]/a'
);
};

// 批量下载大图
function down_photo(){
$('.aside')[0].innerHTML = '\
<p>1、点击“加载所有分页”(可跳过此步骤);</p>\
<p>2、点击“显示全部大图”;</p>\
<p>3、右键点击“另存为”本页面,保存类型选择“网页,全部”,即可在与页面同名文件夹下得到全部大图;</p>\
<p>(建议在图片全部显示完毕后再保存;也可使用迅雷等批量下载工具下载)</p>';
};

// 监视中键或全部显示
function alb_all(b){
// var imgs = $$('.article img');
var imgs = $$('.photo_wrap img, .photo-item img, .cover img');
for (var i=0,j=imgs.length; i<j; i++){
b && imgs.parentNode.addEventListener('mousedown', function(e){// 鼠标中键点击
if (e.button == 1){
chk_big(this);// 0左键; 1中键; 2右键
e.preventDefault();
e.stopPropagation();
};
}, false);
!b && chk_big(imgs.parentNode);// 批量大图
};
};

// 相册切换大小图
function chk_big(p){
var h = p.innerHTML;
if(/otho\.douban/i.test(h)){ // 私密相册
p.innerHTML += '';
var img = p.getElementsByTagName('img')[0];
if(!img.getAttribute('srcx')){
GM_xmlhttpRequest({
method: 'GET',
url: p.href,
onload: function(resp){
if(resp.status < 200 || resp.status > 300) {return;};
img.setAttribute('srcx', img.src);
img.src = String(resp.responseText.match(/img\ssrc="(http:\/\/otho\.[^'"]+)"/i)[1]);
},
onerror: function(){return;}
});
}else{
var l = img.src;
img.src = img.getAttribute('srcx');
img.setAttribute('srcx', l);
};
}else{ // 公共相册
if(/movie\.douban/i.test(location.href)){
p.innerHTML = /thumb/i.test(h) ? h.replace(/thumb/, 'raw') : h.replace(/photo\/raw/, 'photo/thumb');
}else{
p.innerHTML = /thumb/i.test(h) ? h.replace(/thumb/, 'photo') : h.replace(/photo\/photo/, 'photo/thumb');
};
};
var parent2 = p.parentNode.parentNode;
if(p.className == 'album_photo'){
// 小站
parent2.style.cssText = (parent2.style.width == 'auto') ? '':'width:auto;min-width:33%;';
}else if(p.parentNode.className == 'cover'){
// 剧照
parent2.style.cssText = (parent2.style.width == 'auto') ? '':'width:auto;min-width:136px;position:relative;z-index:100;';
p.getElementsByTagName('img')[0].style.cssText = 'max-width:960px;';
}else{
// 相册、活动
p.parentNode.style.width = (p.parentNode.style.width == 'auto') ? '170px': 'auto';
};
};

/* ************************ 书影音页面处理 ************************ */

// 添加搜索条
function addSearchBar() {
if ($('#mainpic') && GM_getValue('search_bar', true) && !$('.s_bar')[0]){
GM_addStyle('\
#mainpic {\
overflow: visible;\
}\
.s_bar {\
z-index: 97;\
position: absolute;\
}\
.s_lin {\
position: absolute;\
top: -62px;\
left: 0px;\
visibility: hidden;\
}\
.s_lin2 {\
position: absolute;\
top: -62px;\
left: 62px;\
visibility: hidden;\
}\
.s_bar a {\
-moz-border-radius: 7px;\
-webkit-border-radius: 7px;\
display: block;\
background: #eef9eb;\
padding: 5px;\
width: 50px;\
border: 1px solid #fff;\
line-height: 160%;\
}\
.s_bar a:hover {\
border: 1px solid #aaa;\
background: #fff;\
color: #000;\
}\
.s_bar:hover .s_tt {\
visibility: hidden;\
}\
.s_bar:hover .s_lin, .s_bar:hover .s_lin2 {\
visibility: visible;\
}\
.s_bar .s_tt {\
border: 1px solid #aaa;\
width: 90px;\
line-height: 100%;\
}\
');

var keyword = $$('h1 span')[0].textContent;//取得书影音标题
var keyWd = encodeURIComponent(keyword);
var s_div = document.createElement('div');
s_div.className = 's_bar';
s_div.innerHTML = '\
<a href="javascript:" class="s_tt">Search it \
<font color="red"><b>!</b>\
</font></a>\
<span class="s_lin">\
<a href="http://www.baidu.com/s?ie=utf-8&wd=' + keyWd + ' "target="_blank">百度一下</a>\
<a href="http://www.google.com/search?&q=' + keyWd + ' "target="_blank">Google</a>\
<a href="http://www.gougou.com/search?id=92452&search=' + keyWd + '"target="_blank">迅雷下载</a>\
<a href="http://book.gougou.com/search?restype=3&id=92452&search=' + keyWd + ' "target="_blank">迅雷书籍</a>\
<a href="http://www.verycd.com/search/folders/' + keyWd + ' "target="_blank">VeryCD</a>\
<a href="http://zh.wikipedia.org/w/index.php?search=' + keyWd + ' "target="_blank">维基百科</a>\
<a href="http://books.google.com/books?q=' + keyWd + ' "target="_blank">谷歌书籍</a>\
<a href="http://video.google.cn/videosearch?q=' + keyWd + '&www_google_domain=www.google.cn&emb=0#" target="_blank">谷歌视频</a>\
</span>\
<span class="s_lin2">\
</span>\
';
$('#mainpic').appendChild(s_div);
otherEngines(keyword);
}
};

// 添加其他搜索引擎
function otherEngines(keyword){
var engines = GM_getValue('otherEngines', '土豆豆单|http://so.tudou.com/psearch/{word}\n土豆视频|http://so.tudou.com/isearch/{word}\n优酷视频|http://so.youku.com/search_video/q_{word}\n优酷列表|http://so.youku.com/search_playlist/q_{word}\n豆瓣小组|http://www.douban.com/group/search?q={word}\n百度知道|http://zhidao.baidu.com/q?word={gb:word}&ct=17&tn=ikaslist&rn=10').split(/\n/);
for (i=0,j=engines.length; i<j; i++) {
var engine = engines.split('|');
if (engine.length > 1) {
if (engine[1].indexOf('{gb:word}') >= 0){
replace2GB(keyword, engines, engine[0]);
}else{
var searchlinks = '<a href="'+ engines.replace(engine[0] + '|', '').replace(/{word}/ig, encodeURIComponent(keyword)) +'" target="_blank" >'+ engine[0].replace(/{word}|{gb:word}/ig, keyword.replace('<', '&lt;').replace('>', '&gt;')) +'</a>';
$('.s_lin2')[0].innerHTML += searchlinks;
}
}
}
};


// 将其他搜索引擎中的搜索关键字替换成 GB2312 编码格式。编码通过查询 baidu 获得
// 感谢 Googlekingkong 的作者,这是他想出的方法
function replace2GB(keyword, enginesi, engine0){
GM_xmlhttpRequest({
method: 'GET',
url: 'http://www.baidu.com/s?ie=utf-8&wd=' + encodeURIComponent(keyword),
overrideMimeType: 'text/xml; charset=gb2312',
onload: function(resp){
if (resp.status < 200 || resp.status > 300) {
return;
};
var keywordGB = String(resp.responseText.match(/word=[^'"&]+['"&]/i)).replace(/word=|['"&]/ig,'');
var searchlinks = '<a href="'+ enginesi.replace(engine0 + '|', '').replace(/{gb:word}/ig, keywordGB) +'" target="_blank" >'+ engine0.replace(/{word}|{gb:word}/ig, keyword.replace('<', '&lt;').replace('>', '&gt;')) +'</a>';
$('.s_lin2')[0].innerHTML += searchlinks;
},
onerror: function(){
return;
}
});
};

/* ************************ 图片识别处理 ************************ */

// 检测、显示图片
function showPic(){
var a_links = document.links;
_pic_ = /^http[^\?\s]*\.(?:jpg|jpeg|jpe|jfif|bmp|png|gif|tif|tiff|ico)/i;
switch ( parseInt(GM_getValue('choice', 1)) ){
case 0:
break;
case 1:
if (Douban || location.href == 'http://userscripts.org/scripts/show/49911') {
}else{
break;
};
case 2:
for (var i=0,n=a_links.length; i<n; i++){
checkIMG(a_links);
};
break;
case 3:// 点击时才检测图片
for (var i=0,n=a_links.length; i<n; i++){
a_links.addEventListener('mousedown', function(e){
(e.button == 1) && checkIMG(this)
}, false);
};
break;
}
};

//检测图片
function checkIMG(link){
var href = link.href;
var inner = link.innerHTML;
if ( _pic_.test(href) && !/<img\s/i.test(inner) ){
link.addEventListener('mousedown', function(e){
(e.button == 1) && toggle(this.childNodes[0]) && toggle(this.childNodes[1])// 图片\链接切换
}, false);
link.innerHTML = '<img style="max-width:520px;" alt="图片载入ing..." title="点击鼠标中键可切换链接/图片 by豆瓣助手" src="' + href + '" /><span style="display:none;">' + inner + '</span>';
}
};

/* ************************ 阿尔法城, 小组, 书影音评论 + 论坛 + 相册 增强处理 ************************ */

// 隐藏小组介绍
function hideMSG(){
var h2 = $('/h2')[0] && $('/h2')[$('#pop_login')?1:0];
if(GM_getValue('hide_grpinfo',true) &&  h2 && /最近小组话题/.test(h2.innerHTML) && !$('#_toggle')){
toggle($('.bd')[2]);
$('#header').innerHTML += '<a id="_toggle" style="font-size:12px;position:absolute;top:165px;z-index:1;">&gt;显示/隐藏小组介绍&lt;</a>';
$('#_toggle').addEventListener('click',function(){toggle($('.bd')[2])} ,false);

}
};

// 自动电梯
function autoElevator(){
var reNums = xpath('//table[@class="list-b" or @class="olt"]/tbody/tr[not(@dbMark)]/td[last()-1]');
if( GM_getValue('autoElevator',true) && reNums.snapshotItem(0) &&/回应/.test(reNums.snapshotItem(0).textContent + reNums.snapshotItem(1).textContent) ){//论坛表格第一行没有“回应”
GM_addStyle('.pageNum{float:right;}');
var reply = xpath('//table[@class="list-b" or @class="olt"]/tbody/tr[not(@dbMark)]/td[1]');
for(var i=0,j=reNums.snapshotLength; i<j; i++){
var title = reply.snapshotItem(i), numWord = reNums.snapshotItem(i).textContent.replace(/[\s\D]*/g,''), num = Number(numWord), lastPage, href, linkCache = '<span class="pageNum">(';
title.parentNode.setAttribute('dbMark', '');//已处理标记,加载下一页后不重复处理
if(!isNaN(num) && num>100){
lastPage = numWord.slice(0, -2);
href = title.getElementsByTagName('a')[0].href;
// num > 400 && (linkCache += ' <a href="'+ href +'?start='+ (lastPage-3) +'00" title="倒数第四页">'+ (lastPage-2) +'</a> |');
// num > 300 && (linkCache += ' <a href="'+ href +'?start='+ (lastPage-2) +'00" title="倒数第三页">'+ (lastPage-1) +'</a> |');
num > 200 && (linkCache += ' <a href="'+ href +'?start='+ (lastPage-1) +'00" title="倒数第二页">'+ lastPage +'</a> |');
linkCache += ' <a href="'+ href +'?start='+ lastPage +'00#last" title="自动电梯:最后一页">'+ (lastPage-1+2) +'</a> ) </span>';
title.innerHTML = linkCache + title.innerHTML;
}
}
}
};

// 添加增强工具条
function exGroup(){
var ct = GM_getValue('count', true), jv = GM_getValue('just_view', true), re = GM_getValue('requote', true);
var postArea = $$('div.post-comments, ul.topic-reply, div#comments')[0];// 讨论区域
// 阿尔法城, 小组, 书影音评论, 论坛 + 相册

if ( (ct || jv || re) && postArea ){

// 书影音评论 重构
var chgArea = $$('div#comments>span.wrap')[0];
if (chgArea){
chgArea.parentNode.innerHTML = chgArea.parentNode.innerHTML
.replace(/(<h2>|<div)/, '</p><div class="group_banned"></div><br/></div>$1')// 末尾补完
.replace(/<span class="wrap">/, '<div class="dbhp"><span class="wrap">')
.replace(/<\/h3><\/span>/g, '</h3></span><p>')// 以p包围发言
.replace(/<span class="wrap">/g, '</p><div class="group_banned"></div><br/></div> <div class="dbhp"><span class="wrap">')// 首位嵌套
.replace(/<\/p><div class="group_banned"><\/div><br\/><\/div> <div class="dbhp">/, '');// 去除开头多余
};
// 论坛 + 相册 重构
if ($$('div#comments>table')[0]){
postArea.innerHTML = postArea.innerHTML
.replace(/<\/h4><\/span>/g, '</h4> </span><p>')
.replace(/<\/td><\/tr>/g, '</p></td> </tr>');
};

// 未处理的回复楼层
var replys = xpath(
'//div[contains(@class,"post-comments")]/*[contains(@class,"comment-item") and not(@dbMark)]' +
'|//ul[contains(@class,"topic-reply")]/li[not(@dbMark)]' +
'|//div[@id="comments"]/div[contains(@class,"dbhp") and not(@dbMark)]' +
'|//div[@id="comments"]/table[not(@dbMark)]'
);
var start = parseInt(QueryString('start')) + 1; //楼层起点document.body.getAttribute('startNum') ||

//工具条CSS & HTML
GM_addStyle(GM_getValue('auto_hide', false)?'.ctrl_tool{display:none;} li:hover .ctrl_tool{display:block;}':'');
var re_s = re?'<a name="db_re" href="javascript:" title="回复该用户发言" >回</a>\
<a name="db_qt" href="javascript:" title="引用该用户发言" >引</a>':'';
var re_l = re?'&gt;<a name="db_re" href="javascript:" title="回复该用户发言" >回复</a>&nbsp;&nbsp;\
&gt;<a name="db_qt" href="javascript:" title="引用该用户发言" >引用</a>&nbsp;&nbsp;':'';
var jv_s = jv?'<a name="db_jv" href="javascript:" title="只看该用户所有发言" >只</a>\
<a name="db_hl" href="javascript:" title="高亮该用户所有发言,再次点击取消高亮" >亮</a>\
<a name="db_ig" href="javascript:" title="忽略该用户所有发言" >略</a>\
<a name="db_bk" href="javascript:" title="复原所有发言" >原</a>':'';
var jv_l = jv?'&gt;<a name="db_jv" href="javascript:" title="只看该用户所有发言" >只看</a>&nbsp;&nbsp;\
&gt;<a name="db_hl" href="javascript:" title="高亮该用户所有发言,再次点击取消高亮" >高亮</a>&nbsp;&nbsp;\
&gt;<a name="db_ig" href="javascript:" title="忽略该用户所有发言" >忽略</a>&nbsp;&nbsp;\
&gt;<a name="db_bk" href="javascript:" title="复原所有发言" >复原</a>&nbsp;&nbsp;':'';
var clibtn = GM_getValue('tidybar', true) ? '&gt;'+re_s+jv_s+'&nbsp;&nbsp;' : re_l+jv_l;

//逐楼添加工具条
for (var i=0,l=replys.snapshotLength; i<l; i++){
var replyI = replys.snapshotItem(i);
var rehead = replyI.querySelector('div.author, div.bg-img-green>h4, h3>span.pl, td>span.wrap>h4');// 留言头部标题
replyI.setAttribute('dbMark', '');
if (ct && rehead.firstChild){//数楼
rehead.firstChild.insertData(0,parseInt(i) + start + '楼 ');
// document.body.setAttribute('startNum', start);
};
var bar = replyI.querySelector('div.group_banned, td:last-child');
bar && (bar.className += ' admin-lnks');
if (clibtn && bar){
var span = document.createElement('span');
span.className='gact fright ctrl_tool';
span.innerHTML = clibtn;
bar.appendChild(span);
};
};

//全部回复楼层
//捆绑函数被取消后的临时应对方法,将来改为只捆绑body,然后识别name
var allReplys = $$('div.post-comments>.comment-item, ul.topic-reply>li, div#comments>div.dbhp, div#comments>table');
for (var i=0,j=allReplys.length; i<j; i++){
if (re && $('db_re')){//快速回复
$('db_re').addEventListener('click', requote, false);
$('db_qt').addEventListener('click', requote, false);
};
if (jv && $('db_jv')){//只看高亮等
$('db_jv').addEventListener('click', just_view, false);
$('db_hl').addEventListener('click', just_view, false);
$('db_ig').addEventListener('click', just_view, false);
$('db_bk').addEventListener('click', just_view, false);
}
};

//楼主工具条
var LZbar = $$('div.note-ft, div.post-content, div.topic-opt, div.review-panel, .wr td>div.pl')[0];// 日记, 阿尔法城, 小组, 书影音评论, 论坛
if (jv && LZbar && !$('#autolift')){
var toptool = document.createElement('span');
toptool.className='fleft';
toptool.id = $$('#db-usr-profile a, .post-info>.from>a, h3>.pl20>a, .piir a, .wr a')[0].href;
toptool.innerHTML = '\
&gt;<a href="javascript:" id="db_jv" title="只看楼主发言" >只看</a>&nbsp;&nbsp;\
&gt;<a href="javascript:" id="db_hl" title="高亮楼主所有发言,再次点击取消高亮" >高亮</a>&nbsp;&nbsp;\
&gt;<a href="javascript:" id="db_ig" title="忽略楼主所有发言" >忽略</a>&nbsp;&nbsp;\
&gt;<a href="javascript:" id="db_bk" title="复原所有发言" >复原</a>&nbsp;&nbsp;\
&gt;<a href="javascript:" id="livemod" title="开启直播模式,刷新及翻页后自动只看楼主" >直播模式</a>&nbsp;&nbsp;\
&gt;<a href="javascript:" id="autolift" title="点击自动生成电梯链接" >电梯助手</a>&nbsp;&nbsp;';
LZbar.appendChild(toptool);

$('#db_jv').addEventListener('click', just_view, false);
$('#db_hl').addEventListener('click', just_view, false);
$('#db_ig').addEventListener('click', just_view, false);
$('#db_bk').addEventListener('click', just_view, false);

//直播按钮
$('#livemod').addEventListener('click', function(){
location.href = location.href.replace(location.search,'') + '?jv=' + xpath('//a[contains(@href,"/people/") and not(./child::img)]', this.parentNode.parentNode.parentNode).snapshotItem(0).href.match(/people\/([^\/\s]+)\/?/)[1];
}, false);

// 电梯助手
$('#autolift').addEventListener('click', function(){
if($('.paginator')[0]){
var autolift = '请把以下内容粘帖进帖子\n直达电梯:';
for (var p=$$('.aside .paginator>a'),i=0,l=p.length; i<l; i++){
autolift += '\n第' + p.textContent + '页:' + p.href;
}
var re_text = $('#re_text');
re_text.value += autolift + '#last\nby Douban Helper';
$('#re_f').style.display = 'block';
re_text.focus();
}else{
alert('只有一页无需电梯');
}
}, false);
};

// 检测是否直播模式
islivemod();

if (re && !$('#re_f')){// 添加快速回复框
var re_f = document.createElement('div');
re_f.id = 're_f';
re_f.style.cssText = 'position:fixed;top:25%;border:1px solid #ccc;display:none;';
var action = /group|forum/.test(location.href)?'add_comment':'?post=ok#last';
re_f.innerHTML = '\
<form name="comment_form" method="post" action="'+ action +'" >\
<div style="display: none;"><input name="ck" value='+ getCookie('ck') +' type="hidden"></div>\
<textarea id="re_text" name="rv_comment" rows="20" style="font-size:12px;font-family:Arial;width:310px;border:0px;border-bottom:1px solid #ccc;"></textarea><br>\
<input value="加上去" type="submit">\
<input value="取消" type="button" onClick="document.getElementById(\'re_f\').style.display=\'none\'">\
<input value="清空" type="button" onClick="document.getElementById(\'re_text\').value=\'\';document.getElementById(\'re_text\').focus();">\
<a class="fright gact" href="javascript:;" title=" \n快捷键:\n打开为Shift+Enter\n退出为Esc(会清空内容)\n提交为Ctrl+Enter\n个性签名为Alt+Enter(在豆瓣助手中设置)。\n\n在输入框内除Ctrl+Enter以及Esc外,其他快捷键无效。\n发言失败时,请自行判断是否已经登录并有权发言。" onClick="document.getElementById(\'re_text\').value+=this.title;document.getElementById(\'re_text\').focus();">[使用说明]</a>\
<a class="fright gact" href="javascript:;" title=" \n'+GM_getValue('diyword', '个性签名')+'" onClick="document.getElementById(\'re_text\').value+=this.title;document.getElementById(\'re_text\').focus();">[个性签名]</a>\
</form>';
$('.aside')[0].appendChild(re_f);

//修复豆瓣相册在输入框内按方向键翻页的UBG
unsafeWindow.input_ban && unsafeWindow.input_ban();

//加载 Shift + Enter 开关回复框快捷键
addHotKey('shift+Enter',function(){
var re_text = $('#re_text');
toggle($('#re_f'));
re_text.focus();
});
//退出快捷键为 Esc
$('#re_f').addEventListener('keydown', function(e){
if (e.keyCode == '27'){
toggle($('#re_f'));
$('#re_text').value = '';
}
}, false);
//个性签名快捷键为 Alt + Enter
for(var i=0,j=$('rv_comment').length;i<j;i++){
$('rv_comment').addEventListener('keydown', function(e){
if (e.altKey && e.keyCode == '13'){
this.value += '\n'+ GM_getValue('diyword', '个性签名');
}
}, false);
}
}
}
};

// 只看\高亮\忽略\复原 操作
function just_view(urlmsg){
var isLive = (typeof(urlmsg) == 'string')?true:false;// 是否直播
var todo = isLive ? 'db_jv' : (this.name || this.id);// 点击按钮类别
var parent_3 = isLive ? '' : this.parentNode.parentNode.parentNode;// 加三元选择符是为了兼容“直播模式”
var clickNameUrl = isLive ? urlmsg : (this.parentNode.id || xpath('//a[contains(@href,"/people/") and not(./child::img)]', parent_3).snapshotItem(0).href).match(/people\/([^\/\s]+)\/?/)[1];// 楼主||楼层发言人url
var replys = $$('div.post-comments>.comment-item, ul.topic-reply>li, div#comments>div.dbhp, div#comments>table');
for (var i=0,j=replys.length; i<j; i++){
var reply = replys;
var isit = (xpath('//a[contains(@href,"/people/")]', reply).snapshotItem(0).href.indexOf(clickNameUrl) >= 0)?true:false;
if (todo == 'db_jv'){
reply.style.display = isit?'':'none';
}else if(todo == 'db_hl' && isit){
reply.style.background = (reply.style.background)?'':GM_getValue('hlcolor', '#eeffee');
}else if(todo == 'db_ig' && isit){
reply.style.display = 'none';
}else if(todo == 'db_bk'){
reply.style.display = '';
reply.style.background = '';
}
}
};

// 直播模式
function islivemod(){
var name = QueryString('jv');
if (name !== 0){
just_view(decodeURIComponent(name));
var live = $('#livemod');
if (live){
live.textContent = '关闭直播';
live.title = '已开启直播模式,点击取消直播; 点击“复原”按钮可临时查看全部帖子';
live.style.background = '#fffe15';
live.href = location.href.replace(location.search,'');
};
if ($('.paginator')[0]){
var next = $$('.paginator a');
for (var i=0,j=next.length; i<j; i++){
next.href += '&jv='+name;
}
}
}
};

// 引用回复
// 感谢 NullPointer ,该功能参照了他的 Reply buttons for new Douban 中的格式
function requote(){
var re_f = $('#re_f'), re_text = $('#re_text');// 回复浮层与输入框
var todo = this.name || this.id;// 点击按钮类别
var parent_3 = this.parentNode.parentNode.parentNode;
var clickname = xpath('//a[contains(@href,"/people/") and not(./child::img)]', parent_3).snapshotItem(0).textContent;// 楼层发言人名
var rn = (re_text.value == '')?'':'\n';
if (todo == 'db_re'){
var alltext = rn + '@' + clickname + '\n';
}else if(todo == 'db_qt'){
var rehead = parent_3.querySelector('div.author, div.bg-img-green>h4, h3>span.pl, td>span.wrap>h4').textContent.replace(/\s+/g,' ');// 留言头部标题内容
var redoc = window.getSelection().toString() || // 选中内容
parent_3.getElementsByTagName('p')[0].textContent.replace(/\n\s*\n/g, '\n').replace(/^\s{7}/g, '');// 留言正文内容
if (redoc.search(/(-{50,})[\s\S]+\1/g)>-1){
if (confirm('是否删去引文中的引文?')){redoc = redoc.replace(/(-{50,})[\s\S]+\1/g,'').replace(/\n\s*\n/g, '\n');}
};
var len = redoc.length;
var diylen = GM_getValue('diylen', 500);
if (len > diylen){
if (confirm('引文太长,是否省略一部分?')){redoc = redoc.substr(0,diylen)+ '......\n(以上引文省略'+ (len-diylen) +'字)';}
};
var sepr = '----------------------------------------------------------';
var alltext  =  rn+sepr+'\n'+rehead+'\n'+redoc+'\n'+sepr+'\n';
};
re_text.value += alltext;
re_f.style.display='';
re_text.focus();
re_text.setSelectionRange(re_text.value.length, re_text.value.length); // 修正chrome版输入框光标定位问题
};  

/* ************************ 豆瓣社区处理 ************************ */

// 友邻工具条
function friendsTool(){
if(GM_getValue('friendsTool', true) && $('#db-timeline-hd')){
$('.menu-list')[0].innerHTML += '<li><a title="查看未分组友邻 by豆瓣助手" href="?tag=2">未分组</a></li>';

GM_addStyle('.Friends_Tool_Bar{visibility:hidden;} .mbtr:hover .Friends_Tool_Bar{visibility:visible;}');
// 友邻
var firends = xpath('//li[@class="mbtr" and not(@dbMark)]//a[contains(@href,"/people/") and not(@onclick) and not(@class) and not(contains(@href,"recs?rid=")) and not(../self::*[@class="pl"]) and not(../self::*[@class="indentrec"]) and not(contains(preceding-sibling::text(),"、"))]');
for(var i=0,j=firends.snapshotLength; i<j; i++){
var toolBar = document.createElement('div'), firend = firends.snapshotItem(i), name = firend.href, nname = firend.innerHTML;
toolBar.className = 'Friends_Tool_Bar';
toolBar.innerHTML = '<div class="clear"></div><span>\
<a href="'+name.replace('people','book/list')+'">书</a> |\
<a href="'+name.replace('people','movie/list')+'">影</a> |\
<a href="'+name.replace('people','music/list')+'">音</a> |\
<a href="'+name+'miniblogs?type=saying">说</a> |\
<a href="'+name+'miniblogs">广播</a>|\
<a href="'+name+'reviews">评论</a>|\
<a href="'+name+'notes">日记</a>|\
<a href="'+name+'photos">相册</a>|\
<a href="'+name+'recs">推荐</a>|\
<a href="'+name+'groups">小组</a>|\
<a href="'+name+'board">留言板</a>|\
<a href="'+name+'contacts'+'">关注</a>|\
<a href="/doumail/write?to='+name.slice(29,-1)+'">发豆邮</a>\
<a href="javascript:" style="color:#83bf73;" title="点击展开更多"\
onclick="this.target=\'\';\
this.innerHTML=/gt/.test(this.innerHTML)?\'&lt;&lt;&lt;\':\'&gt;&gt;&gt;\';\
var obj=this.parentNode.getElementsByTagName(\'span\')[0];\
obj.style.display=obj.style.display?\'\':\'none\';">&gt;&gt;&gt;</a>\
<span style="display:none;">\
<a href="'+name+'event?g=w">活动</a>|\
<a href="'+name+'online">线上</a>|\
<a href="'+name+'offers">二手</a>|\
<a href="'+name+'doulists">豆列</a>|\
<a href="'+name+'minisite">迷你站</a>|\
<a href="'+name+'artist">音乐人</a>|\
<a href="'+name+'hosts">主办方</a>|\
</span>\
<a href="#" onclick="$(\'textarea\').attr(\'value\',\'@\'+\''+nname+'\'+\' \'); $(\'textarea\').focus()">对<span style="color:#83bf73;">'+nname+'</span>说</a>\
</span>';
var theLi = (firend.parentNode.t
azure1944
小狐狸
小狐狸
  • UID33895
  • 注册日期2010-09-05
  • 最后登录2011-06-04
  • 发帖数14
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
2楼#
发布于:2011-02-26 17:49
我是做淘宝的,但是前一阵发现淘宝的订单没办法改价格,弹出来的改价框不显示任何改价信息,IE内核浏览器下正常。

我认为是插件冲突,把所有插件挨个安装后,逐一调试,最终发现是豆瓣助手作祟,不知道和楼主说的有没有关联。

不过豆瓣助手升级后,貌似再没有这样,但我还是担心
flywindz
小狐狸
小狐狸
  • UID35112
  • 注册日期2011-01-21
  • 最后登录2015-08-16
  • 发帖数1
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
3楼#
发布于:2011-02-26 17:49
我是直接改include,只在豆瓣生效...
mcdawang
小狐狸
小狐狸
  • UID33174
  • 注册日期2010-06-26
  • 最后登录2014-05-15
  • 发帖数22
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
4楼#
发布于:2011-02-26 17:49
這個在douban的小組里也被人說過了,新版本改成了可取消(默認勾選)

其它功能 - 通过在卓越、淘宝商城上买书支持豆瓣助手
游客

返回顶部