문제

내 rTorrent WebUI를 작성하고 xmlrpc로 첫 번째 단계를 수행하고 싶습니다. 그러나 어떻게 든 그것은 정말로 작동하지 않습니다 ...

HTTP POST 요청에 대해 쓴 함수입니다.

function request($method, $args) {
    $data = xmlrpc_encode_request($method, $args);
    $ch = curl_init('http://#####/RPC2/');
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = xmlrpc_decode(curl_exec($ch));
    curl_close($ch);
    return $response;
}
.

이제 Torrent-list를 얻으십시오 ...

$data['hash'] = request('download_list',null);
print_r($data);
.
Array
(
    [hash] => Array
        (
            [0] => 0CF0C7F75D18281AE7C65309F6B798CEB149BCB8
            [1] => 8CAA3ED5CB29999A6DA84739FDFF2D6B04489833
        )

)
.

... 그리고 모든 토런트 / 해시에 대한 정보를 요청하십시오 ( 참조 가능한 방법에 대해서).

foreach ($data['hash'] as $index => $hash) {
    echo   "d.get_name:       "; print_r(request('d.get_name',       $hash));
    echo "\nd.get_base_path:  "; print_r(request('d.get_base_path',  $hash));
    echo "\nd.get_hash:       "; print_r(request('d.get_hash',       $hash));
    echo "\nd.is_active:      "; print_r(request('d.is_active',      $hash));
    echo "\nd.get_down_total: "; print_r(request('d.get_down_total', $hash));
    echo "\nd.get_up_total:   "; print_r(request('d.get_up_total',   $hash));
    echo "\nd.get_size_bytes: "; print_r(request('d.get_size_bytes', $hash));
}
.

해시와 일치하는 급류에 대한 정보는 표시되어야하지만 몇 개만 작동합니다.

d.get_name:       [Anime-Koi] Tokyo Ravens - 01v2 [h264-720p][9E02D3C9].mkv
d.get_base_path:  /data/rtorrent/complete/[Anime-Koi] Tokyo Ravens - 01v2 [h264-720p][9E02D3C9].mkv
d.get_hash:       0CF0C7F75D18281AE7C65309F6B798CEB149BCB8
d.is_active:      
d.get_down_total: 
d.get_up_total:   
d.get_size_bytes: 

d.get_name:       [Anime-Koi] Tokyo Ravens - 03 [h264-720p][C997AD9B].mkv
d.get_base_path:  /data/rtorrent/complete/[Anime-Koi] Tokyo Ravens - 03 [h264-720p][C997AD9B].mkv
d.get_hash:       8CAA3ED5CB29999A6DA84739FDFF2D6B04489833
d.is_active:      
d.get_down_total: 
d.get_up_total:   
d.get_size_bytes: 
.

멀티 볼리얼은 모든 것을 하나의 요청으로 얻을 수 있습니다. 똑같은 여기에 - 작동하지 않습니다.

print_r(request("d.multicall",array(
    "main",
    "d.get_name=",
    "d.get_base_path=",
    "d.get_up_total=",
    "d.get_size_bytes=",
    "d.get_down_total=",
    "d.get_completed_chunks=",
    "d.get_connection_current=",
    "d.get_connection_leech=",
    "d.get_connection_seed=",
    "d.get_creation_date="
)));
.
Array
(
    [0] => Array
        (
            [0] => [Anime-Koi] Tokyo Ravens - 01v2 [h264-720p][9E02D3C9].mkv
            [1] => /data/rtorrent/complete/[Anime-Koi] Tokyo Ravens - 01v2 [h264-720p][9E02D3C9].mkv
            [2] => 
            [3] => 
            [4] => 
            [5] => 
            [6] => seed
            [7] => 
            [8] => 
            [9] => 
        )

    [1] => Array
        (
            [0] => [Anime-Koi] Tokyo Ravens - 03 [h264-720p][C997AD9B].mkv
            [1] => /data/rtorrent/complete/[Anime-Koi] Tokyo Ravens - 03 [h264-720p][C997AD9B].mkv
            [2] => 
            [3] => 
            [4] => 
            [5] => 
            [6] => seed
            [7] => 
            [8] => 
            [9] => 
        )
)
.

Hower, 전역 요청이 정상적으로 작동합니다.

print_r(request('view_list',null));
.
Array
(
    [0] => main
    [1] => default
    [2] => name
    [3] => active
    [4] => started
    [5] => stopped
    [6] => complete
    [7] => incomplete
    [8] => hashing
    [9] => seeding
    [10] => leeching
)
.
print_r(request('system.listMethods',null));
.
Array
(
    [0] => system.listMethods
    [1] => system.methodExist
    [2] => system.methodHelp
    [...]
    [959] => view_sort_new
    [960] => xmlrpc_dialect
    [961] => xmlrpc_size_limit
)
.

요청 기능에서 다음에 추가 할 때 첫 번째 토런트에 대한 XML 요청의 몇 가지 예 :

echo "request for \"$method\"\n".htmlentities($data)."\nresult: ";
.
request for "d.get_name"

<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>d.get_name</methodName>
<params>
 <param>
  <value>
   <string>0CF0C7F75D18281AE7C65309F6B798CEB149BCB8</string>
  </value>
 </param>
</params>
</methodCall>

result: [Anime-Koi] Tokyo Ravens - 01v2 [h264-720p][9E02D3C9].mkv
.
request for "d.get_base_path"

<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>d.get_base_path</methodName>
<params>
 <param>
  <value>
   <string>0CF0C7F75D18281AE7C65309F6B798CEB149BCB8</string>
  </value>
 </param>
</params>
</methodCall>

result: /data/rtorrent/complete/[Anime-Koi] Tokyo Ravens - 01v2 [h264-720p][9E02D3C9].mkv
.
request for "d.get_down_total"

<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>d.get_down_total</methodName>
<params>
 <param>
  <value>
   <string>0CF0C7F75D18281AE7C65309F6B798CEB149BCB8</string>
  </value>
 </param>
</params>
</methodCall>

result: 
.
request for "d.get_size_bytes"

<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>d.get_size_bytes</methodName>
<params>
 <param>
  <value>
   <string>0CF0C7F75D18281AE7C65309F6B798CEB149BCB8</string>
  </value>
 </param>
</params>
</methodCall>

result: 
.

일부 요청만이 유용한 것을 반환하는 것이 무엇인가?

도움이 되었습니까?

해결책

이것은 PHP-XMLRPC 내의 버그입니다.

그러나 라인을 바꿀 수 있습니다 :

$response = xmlrpc_decode(curl_exec($ch));
.

다음과 같이 :

$response = xmlrpc_decode(str_replace('i8>', 'i4>', curl_exec($ch)));
.

예상대로 작동해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top