log(new Log($project)); $data = $doc->get($param); if ($data) { if (!is_array($data) && !is_object($data)) { $state = Dever::json_decode($data); if ($state) { $data = $state; } } if ($data) { if (is_array($data)) { $domain = parse_url($url); $host = $domain['scheme'] . '://' . $domain['host']; foreach ($data as $k => $v) { if (is_string($v) && !strstr($v, 'http')) { $v = $host . $v; } $this->data[$k] = $this->load($doc, $k, $v, $col, $set, $push, $project); } } else { $this->data = $this->load($doc, 0, $data, $col, $set, $push, $project); } } } $doc->saveLog(); } public function get() { return $this->data; } private function load($doc, $index, $data, $col, $set, $push, $project) { $result = $table = array(); $data = $doc->init($data); if (!$col) { if (Dever::input('test') == 1) { $doc->outLog(); echo 'error';die; } return false; } foreach ($col as $v) { $callback = false; if (strpos($v['key'], '.') !== false) { $temp = explode('.', $v['key']); $v['key'] = $temp[1]; $callback = $temp[0]; } $value = $doc->rule($data, $col, $v); if ($value == 'error') { break; } if ($callback) { if (function_exists($callback)) { $value = $callback($value); } else { $value = Dever::{$callback}($value); } } if ($v['local'] == 1) { $this->res = $v['res_key']; $value = $this->local($value, $v['type']); } if ($v['collect_filter_link'] == 1) { $value = $this->filter($value); } $result[$v['key']] = $value; if (Dever::input('test') == 1) { $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) { $result['test'] = Dever::input('test'); $this->push($push, $result); } if (Dever::input('test') == 1) { $doc->outLog(); echo Dever::table($table);die; } $this->update($result, $project); return $result; } private function push($push, $data) { $push = explode("\n", str_replace("\r", '', $push)); foreach ($push as $k => $v) { if (strstr($v, 'http')) { Dever::curl($v, $data, 'post'); } else { Dever::load($v, $data); } } } private function set($index, $data, $project) { if ($data['type'] == 1) { return $data['value']; } elseif ($data['type'] == 2) { $old = 0; $info = Dever::db('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>'; $content = preg_replace_callback('/' . $rule . '/i', array($this, 'filter_replace'), $content); return $content; } private function filter_replace($result) { if (isset($result[4]) && $result[4]) { return $result[4]; } } private function local($content, $type = 1) { if ($type == 1) { $rule = '<(img|video|audio).+src=\"?(.+\.(jpg|gif|bmp|bnp|png))\"?.+>'; $content = preg_replace_callback('/' . $rule . '/i', array($this, 'local_replace'), $content); } else { $content = $this->copy($content); } return $content; } private function local_replace($result) { if (isset($result[2]) && $result[2]) { $file = $this->copy($result[2]); if ($file) { $result[0] = str_replace($result[2], $file, $result[0]); return $result[0]; } } } private function copy($file) { $data = Dever::load('upload/save.copy?file=' . $file . '&key=' . $this->res . '&state=1'); if (isset($data['url'])) { return $data['url']; } else { return $file; } } private function update($data, $project) { $param['option_pid'] = $project; $param['option_value'] = json_encode($data, JSON_UNESCAPED_UNICODE); $info = Dever::db('spider/data')->one($param); if ($info) { $update = array(); foreach ($param as $i => $j) { $i = str_replace('option_', 'set_', $i); $update[$i] = $j; } $id = $update['where_id'] = $info['id']; Dever::db('spider/data')->update($update); } else { $update = array(); foreach ($param as $i => $j) { $i = str_replace('option_', 'add_', $i); $update[$i] = $j; } $id = Dever::db('spider/data')->insert($update); } } }