疑难杂症+乱七八糟的论坛手札

这几天一直在忙这个该死的DiscuzX搭建的卡院论坛,乱七八糟的事情好多好多……所以都没能更新博客个说。

于是今天有空上来写写遇到的一些琐碎的事情。

首先是免费CDN。本来我用的是Incapsula的CDN系统,只需要更新cname的那个。后来ivmm说Cloudflare更好,于是我就去换了CloudFlare。结果呢?……我自己测试结果,感觉速度一般般,和Incapsula差不多,会员们不乐意了,在群里翻腾说连不上。找了一两个典型用户让他们协助测试,结果CloudFlare很多地方没法访问到ns。虽然可以替换NS,但是懒得折腾了。

然后就是“个性签名”不显示的问题。这个大部分DZX用户可能没有碰到过,但是我确实碰到这种诡异的问题,用户中心无法修改个性签名。百度了很多,就是没有解决办法。偶然翻到“用户栏目”这个管理项目才发现不知道什么时候用户栏目中的“个性签名”被我取消掉了。于是勾上,修复完毕。

最后……我在写论坛管理方案,于是又是很久不能更新博客个说……

innerTEXT,outerHTML,outerTEXT和firefox

Firefox 不支持 DOM 对象的 outerHTML innerText outerText 属性……这是个一直困扰大家(包括我)很久的问题,网上也有不少的解决方法,这里摘录如下,收藏备用。(源链接:http://www.w3help.org/zh-cn/causes/SD9017)

解决方案

在 Firefox 中,可通过扩展 HTMLElement 的原型 (prototype) 来实现相关属性。

  1. 扩展 Firefox 中 DOM 元素的 outerHTML 属性:

    if (typeof(HTMLElement) != "undefined") {
       HTMLElement.prototype.__defineSetter__("outerHTML", function(s) {
            var r = this.ownerDocument.createRange();
            r.setStartBefore(this);
            var df = r.createContextualFragment(s);
            this.parentNode.replaceChild(df, this);
            return s;
        });
       HTMLElement.prototype.__defineGetter__("outerHTML", function(){
            var a = this.attributes, str = "<" + this.tagName, i = 0;
            for (; i < a.length; i++)
                if (a[i].specified)
                    str += " " + a[i].name + '="' + a[i].value + '"';
            if (!this.canHaveChildren)
                return str + " />";
            return str + ">" + this.innerHTML + "</" + this.tagName + ">";
        });
    
        HTMLElement.prototype.__defineGetter__("canHaveChildren", function(){
            return !/^(area|base|basefont|col|frame|hr|img|br|input|isindex|link|meta|param)$/.test(this.tagName.toLowerCase());
        });
    }
  2. 扩展 Firefox 中 DOM 元素的 innerText 属性:

    if (!!document.getBoxObjectFor || window.mozInnerScreenX != null) {
        HTMLElement.prototype.__defineSetter__("innerText", function(sText) {
            var parsedText = document.createTextNode(sText);
            this.innerHTML = "";
            this.appendChild(parsedText);
            return parsedText;
        });
        HTMLElement.prototype.__defineGetter__("innerText", function() {
            var r = this.ownerDocument.createRange();
            r.selectNodeContents(this);
            return r.toString();
        });
    }
  3. 扩展 Firefox 中 DOM 元素的 outerText 属性:

    if (!!document.getBoxObjectFor || window.mozInnerScreenX != null) {
        HTMLElement.prototype.__defineSetter__("outerText", function(sText) {
            var parsedText = document.createTextNode(sText);
            this.parentNode.replaceChild(parsedText, this);
            return parsedText;
        });
        HTMLElement.prototype.__defineGetter__("outerText", function() {
            var r = this.ownerDocument.createRange();
            r.selectNodeContents(this);
            return r.toString();
        });
    }

kilu.de部分服务器被wall

啥?你说我怎么发现的?

因为我发现这两天best33.com打不开了,我的best33.com是挂在kilu.de上做了个301到这里的。

但是前两天best33.com打不开,我ping了下看到通畅,于是继续放心使用。

今天我挂dl发现best33.com能打开 撤掉以后打不开了,于是……我什么都明白了。

换了xxxxxhost的空间做301。这个空间以前被wall过很多次……希望不要再wall了。(逼我换000还是youh是吧?)

simsimi小黄鸡API更新

最近发现API拉取不到消息了,感到很奇怪。手动访问了一下,发现simsimi的json调用格式变成这个样子了:

{"id":19417700,"response":"爱你","result":100,"msg":"OK."}

翻看原来的代码,发现回复由sentence_resp变成了response。稍微修订一下代码,就又能用了:

function simsimi($q){
    //simsimi 非官方API接口
    //2012年07月18日修订:修正小黄鸡更新接口导致返回失败。
    //by.oott123  http://best33.com
    //参数:$q(欲获取的问题) 返回:(mixed)返回结果,为false则失败
    $json=file_get_contents('http://www.simsimi.com/func/req?lc=zh&msg='.urlencode($q));
    $json=json_decode($json,1);
    if(isset($json['response'])){
        $reply=$json['response'];
        return $reply;
    }
    return false;
}

蜘蛛我求您了别来爬了……

昨天卡院的Incapsula的周报来了,一看流量我吓了一跳:2.1G!作为一个小型论坛,这个数字是很不正常的。于是登录Incapsula来到控制面板,发现80%的流量都是搜索引擎蜘蛛产生的!

这个论坛是《龙族》主题论坛,因为书里面提到过,所以基本没有搜索引擎流量,而是手动输入/书签为多。所以我来到了Incapsula的控制面板,屏蔽了大部分蜘蛛:

屏蔽没用的蜘蛛流量

目前的卡院服务器只有10G的流量,Incapsula也只有寥寥50个G而已,所以……蜘蛛啊,您就别爬了,行不?

迷你记事本(实现pastebin功能)

本程序是oott123仿制而来,系统核心源码为oott123自写而成,UBB解析采用Discuz内部的识别类,界面代码完全仿制。因为时间太过久远,所以找不到原来那个站点了,只从邮件记录中找到了原作者的mail:wenbin.wu@foxmail.com,在此向原作者致敬!

废话不多说,直接上地址:(我会说我连截图懒得弄一张了么?)http://sdrv.ms/M6PaSY

ps.最近电脑抽风,然后同学聚会什么的忙不过来,更新质量差点求包涵~(众:速度也会慢吧!)

神奇的POST数组

这两天在研究discuz的后台,发现一些很神奇的东西,稍微百度了一下,发现大家对这个提得比较少。那么我就来说说吧。

我们通常用的post表单一般是这个样子的(我没有关闭表单</form>的习惯,大家还是加上吧……):

<form method="post" action="debug.php">
<input value="hello1" name="hello1">
<input value="hello2" name="hello2">
<input value="提交" type="submit">

嗯,为了方便我们把debug.php代码也贴出来(其实就一句……):

print_r($_POST);

好了,那么我们post一下,得到的是这样的结果:

Array
(
    [hello1] => hello1
    [hello2] => hello2
)

这样的post没有什么好说的,大家都知道。好了,接下来是高级操作了——如果把表单改成这个样子呢:

<form method="post" action="debug.php">
<input value="hello" name="hello[word]">
<input value="hello" name="hello[wolrd]">
<input value="hello" name="hello[test]" type="submit">
</form>

好了,我们来post一下,竟然——

Array
(
    [hello] => Array
        (
            [word] => hello
            [wolrd] => hello
            [test] => hello
        )

)

对啦~在post结果里面我们发现了数组~

那么这个代码可以再发扬一下,大家体会体会吧~比如这样:

<form method="post" action="debug.php">
<input name="foo[]" type="checkbox" value="thisone">
<input name="foo[]" type="checkbox" value="thatone">
<input name="foo[]" type="checkbox" value="another">
<input name="foo[]" type="checkbox" value="and this">
<input name="foo[]" type="checkbox" value="and more">
</form>

这个代码能够返回这样的结果~

Array
(
    [foo] => Array
        (
            [0] => another
            [1] => and this
        )

)

这样只需要遍历一下$_POST['foo']数组就能够得到所有被用户勾选的选项啦~厉害吧~

(用php这么久了也才发现这个玩意我真是失败啊……)

#每日一个小代码#Windows主机也能伪静态

这里所说的伪静态并不是指用那个什么什么xml文件来实现,因为那个毕竟要比较高端的虚拟主机才有的……一般国内的“功能强大的控制面板”提供的全能空间是没有那么高端的。

再声明,这里给出的代码是以wordpress为例,其它程序请自行发散~

<?php
$qs = $_SERVER['QUERY_STRING'];
$_SERVER['REQUEST_URI'] = substr($qs, strpos($qs, ':80')+3);
$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];
include('index.php');
?>

