0

我在尝试使用外部论坛运行器 api 向论坛上的用户发送消息时遇到了麻烦。

我已经能够使用此代码成功登录:

function login($username, $password){
    $postdata = "cmd=login&username=".$username."&password=".$password;

    $opts = array('http' =>
        array(
            'method'  => 'POST',
            'header'  => 'Content-type: application/x-www-form-urlencoded',
            'content' => $postdata
        )
    );

    $context  = stream_context_create($opts);

    $result = file_get_contents('http://forums.<<<website>>>.org/forumrunner/request.php', false, $context);
    $resultantArray = json_decode($result, true);

    if($resultantArray['success'] == true){
        $this->loginresult=$resultantArray;
        return true;
    } else {
        $this->loginresult=false;
        return false;
    }
}

结果:

array(5) { ["success"]=> bool(true) ["data"]=> array(6) { ["username"]=> string(8) "<<<Username>>>" ["authenticated"]=> bool(true) ["v"]=> string(5) "1.1.1" ["p"]=> string(5) "xen10" ["requires_authentication"]=> bool(false) ["reg"]=> bool(true) } ["ads"]=> int(0) ["pm_notices"]=> int(0) ["sub_notices"]=> int(0) } string(4395) "

这样就可以了,并发送回登录成功消息,但是启动新对话的代码不起作用(验证失败):

function sendPM($recipients, $title, $message) {
    $postdata = "cmd=start_conversation&recipients=".$recipients."&title=".$title."&message=".$message."&d=1";

    $opts = array('http' =>
        array(
            'method'  => 'POST',
            'header'  => 'Content-type: application/x-www-form-urlencoded',
            'content' => $postdata
        )
    );

    $context  = stream_context_create($opts);

    $result = file_get_contents('http://forums.<<<website>>>.org/forumrunner/request.php', false, $context);
    $resultantArray = json_decode($result, true);
    if($resultantArray['success'] == true){
        $this->pmresult=$resultantArray;
        return true;
    } else {
        $this->pmresult=$result;
        return false;
    }

}

和错误(重要部分):

{"success":false,"message":"You do not have permission to view this page or perform this action."}

我相信我需要传递某种安全令牌,但我不知道从哪里得到它。

4

1 回答 1

0

您将 PHP 用作 Web 客户端(如 Firefox 或 Chrome),但它不是浏览器。默认情况下它不支持 cookie。

假设您现在正在使用浏览器。通常在您登录网站后,该网站会向您传递某种令牌(例如会话 ID、用户名)。令牌将存储在您浏览器的 cookie 中。每次您在网站上做某事时,您的浏览器都会将该令牌提供给该网站。这就是网站每次(登录后)都会知道您的登录信息的方式。

现在,您的程序必须做同样的事情,但 PHP 不会自动为您做这件事。您需要:

  1. 编写您自己的代码以在您的请求/响应标头中读取、存储和写入 cookie。

  2. 搜索网络并找到相关库,如果有的话。

我建议你阅读一些相关的讨论,例如:

https://forums.digitalpoint.com/threads/how-to-make-a-php-robot-that-c​​an-log-in.2410778/

于 2013-02-25T05:02:43.450 回答