douban小组中的'只看楼主'

此脚本已过时,请访问这个替代 From: notsobad 最近在追着就看豆瓣的那些直播贴,很无聊。。。。 写了个greasemokey脚本,添加了个只看楼主功能。 代码在这里 /********************************************************* 用于douban小组中的"只看搂主",会把楼主的帖子加边框,同时,添加快捷键n,p “n”: 跳转到楼主下一个帖子,如果到了本页结尾,则跳回第一条 "p": 跳转到楼主下一个帖子,如果到了本页结尾,则跳回下一页 *********************************************************/ // ==UserScript== // @name douban // @namespace douban // @description test // @include *.douban.com/* // ==/UserScript== var log = (unsafeWindow.console && console.log) || GM_log; var $ = unsafeWindow.jQuery || function(){}; log("now url: " + location.href); function xPath(aNode, aExpr) { var xpe = new XPathEvaluator(); var nsResolver = xpe.createNSResolver(aNode.ownerDocument == null ? aNode.documentElement : aNode.ownerDocument.documentElement); var result = xpe.evaluate(aExpr, aNode, nsResolver, 0, null); var found = []; var res; while (res = result.iterateNext()) found.push(res); return found; } (function(){ /********************************************************** 用于douban小组中的"只看搂主",会把楼主的帖子加边框,同时,添加快捷键n,p “n”: 跳转到楼主下一个帖子,如果到了本页结尾,则跳回第一条 "p": 跳转到楼主下一个帖子,如果到了本页结尾,则跳回下一页 **********************************************************/ if(location.href.indexOf("http://www.douban.com/group/topic") != 0) return; var temp = /&_lz_id=([^&\/\#]+)/.exec(location.href); if(temp){ var lz_id = temp[1]; var lz_url = "http://www.douban.com/people/"+ lz_id + "/"; }else{ // First page var lz = xPath(document , '//div[@id="in_tablem"]//td[@class="wrtd"][1]/a')[0]; var lz_id = lz.href.split('/people/')[1].replace('/',''); var lz_url = lz.href; } log("lz is: " + lz_url); var all = xPath(document , '//div[@id="in_tablem"]/table[@class="wr"]//table[@class="wr"]'); var pages = xPath(document , '//div[@id="in_tablem"]/div[@class="paginator"]//a'); //为分页链接附加参数,_lz_id Array.forEach(pages, function(p){ var sep = p.href.indexOf('?') != -1 ? '&' : '?'; p.href += sep + '_lz_id=' + lz_id; }); //高亮楼主, 添加锚点 var lz_list = []; Array.forEach(all, function(table, index){ user = table.getElementsByTagName('a')[0]; //log("now user: " + user.href); if(user.href == lz_url){ table.style.border="5px solid black"; table.style.overflow = "scroll"; lz_list.push(index); var a = document.createElement('a'); a.name = index; table.parentNode.insertBefore(a, table); } }); //快捷键 var i = 0; document.addEventListener('keydown', function(e){ if(e.target.tagName == 'INPUT' || e.target.tagName == 'TEXTAREA') return; var has_more = !!lz_list && i < lz_list.length && true; // 'n'=>78, 'p'=>80, 'j'=>74 if(!has_more){ if(e.keyCode == 80) location.href = pages[pages.length-1].href; else if(e.keyCode == 78) i=0; return; } if(e.keyCode == 78 || e.keyCode == 80){ //log('Moving next....'); location.href = '#' + lz_list[i]; i++; } },false); })();

April 30, 2009 · notsobad

笔记