嗯,把上面这个文件存成404文件即可实现伪静态了……其实这个代码是网上找的,个人觉得并不是那么靠谱。个人觉得这样写就够了:

<?php
include('index.php');
?>

至于具体怎样……我手上没有Win主机啊,没法测试……谁能测试一下给我反馈?

ps.IE环境下Chito后台的编辑器还真不好用。

再ps. qi哥我用IE测试发现我博客的大图能够正常缩略显示啊……

#每日一个小代码#只允许中国用户访问

嗯用免费空间的孩子们经常会想去掉广告啊什么的,或者TOS里面明确写着不允许中文网站自己却偷偷的搭建中文站什么的很苦恼……嗯没关系,有了这个神器,再也不怕老外查站了!

$language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
//获取访客语言,是HTTP头信息的ACCEPT_LANGUAGE的前两个字符
if($language != 'zh'){
//zh是中文,包括zh-CN简体中文和zh-TW正体中文
header("Location: /yourpage.html");
//这句代码是将用户转向到根目录的yourpage.html这里
exit;
//然后退出
}

简洁的几句话就将非中文用户阻挡在外了。这个yourpage.html里面可以写上:We're sorry but our web site is temporarily unavailable due to routine maintenance or unexpected technical problems. We apologize for the inconvenience and are quickly working to correct the situation. 这一看就很专业的英文报错了对吧……

