dever 4 years ago
parent
commit
0f9a93d978
6 changed files with 103 additions and 18 deletions
  1. 18 0
      database/data.php
  2. 13 3
      database/project.php
  3. 6 6
      database/set.php
  4. 9 4
      lib/Api.php
  5. 56 4
      lib/Parse.php
  6. 1 1
      src/Data.php

+ 18 - 0
database/data.php

@@ -96,6 +96,12 @@ return array
 		'insert' => false,
 		'edit' => false,
 		//'delete' => false,
+
+		# 自定义快捷新增和编辑
+        'button' => array
+        (
+            //'新增兑换码' => array('fast', 1, 'config&where_id=1'),
+        ),
 	),
 
 	
@@ -127,5 +133,17 @@ return array
 			'type' => 'all',
 			'order' => array('id', 'asc'),
 		),
+
+		'getOne' => array
+		(
+			# 匹配的正则或函数 选填项
+			'option' => array
+			(
+				'pid' => 'yes',
+				'state' => 1,
+			),
+			'type' => 'one',
+			'order' => array('id', 'desc'),
+		),
 	),
 );

+ 13 - 3
database/project.php

@@ -136,7 +136,7 @@ return array
 			'match' 	=> 'is_numeric',
 			'option' 	=> $status,
 			'list'		=> 'Dever::load("spider/lib/project.status", {id})',
-			'update'	=> 'radio',
+			'update'	=> $id < 0 ? 'hidden': 'radio',
 			//'edit'		=> true,
 		),
 
@@ -179,6 +179,18 @@ return array
 			'update'	=> $id < 0 ? 'hidden' : 'text',
 		),
 
