我一直在对我的vBulletin论坛进行大量修改,我对论坛中不同形式的AI和botting特别感兴趣。我最近创建了一个插件,如果它被调用,它将在一个线程中发布机器人帖子。它在某些时候有效,而在其他时候则无效。我无法弄清楚为什么它如此不可靠。
它在钩子位置“newpost_complete”触发并具有以下代码:
if (stristr($postinfo['pagetext'],'.robot:')){
preg_match('@^(?:.robot:)?([^:]+)@i',$postinfo['pagetext'], $matches);
$host = $matches[1];
require_once(DIR . '/includes/functions_robot.php');
run($host,$threadinfo['threadid']);
}
我对正则表达式不好,所以我不确定preg_match是最优的。我发现它很少运行代码如果你发帖.robot:hi:但是如果你用.robot引用一个帖子:hi:在它中,即使实际引用的内容改为其他内容,它也会毫无问题地运行。
这是functions_robot.php文件中的相关代码:
function run($command,$threadid) {
global $vbulletin;
global $db;
if ($command == 'hi') {
$output = 'Hello.';
//Queries
}
}
任何关于导致它如此不可靠的想法?如果能让它顺利运行,那就有很大的潜力。
答案 0 :(得分:0)
我能够通过http://regex.larsolavtorvik.com/
来解决这个问题我切换到postdata_presave挂钩而不是newpost_complete。
$pagetext =& $this->fetch_field('pagetext', 'post');
$threadid =& $this->fetch_field('threadid', 'post');
if (stristr($pagetext,'.robot:')){
preg_match('/(\.robot:)(.*)(:)/iU',$pagetext, $matches);
$host = $matches[2];
require_once(DIR . '/includes/functions_robot.php');
run($host,$threadid);
}
新的钩子位置意味着它通常比我实际贴子上的插入物更快地射击,让机器人在我面前张贴。我通过将usleep(500000);
添加到run()函数的开头来修复此问题。