其实还可以做进一步的发挥。原来不是有用Js代码识别语言去广告的吗?那样做如果老外查源码的话,就很容易发现了。其实如果用php的话,去广告可以更加隐蔽。比如kilu.de的去广告代码(在</body>前加上<noscript><noscript>)就可以把body标签替换为php代码如下:

<?php
$language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
if($language == 'zh'){
echo '<noscript><noscript>';
}
?>
</body>

这样的话,老外看到的源代码基本就不会出现js去广告那样的很明显的判定语言的语句了!

(这是昨天打算更新的忘记了……今天补上。所以今天还有一更哦~)

#每日一个小代码#利用Google翻译实现云TTS

之前看到一个能够将回复转换成声音的某个web服务,表示对原理很好奇。查了一些资料,发现php并不是很好实现tts。今天用Google翻译来听日语,突然想到用Google翻译的功能实现TTS。

稍微抓个包,得到地址:http://translate.google.cn/translate_tts?ie=UTF-8&q=字符串&tl=语言。直接写了个函数实现301转向,测试了下,发现如果有referer的话就会出现404错误。(Google真奇怪,为啥不是403……)

于是经典的file_get_contents法了,如下:

	function googletts($text,$lang='zh-CN'){
		header('Content-Type: audio/mp3');
		echo file_get_contents('http://translate.google.cn/translate_tts?ie=UTF-8&q=' . urlencode($text) . '&tl=' . $lang);
	}