“cannot use parentheses”是个什么鬼

VBScript里你是怎么调用sub(子程序)的呢?
当然这样啊:

MySub1(MyArg)

可是,当别外一个sub有多个参数时呢?

MySub2(MyArg1,MyArg2)

它竟然出错!cannot use parentheses!不能使用括号!这是个什么鬼!
先说结论:如果你以一般方式调用sub时,参数是不能使用括号包着的。
只能这样:

MySub2 MyArg1,MyArg2

骗人,明明可以啊!……好吧……其实:

MySub1(MyArg)

程序的真正理解是:

MySub1 (MyArg)

注意中间有个空格!而(MyArg)的意思是:以ByVal的方式传递参数!
VBScript里调用函数(function)或子程序(sub)时,(定义function和sub时如果你没有声明ByVal)默认是以ByRef的方式传递参数的;如果function或sub已经定义了参数是ByRef的,你还可以强制以ByVal的方式传递参数,那就是给参数加上括号。所以:

MySub1 (MyArg)

的真正意思是:调用MySub1并且以ByVal的方式传递参数MyArg。
先记着结论:如果你以一般方式调用sub时,参数是不能使用括号包着的。所以:

MySub2(MyArg1,MyArg2)

会直接出错,正确的写法是:

MySub2 MyArg1,MyArg2

呃……一直在说以一般方式调用sub,那么不一般的方式是什么啊?
就是用Call来调用sub,并且用Call的时候参数必须用括号了:

MySub2(MyArg1,MyArg2)

总的来说:
括号在VB中的几个意思:

  1. 对括号内的表达式求值,例如:Average = (First + Last) / 2
  2. 引用数组的第几个元素,例如:Item = MyArray(Index)
  3. 调用函数(function)或子程序(sub),例如:Limit = UBound(MyArray)
    • 如果函数调用被赋值,那么它的参数必须使用括号:Result = MyFunc(MyArg)
    • 使用Call调用函数或子程序时它的参数必须使用括号:Call MySub(MyArg)
    • 如果不是以上两种情况,则不能使用括号。
  4. 强制以byval的方式传递参数:Result = MyFunction(Arg1, (Arg2)) ‘Arg1是byref,Arg2是byval

检查网址存活性

通过python可以很方便的检测一个网址的存活(是不是404),即检测状态码,这种方式不必等待整个网址下载完整。

def check_url(url:str):
    p = urlparse(url)
    conn = HTTPConnection(p.netloc)
    conn.request('HEAD', p.path)
    resp = conn.getresponse()
    return resp.status < 400

使用起来也非常简单:

# True
check_url("http://www.baidu.com")
# False
check_url("http://www.baidu.com/does-not-exists.html")

Firefox火狐扩展(addon) open with referer

虽然Firefox的占有率越来越低了,但毕竟适合自己才是最好的,Firefox仍然是我的首先浏览器,这上面有vimperator、adblock、flashinspector……

需要的话还可以自己写些扩展(现在叫附加组件)。

我的工作需要经常测试网站在不同来路下的表现,open with referer就是一个适合这样的小工具。安装后,你会在右上角看到一个图标,点击这个图标,网页就会以带有http referer的方式打开(设置请求消息头的referer)。

打开菜单-附加组件-open with referee,先设置你要使用的来路

点击右上角open with referee的图标

open with referee会设置消息头的referee字段

selenium python停止Firefox加载(续)

如果你在使用selenium python时也碰到firefox一直加载的问题,而又没有比较好的解决方法,那么你也许可以试下这个反过来的思路:当它加载超时抛出异常。
仔细看selenium python的源码,发现它有一个api:

driver.set_page_load_timeout

注意单位是秒,如果网页加载超过了你设置的时间,那么它会发生异常:

selenium.common.exceptions.TimeoutException: Message: Timed out waiting for page load.

同时它还有另外一个api:

driver.set_script_timeout

这个是用来设置网页上脚本执行的超时时间(秒)。

‘Can not connect to GhostDriver’

我的环境是Mac OSX、Intellij IDEA、Python 3.5、Selenium、PhantomJS,结果在测试PhantomJS时:

driver = webdirver.PhantomJS()
dirver.get('http://www.baidu.com')
print(driver.current_url)
driver.quit()

老是出现错误:

WebDriverException: Message: 'Can not connect to GhostDriver'

解决这个问题也很简单,就是确保Python和PhantomJS在同一运行环境下,如果你的Python Interpreter是放在virtualenv里,而PhantomJS是安装在系统里的(通过brew安装?)那就会有这样的问题。
所以我最终在Run/Debug Configurations里把Python Interpreter指向系统的Python就可以了。

让一句马(PHP)成为你的代理服务器

