0

我一直在对我的 vBulletin 论坛进行大量修改,并且我对不同形式的 AI 和论坛上的机器人特别感兴趣。我最近创建了一个插件,如果它被调用,它将在一个线程中发布机器人。它有时有效,有时无效。我不明白为什么它如此不可靠。

它在钩子位置“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
    }
}

关于是什么导致它如此不可靠的任何想法?如果我能顺利运行的话,潜力很大。

4

1 回答 1

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() 函数的开头来解决这个问题。

于 2012-06-01T06:05:24.037 回答