+		'push'		=> array
+		(
+			'type' 		=> 'varchar-2000',
+			'name' 		=> '数据推送-采集数据时,会自动往设置好的数据推送接口推送数据,多个用换行隔开,支持http协议和dever协议',
+			'default' 	=> '',
+			'desc' 		=> '数据推送',
+			'match' 	=> 'option',
+			'update'	=> $id < 0 ? 'hidden': 'textarea',
+			//'edit'		=> true,
+			//'list'		=> true,
+		),
+
 		'reorder'		=> array
 		(
 			'type' 		=> 'int-11',
@@ -244,8 +256,6 @@ return array
 			'list_col' => array('设置采集字段', '"col&search_option_pid={id}&oper_parent=project"', '{project_id} > 0 && {status} <= 2'),
 
 			'list_col1' => array('设置自定义字段', '"set&search_option_pid={id}&oper_parent=project"', '{project_id} > 0 && {status} <= 2'),
-
-			'list_col2' => array('设置同步推送', '"push&search_option_pid={id}&oper_parent=project"', '{project_id} > 0 && {status} <= 2'),
 			
 			'br2' => array('<br /><br />'),
 			'new' => array('测试采集', 'Dever::url("spider/lib/api.test?id={id}")', '{project_id} > 0'),

+ 6 - 6
database/set.php

@@ -5,9 +5,9 @@ $type = array
 (
 	1 => '固定值',
 	2 => '自增值',
-	3 => '区间随机值',
-	4 => '间随机值',
-	5 => '公式算法',
+	3 => '公式算法',
+	4 => '间随机值',
+	5 => '时间随机值',
 );
 
 return array
@@ -75,7 +75,7 @@ return array
 		'type'		=> array
 		(
 			'type' 		=> 'tinyint-1',
-			'name' 		=> '字段类型-如果选择文件类型,将只会保存文件的网络地址',
+			'name' 		=> '字段类型',
 			'default' 	=> '1',
 			'desc' 		=> '字段类型',
 			'match' 	=> 'is_numeric',
@@ -88,9 +88,9 @@ return array
 		'value'		=> array
 		(
 			'type' 		=> 'varchar-2000',
-			'name' 		=> '字段值',
+			'name' 		=> '字段值-如果是区间随机值和时间随机值,第一行就是最小值,第二行就是最大值',
 			'default' 	=> '',
-			'desc' 		=> '采集规则',
+			'desc' 		=> '字段值',
 			'match' 	=> 'is_string',
 			'update'	=> 'textarea',
 			'list'		=> true,

+ 9 - 4
lib/Api.php

@@ -91,14 +91,14 @@ class Api
 		if (!$config) {
 			return false;
 		}
-		# 此处开task
 		$col = $this->col($config['id']);
+		$set = $this->set($config['id']);
 
 		if (strpos($config['site'], '{') !== false && strpos($config['site'], '}') !== false) {
 			$this->preg($config, $col);
 		} else {
 			Dever::load('spider/lib/project')->set($config, 4, 1);
-			$this->parse($config['site'], $config['id'], $config['collect_rule'], $col);
+			$this->parse($config['site'], $config['id'], $config['collect_rule'], $col, $set, $config['push']);
 		}
 		/*
 		Dever::task(function() use($config, $this)
@@ -115,9 +115,14 @@ class Api
 		return Dever::db('spider/col')->getList(['where_pid' => $project]);
 	}
 
-	private function parse($url, $project, $rule, $col)
+	private function set($project)
 	{
-		$parse = new Parse($url, $project, $rule, $col);
+		return Dever::db('spider/set')->getList(['where_pid' => $project]);
+	}
+
+	private function parse($url, $project, $rule, $col, $set, $push)
+	{
+		$parse = new Parse($url, $project, $rule, $col, $set, $push);
 		return $parse->get();
 	}
 

+ 56 - 4
lib/Parse.php

@@ -10,7 +10,7 @@ class Parse
 	private $doc = array();
 	private $data = array();
 
-	public function __construct($url, $project, $rule, $col)
+	public function __construct($url, $project, $rule, $col, $set, $push)
 	{
 		$doc = Doc::getInstance($url, $rule);
 		$doc->log(new Log($project));
@@ -30,10 +30,10 @@ class Parse
 						if (!strstr($v, 'http')) {
 							$v = $host . $v;
 						}
-						$this->data[$k] = $this->load($doc, $v, $col, $project);
+						$this->data[$k] = $this->load($doc, $k, $v, $col, $set, $push, $project);
 					}
 				} else {
-					$this->data = $this->load($doc, $data, $col, $project);
+					$this->data = $this->load($doc, 0, $data, $col, $set, $push, $project);
 				}
 			}
 		}
@@ -45,7 +45,7 @@ class Parse
 		return $this->data;
 	}
 
-	private function load($doc, $data, $col, $project)
+	private function load($doc, $index, $data, $col, $set, $push, $project)
 	{
 		$result = $table = array();
 		$data = $doc->init($data);
@@ -90,6 +90,21 @@ class Parse
 				$table[$v['name']] = $value;
 			}
 		}
+
+		if ($set) {
+			foreach ($set as $v) {
+				$value = $this->set($index, $v, $project);
+				$result[$v['key']] = $value;
+				if (Dever::input('test') == 1) {
+					$table[$v['name']] = $value;
+				}
+			}
+		}
+
+		if ($push) {
+			$this->push($push, $result);
+		}
+
 		if (Dever::input('test') == 1) {
 			$doc->outLog();
 			echo Dever::table($table);die;
@@ -98,6 +113,43 @@ class Parse
 		return $result;
 	}
 
+	private function push($push, $data)
+	{
+		$push = explode("\n", str_replace("\r", '', $push));
+		foreach ($push as $k => $v) {
+			Dever::curl($v, $data, 'post');
+		}
+	}
+
+	private function set($index, $data, $project)
+	{
+		if ($data['type'] == 1) {
+			return $data['value'];
+		} elseif ($data['type'] == 2) {
+			$old = 0;
+			$info = Dever::load('spider/data')->getOne(array('pid' => $project));
+			if($info) {
+				$value = json_decode($info['value'], true);
+				if (isset($value[$data['key']])) {
+					$old = $value[$data['key']];
+				}
+			}
+			return $data['value'] + $index + $old;
+		} elseif ($data['type'] == 3) {
+			$eval = '$value = ' . $data['value'] . ';';
+			eval($eval);
+			return $value;
+		} elseif ($data['type'] == 4) {
+			$temp = explode("\n", str_replace("\r", '', $data['value']));
+			return mt_rand($temp[0], $temp[1]);
+		} elseif ($data['type'] == 5) {
+			$temp = explode("\n", str_replace("\r", '', $data['value']));
+			$temp[0] = Dever::maketime($temp[0]);
+			$temp[1] = Dever::maketime($temp[1]);
+			return mt_rand($temp[0], $temp[1]);
+		}
+	}
+
 	private function filter($content)
 	{
 		$rule = '<(a).+href="(.*?)"(.*?)>(.*?)<\/a>';

+ 1 - 1
src/Data.php

@@ -26,7 +26,7 @@ class Data
 	public function get($project_id = 1)
 	{
 		echo Dever::input('id');die;
-		$data = Dever::load('spider/data-all', array('option_project_id' => $project_id));
+		$data = Dever::load('spider/data-all', array('option_pid' => $project_id));
 
 		return $data;
 	}