>  기사  >  백엔드 개발  >  PHP는 Tencent QQ Weibo API 인터페이스를 사용하여 Weibo 콘텐츠의 코드를 얻습니다.

PHP는 Tencent QQ Weibo API 인터페이스를 사용하여 Weibo 콘텐츠의 코드를 얻습니다.

WBOY
WBOY원래의
2016-07-25 08:57:471225검색
  1. /**

  2. * Tencent QQ Weibo API 인터페이스를 사용하여 Weibo 콘텐츠 획득
  3. * by bbs.it-home.org
  4. */
  5. define('HDOM_TYPE_ELEMENT', 1);
  6. define('HDOM_TYPE_COMMENT', 2);
  7. define('HDOM_TYPE_TEXT', 3);
  8. define('HDOM_TYPE_ENDTAG', 4);
  9. define('HDOM_TYPE_ROOT', 5);
  10. 정의('HDOM_TYPE_UNKNOWN', 6);
  11. define('HDOM_QUOTE_DOUBLE', 0);
  12. define('HDOM_QUOTE_SINGLE', 1);
  13. define('HDOM_QUOTE_NO', 3);
  14. define( 'HDOM_INFO_BEGIN', 0);
  15. define('HDOM_INFO_END', 1);
  16. define('HDOM_INFO_QUOTE', 2);
  17. define('HDOM_INFO_SPACE', 3);
  18. define('HDOM_INFO_TEXT ', 4);
  19. define('HDOM_INFO_INNER', 5);
  20. define('HDOM_INFO_OUTER', 6);
  21. define('HDOM_INFO_ENDSPACE',7);
  22. // 도우미 함수
  23. // ---------------
  24. // html dom 양식 파일 가져오기
  25. function file_get_html() {
  26. $dom = new simple_html_dom;
  27. $args = func_get_args();
  28. $dom->load(call_user_func_array('file_get_contents', $args), true);
  29. return $dom;
  30. }
  31. // html dom 형식 문자열 가져오기
  32. function str_get_html($str, $lowercase=true) {
  33. $dom = new simple_html_dom;
  34. $dom->load($str, $lowercase);
  35. return $dom;
  36. }
  37. // html DOM 트리 덤프
  38. function dump_html_tree($node, $show_attr=true, $deep=0) {
  39. $lead = str_repeat(' ', $deep);
  40. echo $ Lead.$node->tag;
  41. if ($show_attr && count($node->attr)>0) {
  42. echo '(';
  43. foreach($node->attr as $k=>$v)
  44. echo "[$k]=>"".$node->$k.'", ';
  45. echo ')';
  46. }
  47. echo "n";
  48. foreach($node->nodes as $c)
  49. dump_html_tree($c, $show_attr, $deep 1);
  50. }
  51. // DOM 형식 가져오기 파일(비PRecated)
  52. function file_get_dom() {
  53. $dom = new simple_html_dom;
  54. $args = func_get_args();
  55. $dom->load(call_user_func_array('file_get_contents', $args) , true);
  56. return $dom;
  57. }
  58. // DOM 형식 문자열 가져오기(더 이상 사용되지 않음)
  59. function str_get_dom($str, $lowercase=true) {
  60. $dom = new simple_html_dom ;
  61. $dom->load($str, $lowercase);
  62. return $dom;
  63. }
  64. // 간단한 html dom 노드
  65. // ------- --------
  66. class simple_html_dom_node {
  67. public $nodetype = HDOM_TYPE_TEXT;
  68. public $tag = 'text';
  69. public $attr = array();
  70. public $ children = array();
  71. public $nodes = array();
  72. public $parent = null;
  73. public $_ = array();
  74. private $dom = null;
  75. 함수 __construct($dom) {
  76. $this->dom = $dom;
  77. $dom->nodes[] = $this;
  78. }
  79. 함수 __destruct() {
  80. $ this->clear();
  81. }
  82. function __toString() {
  83. return $this->outertext();
  84. }
  85. // php5 순환 참조로 인해 메모리 정리 메모리 누수...
  86. 함수 Clear() {
  87. $this->dom = null;
  88. $this->nodes = null;
  89. $this->parent = null;
  90. $this->children = null;
  91. }

  92. // 노드의 트리를 덤프합니다

  93. function dump($show_attr=true) {
  94. dump_html_tree($this, $show_attr);
  95. }
  96. // 노드의 부모를 반환합니다
  97. function parent() {
  98. return $this->parent;
  99. }
  100. // 노드의 하위 항목을 반환합니다.
  101. function children($idx=-1) {
  102. if ($idx===-1 ) return $this->children;
  103. if (isset($this->children[$idx])) return $this->children[$idx];
  104. return null;
  105. }
  106. // 노드의 첫 번째 자식을 반환합니다
  107. function first_child() {
  108. if (count($this->children)>0) return $this->children[0];
  109. return null;
  110. }
  111. // 노드의 마지막 자식을 반환합니다
  112. function last_child() {
  113. if (($count=count($this->children))>0) return $this->children[$count-1];
  114. return null;
  115. }
  116. // 노드의 다음 형제를 반환합니다.
  117. function next_sibling() {
  118. if ($this ->parent===null) return null;
  119. $idx = 0;
  120. $count = count($this->parent->children);
  121. while ($idx<$count && $this!==$this->parent->children[$idx])
  122. $idx;
  123. if ( $idx>=$count) return null;
  124. return $this-> ;부모->자녀[$idx];
  125. }
  126. // 노드의 이전 형제를 반환합니다.
  127. function prev_sibling() {
  128. if ($this->parent===null) return null;
  129. $idx = 0;
  130. $ count = count($this->parent->children);
  131. while ($idx<$count && $this!==$this->parent->children[$idx])
  132. $idx;
  133. if (--$idx<0) return null;
  134. return $this->parent->children[$idx];
  135. }
  136. // dom 노드의 내부 가져오기 html
  137. function innertext() {
  138. if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
  139. if (isset($this-> _[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
  140. $ret = '';
  141. foreach($this->nodes as $n)
  142. $ret .= $n->outertext();
  143. return $ret;
  144. }
  145. // DOM 노드의 외부 텍스트 가져오기(태그 포함)
  146. function externaltext( ) {
  147. if ($this->tag==='root') return $this->innertext();
  148. // 콜백 트리거
  149. if ($this->dom-> ;callback!==null)
  150. call_user_func_array($this->dom->callback, array($this));
  151. if (isset($this->_[HDOM_INFO_OUTER])) return $ this->_[HDOM_INFO_OUTER];
  152. if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
  153. // 시작 태그 렌더링
  154. $ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup();
  155. // 내부 텍스트 렌더링
  156. if (isset($this->_[HDOM_INFO_INNER]))
  157. $ret .= $this->_[HDOM_INFO_INNER];
  158. else {
  159. foreach($this-> 노드를 $n으로)
  160. $ret .= $n->outertext();
  161. }
  162. // 종료 태그 렌더링
  163. if(isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END]!=0)
  164. $ret .= 'tag.'>';
  165. return $ret;
  166. }
  167. // dom 노드의 일반 텍스트 가져오기
  168. function text() {
  169. if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
  170. 스위치 ($this->nodetype) {
  171. 케이스 HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
  172. 케이스 HDOM_TYPE_COMMENT: return '';
  173. 케이스 HDOM_TYPE_UNKNOWN: return '';
  174. }
  175. if (strcasecmp($this->tag, 'script')===0) return '';
  176. if (strcasecmp($this- >tag, 'style')===0) return '';
  177. $ret = '';
  178. foreach($this->nodes as $n)
  179. $ret .= $n ->text();
  180. return $ret;
  181. }

  182. function xmltext() {

  183. $ret = $this->innertext();
  184. $ret = str_ireplace(' $ret = str_replace(']]>', '', $ret);
  185. return $ret;
  186. }
  187. // 태그로 노드의 텍스트 작성
  188. function make() {
  189. // 텍스트, 댓글, 알 수 없음
  190. if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
  191. $ ret = '<'.$this->tag;
  192. $i = -1;
  193. foreach($this->attr as $key=>$val) {
  194. $i;
  195. // 제거된 속성 건너뛰기
  196. if ($val===null || $val===false)
  197. continue;
  198. $ret .= $this->_[HDOM_INFO_SPACE][ $i][0];
  199. //값 없음 속성: nowrap, 선택됨...
  200. if ($val===true)
  201. $ret .= $key;
  202. else {
  203. switch($this->_[HDOM_INFO_QUOTE][$i]) {
  204. 케이스 HDOM_QUOTE_DOUBLE: $quote = '"'; break;
  205. 케이스 HDOM_QUOTE_SINGLE: $quote = '''; break;
  206. 기본값: $quote = '';
  207. }
  208. $ret .= $key.$this->_[HDOM_INFO_SPACE][$i][1].'='.$this ->_[HDOM_INFO_SPACE][$i][2].$quote.$val.$quote;
  209. }
  210. }
  211. $ret = $this->dom->restore_noise($ ret);
  212. $ret를 반환합니다. $this->_[HDOM_INFO_ENDSPACE] . '>';
  213. }
  214. // CSS 선택기로 요소 찾기
  215. function find($selector, $idx=null) {
  216. $selectors = $this->parse_selector($selector);
  217. if (($count =count($selectors))===0) return array();
  218. $found_keys = array();
  219. // 각 선택기 찾기
  220. for ($c=0; $c<$count ; $c) {
  221. if (($levle=count($selectors[0]))===0) return array();
  222. if (!isset($this->_[HDOM_INFO_BEGIN] )) return array();
  223. $head = array($this->_[HDOM_INFO_BEGIN]=>1);
  224. // 하위 선택기 처리, 재귀 없음!
  225. for ($l= 0; $l<$levle; $l) {
  226. $ret = array();
  227. foreach($k=>$v로 $head) {
  228. $n = ($k== =-1) ? $this->dom->root : $this->dom->nodes[$k];
  229. $n->seek($selectors[$c][$l], $ret) ;
  230. }
  231. $head = $ret;
  232. }
  233. foreach($head as $k=>$v) {
  234. if (!isset($found_keys[$k]) )
  235. $found_keys[$k] = 1;
  236. }
  237. }
  238. // 키 정렬
  239. ksort($found_keys);
  240. $found = array();
  241. foreach($found_keys as $k=>$v)
  242. $found[] = $this->dom->nodes[$k];
  243. // n번째 요소 또는 배열 반환
  244. if (is_null($idx)) return $found;
  245. else if ($idx<0) $idx = count($found) $idx;
  246. return (isset($found[$idx])) ? $found[$idx] : null;
  247. }
  248. // 주어진 조건 찾기
  249. protected functioneek($selector, &$ret) {
  250. list($tag, $key, $val , $exp, $no_key) = $selector;
  251. // xpath 인덱스
  252. if ($tag && $key && is_numeric($key)) {
  253. $count = 0;
  254. foreach ($ this->children as $c) {
  255. if ($tag==='*' || $tag===$c->tag) {
  256. if ( $count==$key) {
  257. $ret[$c->_[HDOM_INFO_BEGIN]] = 1;
  258. 반환;
  259. }
  260. }
  261. }
  262. 반환;
  263. }
  264. $ 끝 = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0;
  265. if ($end==0) {
  266. $parent = $this->parent;
  267. while (!isset($parent-> _[HDOM_INFO_END]) && $parent!==null) {
  268. $end -= 1;
  269. $parent = $parent->parent;
  270. }
  271. $end = $parent-> ;_[HDOM_INFO_END];
  272. }
  273. for($i=$this->_[HDOM_INFO_BEGIN] 1; $i<$end; $i) {
  274. $node = $this-> dom->nodes[$i];
  275. $pass = true;
  276. if ($tag==='*' && !$key) {
  277. if (in_array($node, $this- >children, true))
  278. $ret[$i] = 1;
  279. continue;
  280. }
  281. // 태그 비교
  282. if ($tag && $tag!=$node- >tag && $tag!=='*') {$pass=false;}
  283. // 키 비교
  284. if ($pass && $key) {
  285. if ($no_key) {
  286. if (isset($node->attr[$key])) $pass=false;
  287. }
  288. else if (!isset($node->attr[$key])) $pass= false;
  289. }
  290. // 값 비교
  291. if ($pass && $key && $val && $val!=='*') {
  292. $check = $this->match( $exp, $val, $node->attr[$key]);
  293. // 여러 클래스 처리
  294. if (!$check && strcasecmp($key, 'class')===0) {
  295. foreach(explode(' ',$node->attr[$key]) as $k) {
  296. $check = $this->match($exp, $val, $k);
  297. if ($check) break;
  298. }
  299. }
  300. if (!$check) $pass = false;
  301. }
  302. if ($pass) $ret[$i] = 1;
  303. unset($node);
  304. }
  305. }
  306. 보호 함수 match($exp, $pattern, $value) {
  307. 스위치($exp) {
  308. 케이스 ' =':
  309. return ($value===$pattern);
  310. case '!=':
  311. return ($value!==$pattern);
  312. case '^=':
  313. return preg_match("/^".preg_quote($pattern,'/')."/", $value);
  314. case '$=':
  315. return preg_match("/".preg_quote($ 패턴,'/')."$/", $value);
  316. 케이스 '*=':
  317. if ($pattern[0]=='/')
  318. return preg_match($pattern, $value);
  319. return preg_match("/".$pattern."/i", $value);
  320. }
  321. return false;
  322. }
  323. 보호 함수 parse_selector($selector_string) {
  324. // mootools에서 수정된 CSS 선택기 패턴
  325. $pattern = "/([w-:*]*)(?:#([w-] )|.([w-] ))?(?:[@?(!?[w-] )(?:([!*^$]?=)["']?(.*?)[" ']?)?])?([/, ] )/is";
  326. preg_match_all($pattern, Trim($selector_string).' ', $matches, PREG_SET_ORDER);
  327. $selectors = array() ;
  328. $result = array();
  329. //print_r($matches);
  330. foreach ($matches as $m) {
  331. $m[0] = Trim($m[0] );
  332. if ($m[0]==='' || $m[0]==='/' || $m[0]==='//') 계속;
  333. // grnreated xpath
  334. if ($m[1]==='tbody') continue;
  335. list($tag, $key, $val, $exp, $no_key) = array($m [1], null, null, '=', false);
  336. if(!empty($m[2])) {$key='id'; $val=$m[2];}
  337. if(!empty($m[3])) {$key='class'; $val=$m[3];}
  338. if(!empty($m[4])) {$key=$m[4];}
  339. if(!empty($m[5]) ) {$exp=$m[5];}
  340. if(!empty($m[6])) {$val=$m[6];}
  341. // 소문자로 변환
  342. if ($this->dom->소문자) {$tag=strtolower($tag); $key=strtolower($key);}
  343. //지정된 속성이 없는 요소
  344. if (isset($key[0]) && $key[0]==='!') { $key=substr($key, 1); $no_key=true;}
  345. $result[] = array($tag, $key, $val, $exp, $no_key);
  346. if (trim($m[7])===', ') {
  347. $selectors[] = $result;
  348. $result = array();
  349. }
  350. }
  351. if (count($result)>0)
  352. $ selectors[] = $result;
  353. return $selectors;
  354. }
  355. function __get($name) {
  356. if (isset($this->attr[$name])) return $this ->attr[$name];
  357. switch($name) {
  358. case 'outertext': return $this->outertext();
  359. case 'innertext': return $this-> innertext();
  360. 케이스 '일반 텍스트': return $this->text();
  361. 케이스 'xmltext': return $this->xmltext();
  362. 기본값: return array_key_exists($name , $this->attr);
  363. }
  364. }
  365. function __set($name, $value) {
  366. switch($name) {
  367. case 'outertext': return $this ->_[HDOM_INFO_OUTER] = $value;
  368. case 'innertext':
  369. if (isset($this->_[HDOM_INFO_TEXT])) return $this->_[HDOM_INFO_TEXT] = $value ;
  370. return $this->_[HDOM_INFO_INNER] = $value;
  371. }
  372. if (!isset($this->attr[$name])) {
  373. $this-> ;_[HDOM_INFO_SPACE][] = array(' ', '', '');
  374. $this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;
  375. }
  376. $this->attr[$name] = $value;
  377. }
  378. 함수 __isset($name ) {
  379. switch($name) {
  380. case 'outertext': return true;
  381. case 'innertext': return true;
  382. case 'plaintext': return true;
  383. }
  384. //값 없음 속성: 이제 랩, 선택됨...
  385. return (array_key_exists($name, $this->attr)) ? true : isset($this->attr[$name]);
  386. }
  387. function __unset($name) {
  388. if (isset($this->attr[$name]))
  389. unset($this->attr[$name]);
  390. }
  391. // 카멜 명명 규칙
  392. function getAllAttributes() {return $this->attr;}
  393. function getAttribute ($name) {return $this->__get($name);}
  394. 함수 setAttribute($name, $value) {$this->__set($name, $value);}
  395. 함수 hasAttribute($name) {return $this->__isset($name);}
  396. function RemoveAttribute($name) {$this->__set($name, null);}
  397. function getElementById($ id) {return $this->find("#$id", 0);}
  398. function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);}
  399. 함수 getElementByTagName($name) {return $this->find($name, 0);}
  400. function getElementsByTagName($name, $idx=null) {return $this-> ;find($name, $idx);}
  401. function parentNode() {return $this->parent();}
  402. function childNodes($idx=-1) {return $this->children ($idx);}
  403. function firstChild() {return $this->first_child();}
  404. function lastChild() {return $this->last_child();}
  405. function nextSibling( ) {return $this->next_sibling();}
  406. function PreviousSibling() {return $this->prev_sibling();}
  407. }
  408. // 간단한 HTML DOM 파서
  409. // ----------------------- ---------------
  410. class simple_html_dom {
  411. 공개 $root = null;
  412. 공개 $nodes = 배열();
  413. 공개 $callback = null;
  414. 공개 $lowercase = false;
  415. 보호 $pos;
  416. 보호 $doc;
  417. protected $char;
  418. protected $size;
  419. protected $cursor;
  420. protected $parent;
  421. protected $noise = array();
  422. protected $token_blank = " trn";
  423. protected $token_equal = ' =/>';
  424. protected $token_slash = " />rnt";
  425. protected $token_attr = ' >';
  426. // in_array 대신 isset을 사용합니다. 약 30% 성능 향상...
  427. protected $self_closing_tags = array('img'=>1, 'br'=>1, 'input'=>1, 'meta'=>1, ' link'=>1, 'hr'=>1, 'base'=>1, 'embed'=>1, 'spacer'=>1);
  428. protected $block_tags = array(' root'=>1, 'body'=>1, 'form'=>1, 'div'=>1, 'span'=>1, 'table'=>1);
  429. protected $ional_closing_tags = array(
  430. 'tr'=>array('tr'=>1, 'td'=>1, 'th'=>1),
  431. 'th'= >array('th'=>1),
  432. 'td'=>array('td'=>1),
  433. 'li'=>array('li'=> 1),
  434. 'dt'=>array('dt'=>1, 'dd'=>1),
  435. 'dd'=>array('dd'=>1, 'dt'=>1),
  436. 'dl'=>array('dd'=>1, 'dt'=>1),
  437. 'p'=>array('p '=>1),
  438. 'nobr'=>array('nobr'=>1),
  439. );
  440. function __construct($str=null) {
  441. if ($ str) {
  442. if (preg_match("/^http:///i",$str) || is_file($str))
  443. $this->load_file($str);
  444. else
  445. $this->load($str);
  446. }
  447. }
  448. http://www.devdao.com/
  449. function __destruct() {
  450. $this->clear();
  451. }
  452. // 문자열에서 html 로드
  453. function load($str, $lowercase=true) {
  454. // 준비
  455. $this-> ;prepare($str, $lowercase);
  456. // 주석 제거
  457. $this->remove_noise("''is");
  458. // cdata 제거
  459. $this->remove_noise("''is", true);
  460. // < 제거 스타일> 태그
  461. $this->remove_noise("']*[^/]>(.*?)'is") ;
  462. $this->remove_noise("'(.*?)'is");
  463. // < 제거 ;스크립트> 태그
  464. $this->remove_noise("']*[^/]>(.*?)'is") ;
  465. $this->remove_noise("'(.*?)'is");
  466. // 미리 포맷된 부분을 제거합니다. 태그
  467. $this->remove_noise("']*>(.*?) // 서버 측 스크립트 제거
  468. $this->remove_noise("'()'s", true);
  469. // 똑똑한 스크립트 제거
  470. $this->remove_noise("'({w)(.*?)(})'s", true);
  471. // 구문 분석
  472. while ( $this->parse());
  473. // 끝
  474. $this->root->_[HDOM_INFO_END] = $this->cursor;
  475. }
  476. // 로드 html 파일
  477. function load_file() {
  478. $args = func_get_args();
  479. $this->load(call_user_func_array('file_get_contents', $args), true);
  480. }
  481. // 콜백 함수 설정
  482. function set_callback($function_name) {
  483. $this->callback = $function_name;
  484. }
  485. // 콜백 함수 제거
  486. function Remove_callback() {
  487. $this->callback = null;
  488. }
  489. // dom을 문자열로 저장
  490. function save($filepath='') {
  491. $ret = $this->root- >innertext();
  492. if ($filepath!=='') file_put_contents($filepath, $ret);
  493. return $ret;
  494. }
  495. // CSS 선택기로 dom 노드 찾기
  496. function find($selector, $idx=null) {
  497. return $this->root->find($selector, $idx);
  498. }
  499. // 메모리 정리 예정 php5 순환 참조 메모리 누수...
  500. functionclear() {
  501. foreach($this->nodes as $n) {$n->clear(); $n = null;}
  502. if (isset($this->parent)) {$this->parent->clear(); unset($this->parent);}
  503. if (isset($this->root)) {$this->root->clear(); unset($this->root);}
  504. unset($this->doc);
  505. unset($this->noise);
  506. }
  507. function dump($show_attr=true) {

  508. $this->root->dump($show_attr);
  509. }
  510. // HTML 데이터를 준비하고 모든 것을 초기화합니다
  511. protected function prepare($ str, $lowercase=true) {
  512. $this->clear();
  513. $this->doc = $str;
  514. $this->pos = 0;
  515. $this ->cursor = 1;
  516. $this->noise = array();
  517. $this->nodes = array();
  518. $this->lowercase = $lowercase;
  519. $this->root = new simple_html_dom_node($this);
  520. $this->root->tag = '루트';
  521. $this->root->_[HDOM_INFO_BEGIN] = -1;
  522. $this->root->nodetype = HDOM_TYPE_ROOT;
  523. $this->parent = $this->root;
  524. // 콘텐츠 길이 설정
  525. $ this->size = strlen($str);
  526. if ($this->size>0) $this->char = $this->doc[0];
  527. }
  528. // HTML 콘텐츠 구문 분석
  529. protected function parse() {
  530. if (($s = $this->copy_until_char('<'))==='')
  531. return $this-> ;read_tag();
  532. // 텍스트
  533. $node = new simple_html_dom_node($this);
  534. $this->cursor;
  535. $node->_[HDOM_INFO_TEXT] = $s;
  536. $this->link_nodes($node, false);
  537. return true;
  538. }
  539. // 태그 정보 읽기
  540. protected function read_tag() {
  541. if ($this ->char!=='<') {
  542. $this->root->_[HDOM_INFO_END] = $this->cursor;
  543. return false;
  544. }
  545. $begin_tag_pos = $this->pos;
  546. $this->char = ( $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
  547. // 종료 태그
  548. if ($this->char==='/') {
  549. $this->char = ( $this->pos<$this- >사이즈) ? $this->doc[$this->pos] : null; // next
  550. $this->skip($this->token_blank_t);
  551. $tag = $this->copy_until_char('>');
  552. // 끝 태그의 속성을 건너뜁니다.
  553. if (($pos = strpos($tag, ' '))!==false)
  554. $tag = substr($tag, 0, $pos);
  555. $parent_lower = strtolower($this ->parent->tag);
  556. $tag_lower = strtolower($tag);
  557. if ($parent_lower!==$tag_lower) {
  558. if (isset($this->선택적_closing_tags[ $parent_lower]) && isset($this->block_tags[$tag_lower])) {
  559. $this->parent->_[HDOM_INFO_END] = 0;
  560. $org_parent = $this-> parent;
  561. while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)
  562. $this->parent = $ this->parent->parent;
  563. if (strtolower($this->parent->tag)!==$tag_lower) {
  564. $this->parent = $org_parent; // 원래 부모 복원
  565. if ($this->parent->parent) $this->parent = $this->parent->parent;
  566. $this->parent-> ;_[HDOM_INFO_END] = $this->cursor;
  567. return $this->as_text_node($tag);
  568. }
  569. }
  570. else if (($this->parent- >parent) && isset($this->block_tags[$tag_lower])) {
  571. $this->parent->_[HDOM_INFO_END] = 0;
  572. $org_parent = $this-> parent;
  573. while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)
  574. $this->parent = $ this->parent->parent;
  575. if (strtolower($this->parent->tag)!==$tag_lower) {
  576. $this->parent = $org_parent; // 원래 부모 복원
  577. $this->parent->_[HDOM_INFO_END] = $this->cursor;
  578. return $this->as_text_node($tag);
  579. }
  580. }
  581. else if (($this->parent->parent) && strtolower($this->parent->parent->tag)===$tag_lower) {
  582. $this ->parent->_[HDOM_INFO_END] = 0;
  583. $this->parent = $this->parent->parent;
  584. }
  585. else
  586. return $this- >as_text_node($tag);
  587. }
  588. $this->parent->_[HDOM_INFO_END] = $this->cursor;
  589. if ($this->parent->parent) $this->parent = $this- >parent->parent;
  590. $this->char = ( $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
  591. return true;
  592. }
  593. $node = new simple_html_dom_node($this);
  594. $node->_[HDOM_INFO_BEGIN] = $this->cursor;
  595. $ this->cursor;
  596. $tag = $this->copy_until($this->token_slash);
  597. // doctype, cdata 및 주석...
  598. if (isset($tag[ 0]) && $tag[0]==='!') {
  599. $node->_[HDOM_INFO_TEXT] = '<' . $ 태그 . $this->copy_until_char('>');
  600. if (isset($tag[2]) && $tag[1]==='-' && $tag[2]==='-' ) {
  601. $node->nodetype = HDOM_TYPE_COMMENT;
  602. $node->tag = 'comment';
  603. } else {
  604. $node->nodetype = HDOM_TYPE_UNKNOWN;
  605. $ node->tag = '알 수 없음';
  606. }
  607. if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';
  608. $this->link_nodes($node, true);
  609. $this->char = ( $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
  610. return true;
  611. }
  612. // text
  613. if ($pos=strpos($tag, '<')!==false) {
  614. $tag = ' <' . substr($tag, 0, -1);
  615. $node->_[HDOM_INFO_TEXT] = $tag;
  616. $this->link_nodes($node, false);
  617. $this-> ;char = $this->doc[--$this->pos]; // prev
  618. return true;
  619. }
  620. if (!preg_match("/^[w-:] $/", $tag)) {
  621. $node->_[HDOM_INFO_TEXT] = '<' . $ 태그 . $this->copy_until('<>');
  622. if ($this->char==='<') {
  623. $this->link_nodes($node, false) ;
  624. true를 반환합니다.
  625. }
  626. if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';
  627. $ this->link_nodes($node, false);
  628. $this->char = ( $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
  629. return true;
  630. }
  631. // 태그 시작
  632. $node->nodetype = HDOM_TYPE_ELEMENT;
  633. $tag_lower = strtolower($tag);
  634. $node- >태그 = ($this->소문자) ? $tag_lower : $tag;
  635. // 선택적 닫는 태그 처리
  636. if (isset($this->ional_closing_tags[$tag_lower]) ) {
  637. while (isset($this->ional_closing_tags[$ tag_lower][strtolower($this->parent->tag)])) {
  638. $this->parent->_[HDOM_INFO_END] = 0;
  639. $this->parent = $ this->parent->parent;
  640. }
  641. $node->parent = $this->parent;
  642. }
  643. $guard = 0; // 무한 루프 방지
  644. $space = array($this->copy_skip($this->token_blank), '', '');
  645. // 속성
  646. do {
  647. if ($this->char!==null && $space[0]==='') break;
  648. $name = $this->copy_until($this->token_equal);
  649. if ($guard===$this->pos) {
  650. $this->char = ( $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
  651. continue;
  652. }
  653. $guard = $this->pos;
  654. // 끝없는 '<'
  655. 처리 if($this->pos>=$ this->size-1 && $this->char!=='>') {
  656. $node->nodetype = HDOM_TYPE_TEXT;
  657. $node->_[HDOM_INFO_END] = 0;
  658. $node->_[HDOM_INFO_TEXT] = '<'.$tag . $space[0] . $name;
  659. $node->tag = 'text';
  660. $this->link_nodes($node, false);
  661. return true;
  662. }
  663. // 불일치 처리 '<'
  664. if($this->doc[$this->pos-1]=='<') {
  665. $node->nodetype = HDOM_TYPE_TEXT;
  666. $node->tag = 'text';
  667. $node->attr = array();
  668. $node->_[HDOM_INFO_END] = 0;
  669. $node ->_[HDOM_INFO_TEXT] = substr($this->doc, $begin_tag_pos, $this->pos-$begin_tag_pos-1);
  670. $this->pos -= 2;
  671. $ this->char = ( $this->pos<$this->size) ? $this->doc[$this->pos] : null; // 다음
  672. $this->link_nodes($node, false);
  673. return true;
  674. }
  675. if ($name!=='/' && $name!=='' ) {
  676. $space[1] = $this->copy_skip($this->token_blank);
  677. $name = $this->restore_noise($name);
  678. if ($this ->소문자) $name = strtolower($name);
  679. if ($this->char==='=') {
  680. $this->char = ( $this->pos< ;$this->크기) ? $this->doc[$this->pos] : null; // next
  681. $this->parse_attr($node, $name, $space);
  682. }
  683. else {
  684. //값 없음 속성: nowrap, 선택됨...
  685. $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;
  686. $node->attr[$name] = true;
  687. if ($this->char!='>') $ this->char = $this->doc[--$this->pos]; // 이전
  688. }
  689. $node->_[HDOM_INFO_SPACE][] = $space;
  690. $space = array($this->copy_skip($this->token_blank), '' , '');
  691. }
  692. else
  693. break;
  694. } while($this->char!=='>' && $this->char!=='/' );
  695. $this->link_nodes($node, true);
  696. $node->_[HDOM_INFO_ENDSPACE] = $space[0];
  697. // 자동 종료 확인
  698. if ( $this->copy_until_char_escape('>')==='/') {
  699. $node->_[HDOM_INFO_ENDSPACE] .= '/';
  700. $node->_[HDOM_INFO_END] = 0;
  701. }
  702. else {
  703. // 부모 재설정
  704. if (!isset($this->self_closing_tags[strtolower($node->tag)])) $this-> ;parent = $node;
  705. }
  706. $this->char = ( $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
  707. return true;
  708. }
  709. // 속성 구문 분석
  710. protected function parse_attr($node, $name, &$space) {
  711. $space[2] = $this- >copy_skip($this->token_blank);
  712. switch($this->char) {
  713. case '"':
  714. $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;
  715. $this->char = ( $this->pos<$this->size) ? $this->doc[$this->pos] : // 다음
  716. $ node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('"'));
  717. $this->char = ( $this->pos<$this -> 사이즈) ? $this->doc[$this->pos] : null; // 다음
  718. break;
  719. 케이스 ''':
  720. $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_SINGLE;
  721. $this->char = ( $this->pos< ;$this->크기) ? $this->doc[$this->pos] : null; // 다음
  722. $node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('''));
  723. $this->char = ( $this ->위치크기) ? $this->doc[$this->pos] : null; // 다음
  724. break;
  725. 기본값:
  726. $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;
  727. $node->attr[$name] = $this->restore_noise ($this->copy_until($this->token_attr));
  728. }
  729. }
  730. // 링크 노드의 상위
  731. 보호 함수 link_nodes(&$node, $is_child) {
  732. $node->parent = $this->parent;
  733. $this->parent->nodes[] = $node;
  734. if ($is_child)
  735. $this-> parent->children[] = $node;
  736. }
  737. // 텍스트 노드로
  738. 보호 함수 as_text_node($tag) {
  739. $node = new simple_html_dom_node($this);
  740. $this->cursor;
  741. $node->_[HDOM_INFO_TEXT] = '';
  742. $this->link_nodes($node, false);
  743. $this->char = ( $this->pos<$this->size) ? $this->doc[$this->pos] : null; // 다음
  744. true를 반환합니다.
  745. }
  746. 보호된 함수 건너뛰기($chars) {
  747. $this->pos = strspn($this->doc, $chars, $this->pos);
  748. $this->char = ($this->pos<$this->크기) ? $this->doc[$this->pos] : null; // next
  749. }
  750. 보호 함수 copy_skip($chars) {
  751. $pos = $this->pos;
  752. $len = strspn($this->doc, $chars, $ pos);
  753. $this->pos = $len;
  754. $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
  755. if ($len===0) return '';
  756. return substr($this->doc, $pos, $len);
  757. }
  758. 보호 함수 copy_until( $chars) {
  759. $pos = $this->pos;
  760. $len = strcspn($this->doc, $chars, $pos);
  761. $this->pos = $ len;
  762. $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
  763. return substr($this->doc, $pos, $len);
  764. }
  765. 보호 함수 copy_until_char($char) {
  766. if ($this->char= ==null) return '';
  767. if (($pos = strpos($this->doc, $char, $this->pos))===false) {
  768. $ret = substr ($this->doc, $this->pos, $this->size-$this->pos);
  769. $this->char = null;
  770. $this-> pos = $this->size;
  771. return $ret;
  772. }
  773. if ($pos===$this->pos) return '';
  774. $pos_old = $this- >pos;
  775. $this->char = $this->doc[$pos];
  776. $this->pos = $pos;
  777. return substr($this->doc , $pos_old, $pos-$pos_old);
  778. }
  779. 보호 함수 copy_until_char_escape($char) {
  780. if ($this->char===null) return '';
  781. $ start = $this->pos;
  782. while(1) {
  783. if (($pos = strpos($this->doc, $char, $start))===false) {
  784. $ret = substr($this->doc, $this->pos, $this->size-$this->pos);
  785. $this->char = null;
  786. $this->pos = $this->size;
  787. return $ret;
  788. }
  789. if ($pos===$this->pos) return '';
  790. if ($this->doc[$pos-1]==='\') {
  791. $start = $pos 1;
  792. 계속;
  793. }
  794. $pos_old = $this-> ;pos;
  795. $this->char = $this->doc[$pos];
  796. $this->pos = $pos;
  797. return substr($this->doc, $pos_old, $pos-$pos_old);
  798. }
  799. }
  800. // HTML 콘텐츠에서 노이즈 제거
  801. protected function Remove_noise($pattern, $remove_tag=false) {
  802. $count = preg_match_all($pattern, $this->doc, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE);
  803. for ($i=$count-1; $i>-1; --$i) {
  804. $key = '___noise___'.sprintf('% 3d', count($this->noise) 100);
  805. $idx = ($remove_tag) ? 0 : 1;
  806. $this->noise[$key] = $matches[$i][$idx][0];
  807. $this->doc = substr_replace($this->doc , $key, $matches[$i][$idx][1], strlen($matches[$i][$idx][0]));
  808. }
  809. // 콘텐츠 길이 재설정
  810. $this->size = strlen($this->doc);
  811. if ($this->size>0) $this->char = $this->doc[0] ;
  812. }
  813. // HTML 콘텐츠에 노이즈 복원
  814. function Restore_noise($text) {
  815. while(($pos=strpos($text, '__noise___'))!==false) {
  816. $key = '___noise___'.$text[$pos 11].$text[$pos 12].$text[$pos 13];
  817. if (isset($this->noise[$key ]))
  818. $text = substr($text, 0, $pos).$this->noise[$key].substr($text, $pos 14);
  819. }
  820. $ 반환 text;
  821. }
  822. function __toString() {
  823. return $this->root->innertext();
  824. }
  825. function __get($name) {
  826. switch( $name) {
  827. 케이스 '외부 텍스트': return $this->root->innertext();
  828. 케이스 'innertext': return $this->root->innertext();
  829. case 'plaintext': return $this->root->text();
  830. }
  831. }
  832. // 낙타 명명 규칙
  833. function childNodes($idx=-1) {return $this->root->childNodes($idx);}
  834. function firstChild() {return $this->root->first_child();}
  835. function lastChild() {return $this ->root->last_child();}
  836. function getElementById($id) {return $this->find("#$id", 0);}
  837. function getElementsById($id, $ idx=null) {return $this->find("#$id", $idx);}
  838. function getElementByTagName($name) {return $this->find($name, 0);}
  839. 함수 getElementsByTagName($name, $idx=-1) {return $this->find($name, $idx);}
  840. 함수 loadFile() {$args = func_get_args();$this- >load(call_user_func_array('file_get_contents', $args), true);}
  841. }
  842. ?>

코드 복사

tqq.php

  1. /**

  2. 버전: 1.11 ($Rev: 175 $)
  3. */
  4. //캐시 시간, 단위: 초
  5. $t = 360;
  6. if(!is_file('index.html')||(time()-filemtime('index.html'))>$t){
  7. // 웨이보 계정
  8. $qq = 'kuaisubeian';
  9. //Tencent의 md5_3()으로 암호화된 비밀번호
  10. $pwd = '624D3274815F2237817A7C62F42DD26A';
  11. $verifyURL = 'http://ptlogin2 .qq.com /check?uin=@'.$qq.'&appid=46000101';
  12. $loginURL = 'http://ptlogin2.qq.com/login?';

  13. //인증 코드 및 첫 번째 쿠키 받기

  14. $curl =curl_init($verifyURL);
  15. $cookie_jar = tempnam('.', 'cookie');
  16. curl_setopt($curl , CURLOPT_RETURNTRANSFER, 1);
  17. 컬_setopt($curl, CURLOPT_COOKIEJAR, $cookie_jar);
  18. $verifyCode = 컬_exec($curl);
  19. 컬_close($curl);
  20. $verifyCode = strtoupper(substr ($verifyCode, 18, 4));
  21. //echo '인증 코드:'.$verifyCode;
  22. //echo '
    ';
  23. // echo 'Cookies:' .$cookie_jar;
  24. // echo '
    ';

  25. //로그인 요청을 보내고 두 번째 쿠키를 가져옵니다

  26. $loginURL .= ' u=@'.$qq .'&p='.md5($pwd.$verifyCode).'&verifycode='.$verifyCode.'&aid=46000101&u1=http://t.qq.com&h=1&from_ui=1&fp=loginerroralert ';
  27. // echo '로그인 주소:'.$loginURL;
  28. //echo '
    ';
  29. $curl = 컬_init($loginURL);
  30. 컬_setopt($ 컬, CURLOPT_RETURNTRANSFER, 1); curl_close($curl);
  31. //echo '로그인 확인 결과:'.$loginResult;
  32. //echo '
    ' http:/ /bbs.it-home.org
  33. //세 번째 쿠키 가져오기
  34. $curl =curl_init('http://t.qq.com');
  35. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1) ;
  36. 컬_setopt($curl, CURLOPT_COOKIEJAR, $cookie_jar);
  37. 컬_setopt($curl, CURLOPT_COOKIEFILE, $cookie_jar);
  38. 컬_setopt($curl, CURLOPT_COOKIEJAR, $cookie_jar) ;
  39. $loginResult = 컬_exec ($curl);
  40. curl_close($curl);

  41. //네번째

  42. $curl =curl_init('http: //t.qq.com/ '.$qq.'/mine');
  43. 컬_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  44. 컬_setopt($curl, CURLOPT_COOKIEJAR, $cookie_jar);
  45. 컬_setopt($curl, CURLOPT_COOKIEFILE, $cookie_jar );
  46. 컬_setopt($curl, CURLOPT_COOKIEJAR, $cookie_jar);
  47. $loginResult = 컬_exec($curl);
  48. 컬_close($curl);

    ($cookie_jar);
  49. file_put_contents('index.html',$loginResult);
  50. }
  51. include('cnz.php');
  52. $html = file_get_html('index.html') ;
  53. $talkList = $html->find('#talkList');
  54. $lastTalk = $talkList[0];

  55. $userName = $lastTalk- >children(0)->children(1)->find('.userName');

  56. $msgCnt = $lastTalk->children(0)->children(1)->find ('.msgCnt');
  57. $pubInfo = $lastTalk->children(0)->children(1)->find('.pubInfo');< /p>
  58. < p>$userName = $userName[0]->plaintext;

  59. $result = '';

  60. < ;p>//인 경우 2보다 크면 브로드캐스팅됩니다
  61. if(count($msgCnt) < 10){
  62. $pi = $pubInfo[0]->find('.left');
  63. $result = $userName.$msgCnt[0]->plaintext.'

    < ;/p> ;

  64. QQweiboQQ|www.beiantuan.com style="font-style: italic; color: rgb(238, 29, 36);">'.$pi[0]->children(0)->plaintext.' ->children(1)->plaintext.'';
  65. }else{
  66. $pi = $pubInfo[1]->find('.left') ;
  67. $result = $userName.$msgCnt[0]->plaintext.'['.$msgCnt[1]->plaintext.'] '.$pi[0]->plaintext.'';
  68. }
  69. echo $result;
  70. ?>< ;/p> ;
  71. 코드 복사
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.