我需要做一个页面保存的功能, 在服务端把页面整个wget保存下来。 由于服务端是有会话的,所以需要对本机的请求给自动通过,以前一直是用验证HTTP_HOST 是否为 localhost,这个方法有局限,今天想到可以这样 if($_SERVER['SERVER_ADDR'] == $_SERVER['REMOTE_ADDR']){ //。。。。。。。 } 由于有些内容离线看是没有意义的,所以决定添加一些标记来标识离线时要删掉的内容 如下: ...

April 30, 2009 · notsobad

ie6 download xml file

让浏览器输出一个xml的下载, ie6下面问题真多 两个函数 function is_ie (){ //Not Internet Explorer return stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE; } function encode_filename($name){ return is_ie() ? urlencode($name) : $name; } 特定的header header('Content-Type: application/xml'); header("Content-Disposition: attachment;filename=". encode_filename("测试-" . $t->name . ".xml")); header('Pragma: private'); header('Cache-control: private, must-revalidate'); echo $xw->outputMemory(); 参考这个: http://markmail.org/message/i4okzvwuxmeggrkp 这个: http://www.jtricks.com/bits/content_disposition.html The filename should be in US-ASCII charset. The filename should not have any directory path information specified. The filename should not be enclosed in double quotes even though most browsers will support it. Content-Type header should be before Content-Disposition. Content-Type header should refer to an unknown MIME type (at least until the older browsers go away).

April 30, 2009 · notsobad

taotao api

taotao,也就是自己qq签名的api哎 参考这个 http://code.google.com/p/taotao/source/browse/trunk/TaotaoResponse.cs 还有这个 http://www.taotao.com/js/dkapi.js 可以得到地址为: <http://www.taotao.com/cgi- bin/msgj?qq=$>{qq}&num=${taotao_num}&t=${taotao_type} 如: [http://www.taotao.com/cgi- bin/msgj?qq=281116124&num=20&t=1](http://www.taotao.com/cgi- bin/msgj?qq=281116124&num=20&t=1) 貌似没什么限制,可以自己代码里用 附: 格式化后的dkapi.js 从这里可一看出返回参数的用途 var MAX_ITEMS=20,taotao_pane_id="id_apiPane",KEY_WORD_YJ="[假]"; var taotao_sr=new Array('网页','QQ机器人','QQ空间','QQ签名','短信','手机上网','MSN机器人','MSN签名','手机QQ','彩信','订阅',"",'QQ状态'); function LK(str) { return document.createElement(str); }function LL(str) { return document.getElementById(str); }function LG(str,target) { var re=new RegExp("http(s)?://([a-z0-9?.=%&-_;#\\/])+","ig"); if(target=='_blank') { str=str.replace(re,"<a target='_blank' href='$&'>$&</a>"); }else { str=str.replace(re,"<a href='$&'>$&</a>"); }return str; }function LH(str) { if(typeof(str)=="string") { str=str.replace(/[\r\n\t\0]/g,""); return str; } }function LE(str,target) { str=LH(str); var re=/(\[URL=(.[^\[]*)\])(.*?)(\[\/URL\])/ig; if(target=='_blank') { str=str.replace(re,"<A HREF=$2 TARGET=_blank>$3</A>"); }else { str=str.replace(re,"<A HREF=$2>$3</A>"); }return str; }function initApi() { if(typeoftaotao_qq=='undefined') { alert("we can not get qq num,show nothing...!"); return ; }if(typeoftaotao_num=='undefined'||taotao_num<=0||taotao_num>20) { taotao_num=20; }if(typeoftaotao_type=='undefined'||taotao_type<0||taotao_type>1) { taotao_type=0; } }function LI(url) { g_cximg=null; g_cximg=new Array(); var re=/\[IMG\](.+?)\[\/IMG\]/ig,tt=url.match(re); g_ubbcon=url.replace(re,''); for(var i=0;i<tt.length;++i) { g_cximg[g_cximg.length]=tt[i].replace(re,"$1"); } }function LF(str) { if(str.substr(0,3)==KEY_WORD_YJ) { str='<font style="color:red">'+KEY_WORD_YJ+'</font>'+str.substr(3,str.length-3); }return str; }function doApi(obj) { if(obj.ret!=0) { pane.innerHTML="对不起!暂时无法获取滔滔的唠叨,请稍候重试..."; return ; }var qq=obj.ui.qq,name=obj.ui.name,usn=obj.ui.usn,rank=obj.ui.rank,lrank=obj.ui.lrank,rec=obj.rec; var arr=obj.posts,i=0,data,pane=LL(taotao_pane_id),li,span,a,bD=false; for(i=0;i<arr.length;i++) { data=arr[i]; li=LK("li"); li.style.wordBreak="break-all"; li.style.height="auto"; li.style.overflowY="auto"; if(obj.type==1) { a=LK('a'); a.style.marginRight="8px"; a.innerText=data.nm; a.textContent=data.nm; a.href="<http://www.taotao.com/v1/space/>"+data.qq; li.appendChild(a); if(data.pqq) { li.appendChild(document.createTextNode("@")); a=LK('a'); a.style.marginRight="8px"; a.innerText=data.pnm; a.textContent=data.pnm; a.href="<http://www.taotao.com/v1/space/>"+data.pqq; li.appendChild(a); } }span=LK("span"); if(data.sr==10) { span.innerHTML=LE(data.cn,"_blank"); }else if(data.sr==9) { LI(data.cn); var cxlen=g_cximg.length; span.innerHTML=g_ubbcon+'&nbsp;<a target="_blank" href="<http://www.taotao.com/caixin.shtml?qq='+qq+>"&tid="+data.id+'">点击查看彩信</a>'; }else { span.innerHTML=LF(LG(data.cn,"_blank")); }li.appendChild(span); span=LK("span"); span.style.marginLeft="8px"; a=LK('a'); a.style.color="#929091"; if(parseInt(data.pqq)>0) { a.href='<http://www.taotao.com/v1/reply/t.'+data.pid+'/u.'+data.pqq>; }else { a.href='<http://www.taotao.com/v1/reply/t.'+data.id+'/u.'+qq>; }a.innerHTML=LJ(data.time); li.appendChild(span); span.appendChild(a); span=LK("span"); span.style.marginLeft="4px"; span.innerText="通过 "+taotao_sr[data.sr]; span.textContent="通过 "+taotao_sr[data.sr]; li.appendChild(span); pane.appendChild(li); } }function LJ(t) { if(t.charAt(1)!=',') { return t; }if(t.length<2) { return ""; }var n=t.charAt(0),v=t.substr(2,t.length),s=''; if(n==1) { s='约&nbsp;'+v+'&nbsp;秒前'; }else if(n==2) { s='约&nbsp;'+v+'&nbsp;分钟前'; }else if(n==3) { s='约&nbsp;'+v+'&nbsp;小时前'; }else if(n==4) { s='约&nbsp;1&nbsp;天前'; }else if(n==5) { s='约&nbsp;3&nbsp;天前'; }else if(n==6) { s='约&nbsp;1&nbsp;周前'; }else if(n==7) { s=v; }return s; }function inclApi() { var src="<http://www.taotao.com/cgi-bin/msgj?qq=>"+taotao_qq+"&num="+taotao_num+"&t="+taotao_type,htm='<div>'+'<ul id='+taotao_pane_id+' style="margin-bottom:5px">'+'</ul>'+'<table cellpadding="0" cellspacing="0" border="0" width="100%">'+'<tr>'+'<td align="left">'+'<a href="<http://www.taotao.com/v1/space/'+taotao_qq+'>" style="color:#0278c2;float:left;display:block;">更多唠叨</a>'+'</td>'+'<td align="right">'+'<a href="<http://www.taotao.com>" title="滔滔" target="_blank" style="width:96px;height:20px;cursor:pointer;float:left;display:block;*filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'[http://www.taotao.com/images/logo.png\',sizingMethod=\'image\'](http://www.taotao.com/images/logo.png%5C',sizingMethod=%5C'image%5C'));background:url(<http://www.taotao.com/images/logo.png>) no-repeat left top !important;*background:none;"></a>'+'</td>'+'</tr>'+'</table>'+'</div>'; window.document.write(htm); window.document.write('<sc'+'ript type="text/javascript" charset="utf-8" src="'+src+'"></'+'script>'); }initApi(); inclApi();

April 30, 2009 · notsobad

流非飞 王菲 歌词

王菲的歌 流非飞 王菲 菲菲不停问我 是我犯错吗 多讲反而是错 菲菲不停问我 别这样那么 喜欢依然是我 曾经我问我为何 答话这样傻 请你不要随便胡乱评论我 飞自由 飞自由 完全非自由 完全非自由 飘拂可能是我 令你着了火 偏偏不明白我 仿佛表情做错 扮相着了魔 通通不原谅我 如果说话这样奇 故事太迷离 不要管那是非 胡乱来做戏 (菲菲)看笑语满天 (菲菲)请放过我吧 (菲菲)太自我太不羁 (菲菲)不爱理无心机 (music) 菲菲今天不打领呔 姿色多古怪 事实是他不想太乖 东方 天天 清新 大众 一周的心态 事实大家思想太歪 菲菲不揪不睬上街 清高的姿态 事实是她不太愉快 假装天天款要摆 高深的一派 但愿问他可否了解 曾经我问我为何 答话这样傻 请你不要随便胡乱评论我 飞自由 飞自由 完全非自由 完全非自由 (music) (菲菲)看笑语满天飞 (菲菲)请放过我吧 (菲菲)太自我太不羁 (菲菲)不再叫菲菲 曾经我问我为何 答话这样傻 请你不要随便胡乱评论我 喜欢依然是你 像似没结果 北京依然是美 菲菲依然念记 像似没结果 喜欢依然是你 (music) 完全非自由 (END)

April 30, 2009 · notsobad

Debugging django

怎么调试django程序呢? models还好,可以在django shell中很方便的调试 而view中只能发送httpresponse对象到浏览器,print打印的东西不会在浏览器输出 找到了这篇文章 http://simonwillison.net/2008/May/22/debugging/ 收获: 如果用的是development server,print输出到了对应的terminal中 ...

April 30, 2009 · notsobad

Using cache in django

关于 django的缓存 几篇文章 http://docs.djangoproject.com/en/dev/topics/cache/ http://www.woodpecker.org.cn/obp/django/django-faq/cache.html http://groups.google.com/group/python-cn/browse_thread/thread/917d211b25576342/d0b957e338644540?lnk=gst&q=django%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6# 可以用下面的view代码测试缓存是否工作 from django.views.decorators.cache import cache_page @cache_page(60 * 2) def test(request, task_id): s = datetime.datetime.now() return HttpResponse(str(s)) 另: 如果使用文件型缓存,如 CACHE_BACKEND = 'file:///tmp/django_cache' 需要注意/tmp/django_cache 必须对你的server用户是可写的,如nobody 如果你同时运行开发服务器和生产服务器,一定要注意写权限 ...

April 30, 2009 · notsobad

dns cache

ubuntu8.10, 网通宽带,无线路由 速度非常慢,可以感觉到4-5秒的延时,明显是dns查询的时间。 装了dnsmasq,然后修改resolv.conf 23:39:13@/etc/ppp> cat /etc/resolv.conf # Generated by NetworkManager nameserver 127.0.0.1 不过网络重新连接后还是会被网通的dns覆盖掉, 如下即可 之后重启网络,速度飞快

April 30, 2009 · notsobad

Django 1.0 on GAE

在gae上用django1.0 gae的使用就不多说了,它使用的是django0.96,想用1.0需要用到zip import zip import http://code.google.com/intl/zh-CN/appengine/articles/django10_zipimport.html gae helper for django http://code.google.com/intl/zh-CN/appengine/articles/appengine_helper_for_django.html django on gae,已打包好 http://github.com/Surgo/django-on-gae/tree 照上面文章设置既可,最后可以使用django式的manger, url, shell等

April 30, 2009 · notsobad

session in django

django中session选择文件形式存储,貌似没有自动垃圾清理的机制,所以会造成很多的无用session文件 删除30分钟没有活动的会话,这里默认每次页面访问都会读取session。 find /tmp/ -type f -name "sessionid*" -amin +30 | sudo xargs rm -f 附: 参考这里http://www.linuxselfhelp.com/gnu/findutils/html_chapter/find_2.html 文件的三种时间标志 ...

April 30, 2009 · notsobad