<?php

namespace app\lib;

use Exception;

class Btapi
{
    private $BT_KEY; //接口密钥
  	private $BT_PANEL; //面板地址
	
	public function __construct($bt_panel, $bt_key){
		$this->BT_PANEL = $bt_panel;
		$this->BT_KEY = $bt_key;
	}
	
    //获取面板配置信息
	public function get_config(){
		$url = $this->BT_PANEL.'/config?action=get_config';
		
		$p_data = $this->GetKeyData();
		
		$result = $this->curl($url,$p_data);
		
		$data = json_decode($result,true);
      	return $data;
	}

	//获取已登录用户信息
	public function get_user_info(){
		$url = $this->BT_PANEL.'/plugin?action=a&name=kaixin&s=get_user_info';
		
		$p_data = $this->GetKeyData();
		
		$result = $this->curl($url,$p_data);
		
		$data = json_decode($result,true);
      	return $data;
	}

	//从云端获取插件列表
	public function get_plugin_list(){
		$url = $this->BT_PANEL.'/plugin?action=a&name=kaixin&s=get_plugin_list';
		
		$p_data = $this->GetKeyData();
		
		$result = $this->curl($url,$p_data);
		
		$data = json_decode($result,true);
      	return $data;
	}

	//下载插件包,返回文件路径
	public function get_plugin_filename($plugin_name, $version){
		$url = $this->BT_PANEL.'/plugin?action=a&name=kaixin&s=download_plugin';
		
		$p_data = $this->GetKeyData();
		$p_data['plugin_name'] = $plugin_name;
		$p_data['version'] = $version;
		
		$result = $this->curl($url,$p_data);
		
		$data = json_decode($result,true);
      	return $data;
	}

	//下载插件主程序文件,返回文件路径
	public function get_plugin_main_filename($plugin_name, $version){
		$url = $this->BT_PANEL.'/plugin?action=a&name=kaixin&s=download_plugin_main';
		
		$p_data = $this->GetKeyData();
		$p_data['plugin_name'] = $plugin_name;
		$p_data['version'] = $version;
		
		$result = $this->curl($url,$p_data);
		
		$data = json_decode($result,true);
      	return $data;
	}

	//解密插件主程序py代码,返回文件路径
	public function get_decode_plugin_main($plugin_name, $version){
		$url = $this->BT_PANEL.'/plugin?action=a&name=kaixin&s=decode_plugin_main';
		
		$p_data = $this->GetKeyData();
		$p_data['plugin_name'] = $plugin_name;
		$p_data['version'] = $version;
		
		$result = $this->curl($url,$p_data);
		
		$data = json_decode($result,true);
      	return $data;
	}

	//下载插件其他文件,返回文件路径
	public function get_plugin_other_filename($fname){
		$url = $this->BT_PANEL.'/plugin?action=a&name=kaixin&s=download_plugin_other';
		
		$p_data = $this->GetKeyData();
		$p_data['fname'] = $fname;
		
		$result = $this->curl($url,$p_data);
		
		$data = json_decode($result,true);
      	return $data;
	}

	//下载文件
	public function download($filename, $localpath){
		$url = $this->BT_PANEL.'/download';
		
		$p_data = $this->GetKeyData();
		$p_data['filename'] = $filename;

		$result = $this->curl_download($url.'?'.http_build_query($p_data), $localpath);

      	return $result;
	}

	//获取文件base64
	public function get_file($filename){
		$url = $this->BT_PANEL.'/plugin?action=a&name=kaixin&s=get_file';
		
		$p_data = $this->GetKeyData();
		$p_data['filename'] = $filename;
		
		$result = $this->curl($url,$p_data);
		
		$data = json_decode($result,true);
      	return $data;
	}

	//购买第三方插件
	public function create_plugin_other_order($pid){
		$url = $this->BT_PANEL.'/auth?action=create_plugin_other_order';
		
		$p_data = $this->GetKeyData();
		$p_data['pid'] = $pid;
		$p_data['cycle'] = '999';
		$p_data['type'] = '0';
		
		$result = $this->curl($url,$p_data);
		
		$data = json_decode($result,true);
      	return $data;
	}

	//获取一键部署列表
	public function get_deplist(){
		$url = $this->BT_PANEL.'/plugin?action=a&name=kaixin&s=get_deplist';
		
		$p_data = $this->GetKeyData();
		
		$result = $this->curl($url,$p_data);
		
		$data = json_decode($result,true);
      	return $data;
	}

	//BTWAF-获取蜘蛛列表
	public function btwaf_getspiders(){
		$url = $this->BT_PANEL.'/plugin?action=a&name=kaixin&s=btwaf_getspiders';
		
		$p_data = $this->GetKeyData();
		
		$result = $this->curl($url,$p_data);
		$result = str_replace("\u0000", '', $result);
		
		$data = json_decode($result,true);
      	return $data;
	}
	

  	private function GetKeyData(){
  		$now_time = time();
    	$p_data = array(
			'request_token'	=>	md5($now_time.''.md5($this->BT_KEY)),
			'request_time'	=>	$now_time
		);
    	return $p_data;    
    }
  	
  
    private function curl($url, $data = null, $timeout = 60)
    {
    	//定义cookie保存位置
        $cookie_file=app()->getRuntimePath().md5($this->BT_PANEL).'.cookie';
        if(!file_exists($cookie_file)){
            touch($cookie_file);
        }
		
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
		if($data){
			curl_setopt($ch, CURLOPT_POST, 1);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
		}
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }

	private function curl_download($url, $localpath, $timeout = 300)
    {
    	//定义cookie保存位置
        $cookie_file=app()->getRuntimePath().md5($this->BT_PANEL).'.cookie';
        if(!file_exists($cookie_file)){
            touch($cookie_file);
        }
		
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
		$fp = fopen($localpath, 'w+');
		curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_exec($ch);
		if (curl_errno($ch)) {
			$message = curl_error($ch);
			curl_close($ch);
			fclose($fp);
			throw new Exception('下载文件失败:'.$message);
		}
		$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
		if($httpcode>299){
			curl_close($ch);
			fclose($fp);
			throw new Exception('下载文件失败:HTTPCODE-'.$httpcode);
		}
        curl_close($ch);
		fclose($fp);
        return true;
    }
}