OSDN Git Service

git-svn-id: https://svn.sourceforge.jp/svnroot/nucleus-jp/plugin@882 1ca29b6e-896d...
[nucleus-jp/nucleus-plugins.git] / NP_UpdatePingServer / trunk / updatepingserver / modules / UpdatePingServerModule_getFeed.php
1 <?php
2 class UpdatePingServerModule_getFeed// extends NP_UpdatePingServer
3 {
4
5 var $myPlugin;
6
7         function initModule($plugin)
8         {
9                 $this->myPlugin = $plugin;
10 //              print_r($this->myPlugin->getShortName());
11         }
12
13         function _getModuleTablePrefix()
14         {
15                 return 'plug_' . strtolower($this->myPlugin->getShortName()) . '_';
16         }
17
18         function _getModuleTableName($name)
19         {
20                 return sql_table($this->_getModuleTablePrefix() . $name);
21         }
22
23         function getModuleTableList()
24         {
25                 $tables = array (
26                                                  'feeddata',
27                                                 );
28
29                 $moduleTables = array();
30                 foreach ($tables as $table) {
31                         $moduleTables[] = $this->_getModuleTableName($table);
32                 }
33                 return $moduleTables;
34         }
35
36         function installModule()
37         {
38                 $table_q = 'CREATE TABLE IF NOT EXISTS ' . $this->_getModuleTableName('feeddata') . ' ('
39                                  . '    pingid     INT(11)       NOT NULL AUTO_INCREMENT, '
40                                  . '    pingtime   TIMESTAMP     NOT NULL, '
41                                  . '    updatetime INT(12)       NOT NULL, '
42                                  . '    btitle     VARCHAR(255)  NOT NULL, '
43                                  . '    burl       VARCHAR(255)  NOT NULL, '
44                                  . '    feedurl    VARCHAR(255)  NOT NULL, '
45                                  . '    etitle     VARCHAR(255)  NOT NULL, '
46                                  . '    eurl       VARCHAR(255)  NOT NULL, '
47                                  . '    edesc      TEXT          NOT NULL, '
48                                  . ' UNIQUE  KEY   eurl (eurl), '
49                                  . ' PRIMARY KEY        (pingid) '
50                                  . ' )';
51                 sql_query($table_q);
52         }
53
54         function getModuleName()
55         {
56                 return 'Get Site data';
57         }
58
59         function getModuleDescription()
60         {
61                 return 'Get Site data via Atom or RSS feeds.';
62         }
63
64         function np_updatePingServerEvent_changesOutput(&$data)
65         {
66                 $query = 'SELECT '
67                            . '               updatetime, '
68                            . '               btitle, '
69                            . '               burl, '
70                            . '               feedurl '
71                            . ' FROM '
72                            .      $this->_getModuleTableName('feeddata');
73                 if ($last > 0) {
74                         $query .= ' WHERE '
75                                         . '          updatetime > ' . (strtotime($data['nowTime']) - $data['last']);
76                 }
77                 $query .= ' ORDER BY updatetime DESC';
78
79                 $data['query'] = $query;
80         }
81
82         function np_updatePingServerEvent_receivePing(&$data)
83         {
84                 global $manager;
85
86                 extract($data);
87                 extract($siteData);
88                 if (!$response) {
89                         return;
90                 }
91                 $plugName =  str_replace('NP_', '', (get_class($this->myPlugin)));
92                 if ($feedURL) {
93                         ini_set('user_agent', 'NP_' . $plugName());
94                         $fp  = @fopen($feedURL, 'r');
95                         if ($fp) {
96                                 $feedURL = $this->getAbsoluteFeedURL($feedURL, $siteURL);
97                         }
98                 } else {
99                         $feedURL = '';
100                 }
101                 if (!$feedURL) {
102                         $feedURL = $this->getFeedURL($siteURL, $plugName);
103                 }
104                 if ($feedURL) {
105                         $feedData = $this->getFeedData($feedURL, $siteTitle);
106                 } else {
107                         $feedData = FALSE;
108                 }
109                 if ($feedData) {
110                         $this->updateTable($feedData);
111                         $data['siteTitle'] = $feedData['siteTitle'];
112                         $data['siteData']  = $feedData;
113                         $data['message']   = 'Thanks for your update ping.';
114                         $data['response']  = TRUE;
115                 } else {
116                         $data['message']   = 'Can not read your XML feed. Please prepare RSS1.0, RSS2.0, or ATOM feeds.';
117                         $data['response']  = FALSE;
118                 }
119         }
120
121         function updateTable($data)
122         {
123                 $sharedFunctions = new sharedFunctions();
124
125                 $query = 'SELECT '
126                            . '      updatetime as result'
127                            . ' FROM '
128                            .        $this->_getModuleTableName('feeddata')
129                            . ' WHERE '
130                            . '      eurl = ' . $sharedFunctions->quoteSmart($data['entryURL']);
131                 $olden = quickQuery($query);
132                 if (!$olden || $olden < intval($data['entryDate'])) {
133                         $query = 'REPLACE '
134                                    .        $this->_getModuleTableName('feeddata')
135                                    . ' ('
136                                    . '      updatetime, '
137                                    . '      btitle, '
138                                    . '      burl, '
139                                    . '      feedurl, '
140                                    . '      etitle, '
141                                    . '      eurl, '
142                                    . '      edesc '
143                                    . ' ) '
144                                    . 'VALUES '
145                                    . ' ('
146                                    .        $sharedFunctions->quoteSmart($data['entryDate'])  . ', '
147                                    .        $sharedFunctions->quoteSmart($data['siteTitle'])  . ', '
148                                    .        $sharedFunctions->quoteSmart($data['siteURL'])    . ', '
149                                    .        $sharedFunctions->quoteSmart($data['feedURL'])    . ', '
150                                    .        $sharedFunctions->quoteSmart($data['entryTitle']) . ', '
151                                    .        $sharedFunctions->quoteSmart($data['entryURL'])   . ', '
152                                    .        $sharedFunctions->quoteSmart($data['entryDesc'])
153                                    . ' )';
154                         sql_query($query);
155                         $query = 'SELECT '
156                                    . '      COUNT(pingid) as result '
157                                    . 'FROM '
158                                    .        $this->_getModuleTableName('feeddata');
159                         if (quickQuery($query) > $this->myPlugin->getOption('dataMaxHold')) {
160                                 $query = 'DELETE FROM '
161                                            .        $this->_getModuleTableName('feeddata')
162                                            . ' ORDER BY '
163                                            . '      pingid ASC '
164                                            . ' LIMIT 1'; 
165                                 sql_query($query);
166                         }
167                 }
168         }
169
170         function getFeedURL($url, $plugName)
171         {
172                 $url = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $url);
173                 ini_set('user_agent', $plugName);
174                 $fp  = @fopen($url, 'r');
175                 if ($fp) {
176                         $sources = fread($fp, 4096);
177                         if (strpos(substr($sources, 0, 250), '<rdf:RDF') !== FALSE) {
178                                 $rssLink = $url;
179                         } elseif (strpos(substr($sources, 0, 250), '<rss version="') !== FALSE) {
180                                 $rssLink = $url;
181                         } elseif (strpos(substr($sources, 0, 250), '<feed ') !== FALSE) {
182                                 $atomLink = $url;
183                         } else {
184                                 preg_match_all('/<link\s+(.*?)\s*\/?>/si', $sources, $match);
185                                 for ($i = 0; count($match[1]) > $i; $i++) {
186                                         if (strpos($match[1][$i], 'alternate')) {
187                                                 if (strpos($match[1][$i], 'application/atom+xml')) {
188                                                         $temp = explode('href=', $match[1][$i], 2);
189                                                         $herf = explode(' ', $temp[1], 2);
190                                                         $atomLink = trim($herf[0], '\'"');
191                                                 } elseif (strpos($match[1][$i], 'application/rss+xml')) {
192                                                         $temp = explode('href=', $match[1][$i], 2);
193                                                         $herf = explode(' ', $temp[1], 2);
194                                                         $rssLink  = trim($herf[0], '\'"');
195                                                 }
196                                         }
197                                 }
198                         }
199                 }
200                 if ($atomLink) {
201                         $atomLink = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $atomLink);
202                         return $this->getAbsoluteFeedURL($atomLink, $url);
203                 } elseif ($rssLink) {
204                         $rssLink = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $rssLink);
205                         return $this->getAbsoluteFeedURL($rssLink, $url);
206                 } else {
207                         return FALSE;
208                 }
209         }
210
211         function getAbsoluteFeedURL($feedURL, $url)
212         {
213                 $feedURL = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $feedURL);
214                 if (strpos($feedURL, 'http://') !== false) {
215                         $AbsoluteFeedURL = $feedURL;
216                 } else {
217                         $parts = parse_url($url);
218                         $AbsoluteFeedURL = 'http://' . $parts['host'];
219                         if (isset($parts['port'])) {
220                                 $AbsoluteFeedURL .= ':' . $parts['port'];
221                         }
222                         if ($feedURL{0} != '/') {
223                                 if (isset($parts['path'])) {
224                                         $patharr = explode('/', trim($parts['path'], '/'));
225                                         foreach ($patharr as $val) {
226                                                 if (!strpos(strtolower($val), '.htm') 
227                                                         && !strpos(strtolower($val), '.xml')
228                                                         && !strpos(strtolower($val), '.aspx')) {
229                                                                 $AbsoluteFeedURL .= '/' . $val;
230                                                 }
231                                         }
232                                 }
233                                 $AbsoluteFeedURL .= '/';
234                         }
235                         $AbsoluteFeedURL .= $feedURL;
236                 }
237                 $AbsoluteFeedURL = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $AbsoluteFeedURL);
238 //              $AbsoluteFeedURL = preg_replace("|([^:])//|", "$1", $AbsoluteFeedURL);
239                 return $AbsoluteFeedURL;
240         }
241
242         function getFeedData($url, $title)
243         {
244                 $url = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $url);
245                 require_once('sharedlibs/simplepie.inc');
246                 $feed = new SimplePie();
247                 $feed->feed_url($url);
248                 $feed->enable_caching(false);
249                 $feed->output_encoding(_CHARSET);
250                 $feed->init();
251                 $feed->handle_content_type();
252                 if ($feed->data) {
253                         $item = $feed->get_item(0);
254                         $data = array(
255                                                   'siteTitle'  => stringStripTags($feed->get_feed_title()),
256                                                   'siteURL'    => preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $feed->get_feed_link()),
257                                                   'siteURL'    => preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $feed->get_feed_link()),
258                                                   'entryTitle' => stringStripTags($item->get_title()),
259                                                   'entryDesc'  => stringStripTags($item->get_description()),
260                                                   'entryDate'  => $item->get_date('U'),
261                                                   'entryURL'   => preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $item->get_permalink()),
262                                                   'feedURL'    => preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $feed->subscribe_url()),
263                                                  );
264                 }
265                 return $data;
266         }
267 }