存档

文章标签 ‘种子’

php如何解析bt种子文件并获取种子内的文件列表和大小等信息,还可以转换为磁力链接。

2015年12月11日 没有评论

php如何解析bt种子文件并获取种子内的文件列表和大小等信息,还可以转换为磁力链接。

当然还可以将制定的磁力链接转换为种子文件并下载。

代码文件:lightbenc.php,index.php

lightbenc.php是类文件,index.php是操作文件。具体代码如下:

<?php
require ‘lightbenc.php’;
$Lightbenc=new Lightbenc();
$btfile=$Lightbenc->bdecode_getinfo(‘种子.torrent’);
//获取种子文件信息
echo “<strong>种子文件名</strong>:”.$btfile[‘info’][‘name’].'<br />’;
echo “<strong>种子文件数</strong>:”.$btfile[‘info’][‘filecount’].'<br />’;
echo “<strong>种子大小</strong>:”.$btfile[‘info’][‘size’].'<br />’;
echo “<strong>磁力链接</strong>:”.’magnet:?xt=urn:btih:’.$btfile[‘info_hash’].'<br />’;
echo “<strong>下载种子</strong>:”.’http://bt.box.n0808.com/’.substr($btfile[‘info_hash’],0,2).’/’.substr($btfile[‘info_hash’],38).’/’.$btfile[‘info_hash’].’.torrent’.'<br />’;
echo “<strong>备用下载</strong>:”.’http://torcache.net/torrent/’.$btfile[‘info_hash’].’.torrent’.'<br />’;
echo “<strong>备用下载</strong>:”.’http://btcache.sobt.org/’.$btfile[‘info_hash’].’.torrent’.'<br />’;
echo “<strong>备用下载</strong>:”.’https://zoink.it/torrent/’.$btfile[‘info_hash’].’.torrent’.'<br />’;
echo ‘<br /><strong>文件信息</strong>:<br />’;
foreach($btfile[‘info’][‘files’] as $f){
echo ‘—文件总大小:’.$f[‘length’].’ byte<br />’;
echo ‘—文件列表:<br />’;
foreach($f[‘path’] as $path){
echo ‘——‘.$path.'<br />’;
}
echo ‘<br />’;
}
?>

 

下方为lightbenc.php的代码:

<?php
class Lightbenc{
public static function bdecode($s,&$pos=0){
if($pos>=strlen($s)){return null;}
switch($s[$pos]){
case ‘d’:
$pos++;
$retval=array();
while($s[$pos]!=’e’){
$key=Lightbenc::bdecode($s,$pos);
$val=Lightbenc::bdecode($s,$pos);
if($key===null || $val===null){break;}
$retval[$key]=$val;
}
$retval[“isDct”]=true;
$pos++;
return $retval;
case ‘l’:
$pos++;
$retval=array();
while($s[$pos]!=’e’){
$val=Lightbenc::bdecode($s,$pos);
if($val===null){break;}
$retval[]=$val;
}
$pos++;
return $retval;
case ‘i’:
$pos++;
$digits=strpos($s,’e’,$pos)-$pos;
$val=(int)substr($s,$pos,$digits);
$pos+=$digits+1;
return $val;
default:
$digits=strpos($s,’:’,$pos)-$pos;
if($digits<0 || $digits >20){return null;}
$len=(int)substr($s,$pos,$digits);
$pos+=$digits+1;
$str=substr($s,$pos,$len);
$pos+=$len;
return(string)$str;
}
return null;
}
public static function bencode(&$d){
if(is_array($d)){
$ret=”l”;
if(isset($d[“isDct”]) && $d[“isDct”]){
$isDict=1;
$ret=”d”;
ksort($d,SORT_STRING);
}
foreach($d as $key=>$value){
if(isset($isDict) && $isDict){
if($key==”isDct” and is_bool($value)) continue;
$ret.=strlen($key).”:”.$key;
}
if(is_string($value)){$ret.=strlen($value).”:”.$value;}
elseif(is_int($value)){$ret.=”i${value}e”;}
else {$ret.=Lightbenc::bencode($value);}
}
return $ret.”e”;
} elseif(is_string($d)) return strlen($d).”:”.$d;
elseif(is_int($d)) return “i${d}e”;
else return null;
}
public static function bdecode_file($filename){
$f=file_get_contents($filename,FILE_BINARY);
return Lightbenc::bdecode($f);
}
public static function bdecode_getinfo($filename){
$t=Lightbenc::bdecode(file_get_contents($filename,FILE_BINARY));
$t[‘info_hash’]=sha1(Lightbenc::bencode($t[‘info’]));
if(is_array($t[‘info’][‘files’])){ //multifile
$t[‘info’][‘size’]=0;
$t[‘info’][‘filecount’]=0;
foreach($t[‘info’][‘files’] as $file){
$t[‘info’][‘filecount’]++;
$t[‘info’][‘size’]+=$file[‘length’];
}
}else{
$t[‘info’][‘size’]=$t[‘info’][‘length’];
$t[‘info’][“filecount”]=1;
$t[‘info’][‘files’][0][‘path’]=$t[‘info’][‘name’];
$t[‘info’][‘files’][0][‘length’]=$t[‘info’][‘length’];
}
return $t;
}
}
?>

css.php