使用Twitter Streaming API和ReactPHP的错误请求

时间:2014-07-13 23:31:48

标签: php api twitter oauth twitter-streaming-api

我正在开发一个需要来自twitter streaming api的实时数据的项目。

要做到这一点,我使用的是ReactPHP。

当我向twitter streamintg API发出请求时,我收到了BadRequest响应。

请求(带有效负载)如下:

POST /1.1/statuses/filter.json HTTP/1.0
Host: stream.twitter.com
User-Agent: React/alpha
Authorization: OAuth oauth_nonce="0f1add32ee06141004ea4c02d892bdaf",oauth_timestamp="1405130866",oauth_consumer_key="72XsNwUvJjw0xaSinIk1mzHL0",oauth_token="366141931-Zxljl6Ycwgdh9a5IYPqImJT5zeat2EJOAJOarTq6",oauth_signature_method="HMAC-SHA1",oauth_signature="Rs57ywc26IRNQA1l9zQZwoRMV5Q%3D"
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

track=arg

为此我正在使用:

“jacobkiers / oauth”:“1.0。”=>为oauth “react / http-client”:“”=>连接到流API

您可以在此处查看代码:

TwitterConnector.php

感谢

2 个答案:

答案 0 :(得分:1)

所以答案非常简单,当Twitter API需要HTTP 1.1请求时,您正在发出HTTP 1.0请求。

问题的根源在于Request object。为了解决这个问题,我已经快速创建了两个类。 RequestData11:

<?php

use React\HttpClient\RequestData;

class RequestData11 extends RequestData
{
    public function setProtocolVersion($version)
    {
    }
}

和Client11:

<?php

use React\EventLoop\LoopInterface;
use React\HttpClient\Request;
use React\SocketClient\ConnectorInterface;

class Client11
{
    private $connectionManager;
    private $secureConnectionManager;

    public function __construct(ConnectorInterface $connector, ConnectorInterface     $secureConnector)
    {
        $this->connector = $connector;
        $this->secureConnector = $secureConnector;
    }

    public function request($method, $url, array $headers = array())
    {
        $requestData = new RequestData11($method, $url, $headers);
        $connectionManager = $this->getConnectorForScheme($requestData->getScheme());
        return new Request($connectionManager, $requestData);

    }

    private function getConnectorForScheme($scheme)
    {
        return ('https' === $scheme) ? $this->secureConnector : $this->connector;
    }
}

您通常会创建一个这样的新客户端:

<?php

$client = $httpClientFactory->create($loop, $dnsResolver);

相反,您必须以这种方式创建它:

<?php

$connector = new Connector($loop, $dnsResolver);
$secureConnector = new SecureConnector($connector, $loop);
$client = new Client11($connector, $secureConnector);

这会强制客户端使用HTTP 1.1,但要注意,http-client是一个1.0客户端,因此只有当你知道自己在做什么时才能将其强制为1.1。

请注意,您没有锁定您的composer文件中的react \ http-client版本,因此我不知道您使用的是哪个版本,因此bove代码可能无效。

答案 1 :(得分:0)

之前的评论解决了HTTP版本的问题。 但我有另一个问题。

Twitters一直在回答未授权。

调试一下,我发现问题是Reacts使用STREAM_CRYPTO_METHOD_TLS_CLIENT编码方法而不是STREAM_CRYPTO_METHOD_SSLv23_CLIENT

阵营\ SocketClient \ StreamEncryption

我无法找到一种优雅的方法来修复,只需重写StreamEncryption以使用SSL和SecureConnector来使用重写的StreamEncryption