既然一句马是可以执行php代码,那么把一段实现代理功能的php代码交给一句马就让它变成一台简单的代理服务器了。

参照Simple PHP Proxy,精简出代码:

<?PHP
$url = $_GET['url'];
$ch = curl_init($url);
if (strtolower($_SERVER['REQUEST_METHOD']) == 'post') {
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);
}
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $_GET['user_agent'] ? $_GET['user_agent'] : $_SERVER['HTTP_USER_AGENT']);
list($header, $contents) = preg_split('/([\r\n][\r\n])\\1/', curl_exec($ch), 2);
$status = curl_getinfo($ch);
curl_close($ch);
$header_text = preg_split('/[\r\n]+/', $header);
foreach ($header_text as $header) {
    if (preg_match('/^(?:Content-Type|Content-Language|Set-Cookie):/i', $header)) {
        header($header);
    }
}
print $contents;
exit;
?>

然后,你需要把它转为一行,比如用python:

''.join(open('[path-to-nano-proxy.php]').read().replace('<?PHP', '').replace('?>', '').split('\n'))

使用的时候也很简单,就是向这个一句马传递一个url参数就可以,例如:

http://[url-to-nano-proxy.php]?url=http://www.google.com

这样你的一句马不仅能用来管理网站,还可以能做代理服务器。

selenium python停止Firefox加载

在用selenium+python+Firefox时发现:

driver.get(“http://www.itamt.com”)

程序会保持执行一直到整个页面加载完毕或用户停止页面加载(点击Firefox上的停止按钮),但是有的网页会当有使用外部资源时会一直处于加载状态,特别当使用墙外资源时这个情况就更加严重了。

可翻遍了selenium.webdriver.Firefox也找不到可以stop loading的API。最后不得不放弃,不知道哪位还有办法吗?

我现在的解决方案是不用Firefox driver,改用phantomjs的,selenium+python+phantomjs的环境下貌似自带了GhostDriver(我搞不清楚是phantomjs还是selenium python带的),安装也十分容易。但目前还没有空把以前的项目都迁移过来。

到时再作作这方面的介绍。

caidao.py

写了个python的菜刀(caidao.py),一句话马用来管理网站其实很方便,虽然总是被用于黑来黑去的(webshell)。

🙁

当然也可以直接用chopper.exe,但总是要担心安全问题。

我得做自己的菜刀啊,所以就有了caidao.py,不知道有没有人已经做这件事情了。

目前支持简单的文件操作:upload/remove/download/rename/mkdir/cd

等再成熟点就放到github上。

 

网页浏览器安装FlashPlayer(调试版)插件

我又来唠叨debug版本的重要性… 非debug版本Flash插件的话, 程序出错是不报任务错误信息的, 你甚至感觉不到游戏出错了. 这对于开发人员来讲即使发现bug了, 我们也束手无策.
您可以这么想: 如果不装debug版本FlashPlayer插件的话, 就叫Flash程序员去死好了.

浏览器的选择
不推荐使用搜狗浏览器, 因为它(在”高速模式”下)无法设置FlashPlayer版本.

下载并安装插件
你可以到Adobe官网下载安装,Plugin content debugger (非IE浏览器)    ActiveX control content debugger (IE内核浏览器), 建议都装上.
内网的话也可以直接到\\192.168.25.20\软件\FlashPlayer11\browsers下载安装.

安装成功了?
如何确定你现在使用的是debug版本的FlashPlayer插件呢?很简单: 请在Flash上单击右键, 如果右键菜单里看到了:”显示重绘区域”和”调试器”这两项. 那么恭喜你!你做到了.
QQ截图20121106161541.jpg
如果没有这两个菜单项, 那么你使用的仍然是非debug版本的FlashPlayer插件(我们称为release版本). “怎么会这样呢? 我明明装了呀!” 请往下看.

安装失败了?
如果你把插件装上了, 但是发现你的浏览器使用的仍然不是debug版本的FlashPlayer插件, 那么极有可能是因为浏览器使用的是它自带的FlashPlayer插件, 这种情况下我们要做的是:设置浏览器, 让它使用我们安装的debug版本FlashPlayer插件.

  • 搜狗浏览器
    菜单-工具-搜狗调整浏览器选项-页面设置-使用系统公用的Flash Player, 注意这个方法只对”兼容模式”有效.
    “高速模式”下如何设置FlashPlayer插件, 目前不清楚.
  • 谷歌浏览器(Google Chrome)或者360浏览器
    • 在地址栏输入chrome://plugins
    • 点击”详细信息”以展开插件列表
    • 停用所有类型是”PPAPI(进程外插件)“, 只保留NPAPI类型的.
      QQ截图20121106161401.jpg