skycaiji2cms.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. <?php
  2. //版本:1.2.3
  3. define('in_skycaiji2cms', 1);//权限
  4. include 'head.php';
  5. class skycaiji2cms{
  6. public $charset;//编码
  7. public $pluginPath;//插件根目录
  8. public $pluginUrl;//插件根网址
  9. public $pluginConfig;//插件配置
  10. public $funcError;//报错函数
  11. public $funcFormPost;//表单提交函数
  12. public $funcApiPost;//接口提交函数
  13. public $funcGetPost;//获取$_POST参数函数
  14. public $openForm;//是否使用表单设置
  15. public $formHeadHtml;//表单头部html
  16. public $formFootHtml;//表单尾部html
  17. public $formUrl='';//form表单地址
  18. public $formRequired;//表单必填项
  19. public $formOptional;//表单选填项
  20. public $apiUrl;//接口地址
  21. public $bodyEndHtml;//结束html
  22. public $pluginLang;//语言包,不同编码
  23. public $static;//静态资源
  24. //初始化
  25. public function __construct($pluginPath,$pluginUrl,$charset='utf-8',$openForm=false){
  26. $this->pluginPath=rtrim($pluginPath,'/\\').DIRECTORY_SEPARATOR;
  27. $this->pluginUrl=rtrim($pluginUrl,'/\\').'/';
  28. $this->openForm=$openForm?true:false;
  29. $this->charset=strtolower($charset);
  30. $langFile=$this->pluginPath.'skycaiji2cms/lang.php';
  31. if(file_exists($langFile)){
  32. $this->pluginLang=include $langFile;
  33. }
  34. $this->static=array(
  35. 'css'=>$this->pluginUrl.'skycaiji2cms/css.css'
  36. );
  37. }
  38. //表单是post提交
  39. public function formIsPost(){
  40. $sub=$this->doGetPost('formsub');
  41. if(!empty($sub)){
  42. return true;
  43. }else{
  44. return false;
  45. }
  46. }
  47. //表单提交
  48. public function formPost(){
  49. $data=array(
  50. 'apikey'=>$this->doGetPost('apikey'),
  51. 'author'=>$this->doGetPost('author'),
  52. 'apitype'=>$this->doGetPost('apitype')
  53. );
  54. if(empty($data['author'])){
  55. $this->doError($this->pluginLang['empty_author']);
  56. }
  57. if(empty($data['apikey'])){
  58. $this->doError($this->pluginLang['empty_apikey']);
  59. }
  60. $this->doFormPost($data);
  61. }
  62. //表单html页面
  63. public function formView(){
  64. $this->pluginConfig=$this->setPluginConfig($this->pluginConfig);
  65. $scj2cms=$this;
  66. include $this->pluginPath.'skycaiji2cms/form.php';
  67. }
  68. //接口提交
  69. public function apiPost(){
  70. if(strtolower($_SERVER['REQUEST_METHOD'])!='post'){
  71. $this->returnJson(0,$this->pluginLang['error_request']);
  72. }
  73. $this->pluginConfig=$this->setPluginConfig($this->pluginConfig);
  74. if(empty($this->pluginConfig)){
  75. $this->returnJson(0,$this->pluginLang['empty_plugin_config']);
  76. }
  77. if(empty($this->pluginConfig['author'])){
  78. $this->returnJson(0,$this->pluginLang['empty_author']);
  79. }
  80. if(empty($this->pluginConfig['apikey'])){
  81. $this->returnJson(0,$this->pluginLang['empty_apikey']);
  82. }
  83. if(empty($this->pluginConfig['apitype'])){
  84. //普通
  85. if($_GET['apikey']!=md5($this->pluginConfig['apikey'])){
  86. $this->returnJson(0,$this->pluginLang['error_apikey']);
  87. }
  88. }elseif($this->pluginConfig['apitype']=='safe'){
  89. //安全
  90. $apiTime=$this->doGetPost('api_time');
  91. $apiTime=intval($apiTime);
  92. $apiSign=$this->doGetPost('api_sign');
  93. if($apiSign!=md5($apiTime.$this->pluginConfig['apikey'])){
  94. $this->returnJson(0,$this->pluginLang['error_api_sign']);
  95. }elseif(time()-$apiTime>600){
  96. $this->returnJson(0,$this->pluginLang['error_timeout'].date('Y-m-d H:i:s',$apiTime));
  97. }
  98. }else{
  99. $this->returnJson(0,$this->pluginLang['error_apitype']);
  100. }
  101. $this->doApiPost();
  102. }
  103. public function returnJson($id,$error='',$target='',$desc=''){
  104. //输出json数据
  105. ob_clean();
  106. $data=array(
  107. 'id'=>$id,
  108. 'target'=>$target,
  109. 'desc'=>$desc,
  110. 'error'=>$error,
  111. );
  112. if($data['error']){
  113. $data['error']=$this->pluginLang['error_return'].$data['error'];
  114. }
  115. if($this->charset!='utf-8'){
  116. foreach ($data as $k=>$v){
  117. $data[$k]=iconv($this->charset,'utf-8'.'//IGNORE',$v);
  118. }
  119. }
  120. header('content-type:application/json;charset=utf-8');
  121. $data=json_encode($data);
  122. exit($data);
  123. }
  124. //随机一行
  125. public function randLine($str){
  126. $list=array();
  127. if($str&&preg_match_all('/[^\r\n]+/',$str,$list)){
  128. $list=$list[0];
  129. $list=array_filter($list);
  130. $list=array_values($list);
  131. }else{
  132. $list=array();
  133. }
  134. $rand=array_rand($list,1);
  135. $rand=$list[$rand];
  136. return $rand;
  137. }
  138. public function curl($url,$headers=array(),$options=array(),$postData=null){
  139. $headers=is_array($headers)?$headers:array();
  140. $options=is_array($options)?$options:array();
  141. $options['timeout']=intval($options['timeout']);
  142. $options['timeout']=$options['timeout']>0?$options['timeout']:20;//连接超时
  143. $ch = curl_init ();
  144. curl_setopt ( $ch, CURLOPT_URL, $url );
  145. curl_setopt ( $ch, CURLOPT_TIMEOUT, $options['timeout'] );
  146. curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT , 10 );//响应超时
  147. curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
  148. curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 );
  149. curl_setopt ( $ch, CURLOPT_HEADER, 1 );
  150. if($options['nobody']){
  151. //不返回正文
  152. curl_setopt($ch, CURLOPT_NOBODY, true);
  153. }
  154. if($options['useragent']){
  155. //浏览器标识
  156. curl_setopt($ch, CURLOPT_USERAGENT, $options['useragent']);
  157. }
  158. //忽略https模式
  159. curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
  160. curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
  161. //设置头信息
  162. if(!empty($headers)&&count($headers)>0){
  163. curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
  164. }
  165. if(isset($postData)&&$postData!==false){
  166. //不是null和false是post模式
  167. curl_setopt ( $ch, CURLOPT_POST, 1 );
  168. if(is_array($postData)){
  169. //必须转成url字符串才是网页表单类型application/x-www-form-urlencoded
  170. $postData=http_build_query($postData);
  171. }
  172. curl_setopt ( $ch, CURLOPT_POSTFIELDS, $postData );
  173. }
  174. $body = curl_exec ( $ch );
  175. $headerPos=strpos($body, "\r\n\r\n");//头信息定位索引
  176. if($headerPos!==false){
  177. $headerPos=intval($headerPos)+strlen("\r\n\r\n");//加上换行的长度等于头大小
  178. }
  179. $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);//头大小
  180. $headerSize=intval($headerSize);
  181. if($headerSize<$headerPos){
  182. $headerSize=$headerPos;
  183. }
  184. $header = substr($body, 0, $headerSize);//头信息
  185. $body = substr($body, $headerSize);//body内容
  186. $code=curl_getinfo($ch,CURLINFO_HTTP_CODE);//状态码
  187. $code=intval($code);
  188. curl_close ( $ch );
  189. $data=array('success'=>false,'header'=>$header);
  190. if($code>=200&&$code<300){
  191. $data['success']=true;
  192. $data['body']=$body;
  193. }
  194. return $data;
  195. }
  196. //运行错误
  197. protected function doError($msg){
  198. call_user_func($this->funcError, $msg);
  199. }
  200. //运行formPost
  201. protected function doFormPost($data){
  202. call_user_func($this->funcFormPost, $data);
  203. }
  204. //运行apiPost
  205. protected function doApiPost(){
  206. call_user_func($this->funcApiPost);
  207. }
  208. //获取post参数
  209. protected function doGetPost($key){
  210. if(empty($this->funcGetPost)){
  211. return isset($_POST[$key])?$_POST[$key]:'';
  212. }else{
  213. return call_user_func($this->funcGetPost,$key);
  214. }
  215. }
  216. //设置插件配置
  217. protected function setPluginConfig($pluginConfig){
  218. $pluginConfig=(array)$pluginConfig;
  219. if(empty($pluginConfig)){
  220. $pluginConfig=array();
  221. }
  222. return $pluginConfig;
  223. }
  224. //判断https
  225. public function isSsl(){
  226. $server = $_SERVER;
  227. if (isset($server['HTTPS']) && ('1' == $server['HTTPS'] || 'on' == strtolower($server['HTTPS']))) {
  228. return true;
  229. } elseif (isset($server['REQUEST_SCHEME']) && 'https' == $server['REQUEST_SCHEME']) {
  230. return true;
  231. } elseif (isset($server['SERVER_PORT']) && ('443' == $server['SERVER_PORT'])) {
  232. return true;
  233. } elseif (isset($server['HTTP_X_FORWARDED_PROTO']) && 'https' == $server['HTTP_X_FORWARDED_PROTO']) {
  234. return true;
  235. }
  236. return false;
  237. }
  238. //域名
  239. public function getHost(){
  240. $host='';
  241. if (isset($_SERVER['HTTP_X_REAL_HOST'])) {
  242. $host = $_SERVER['HTTP_X_REAL_HOST'];
  243. } else {
  244. $host = $_SERVER['HTTP_HOST'];
  245. }
  246. return $host;
  247. }
  248. }