Пример #1
0
 /**
  * Grabs Twitter and Facebook entries
  *
  * @param $bootstrap Bootstrap
  */
 public function run($bootstrap)
 {
     $active_queries = array();
     $campaign = new Default_Model_DbTable_Campaigns();
     $keyword = new Default_Model_DbTable_Keyword();
     $search = new Default_Model_DbTable_Search();
     $influencer = new Default_Model_DbTable_Influencers();
     $settings = $bootstrap->getOption('settings');
     foreach ($campaign->getCronData() as $obj) {
         $active_queries[] = $obj['query_id'];
         /**
          *  Twitter
          */
         $last_tweet_id = 0;
         $base_url = 'http://search.twitter.com/search.json';
         $parameters = array('q' => $obj['query_q'], 'geocode' => $obj['query_geocode'], 'rpp' => 100, 'result_type' => 'recent', 'since_id' => $obj['query_last_twitter'], 'lang' => $obj['query_lang']);
         $response = $this->_get_file_contents($base_url, $parameters, true);
         while (is_object($response) && isset($response->results) && is_array($response->results) && (list(, $entry) = each($response->results))) {
             if (!$last_tweet_id) {
                 $last_tweet_id = $entry->id_str;
                 $data = array('query_last_twitter' => $last_tweet_id);
                 $keyword->update($data, array('query_id = ?' => $obj['query_id']));
             }
             $data = array('query_id' => $obj['query_id'], 'search_outer_id' => $entry->id_str, 'search_source' => 'twitter', 'search_published' => strtotime($entry->created_at), 'search_content' => addslashes($entry->text), 'search_author_name' => addslashes($entry->from_user), 'search_author_image' => $entry->profile_image_url);
             $search->insert($data);
             $data = array('query_id' => $obj['query_id'], 'search_author_name' => addslashes($entry->from_user), 'search_source' => 'twitter', 'cnt' => 1);
             $influencer->insertOnDuplicate($data, 'UPDATE cnt = cnt + 1');
         }
         /**
          *  Facebook
          */
         $last_facebook_post_time = 0;
         $base_url = 'https://graph.facebook.com/search';
         $parameters = array('q' => $obj['query_q'], 'type' => 'post', 'limit' => 100, 'since' => $obj['query_last_facebook']);
         $response = $this->_get_file_contents($base_url, $parameters, true);
         $alchemy_base_url = 'http://access.alchemyapi.com/calls/text/TextGetLanguage';
         $lang = array();
         while (is_object($response) && isset($response->data) && is_array($response->data) && (list(, $entry) = each($response->data))) {
             $entry->name = isset($entry->name) ? $entry->name : '';
             if (isset($entry->message) && $entry->message) {
                 $text = $entry->message;
             } elseif (isset($entry->story) && $entry->story) {
                 $text = $entry->story;
             } else {
                 $text = '';
             }
             if ($obj['query_lang'] && $settings['alchemy_api_key']) {
                 $parameters = array('apikey' => $settings['alchemy_api_key'], 'outputMode' => 'json', 'text' => $text);
                 $lang = $this->_get_file_contents($alchemy_base_url, $parameters, true, true);
             }
             if (!$obj['query_lang'] || !$settings['alchemy_api_key'] || $obj['query_lang'] && $obj['query_lang'] == $lang['iso-639-1']) {
                 $created_time = strtotime($entry->created_time);
                 if (!$last_facebook_post_time) {
                     $last_facebook_post_time = date('n/j/Y H:i:s', $created_time);
                     $data = array('query_last_facebook' => $last_facebook_post_time);
                     $keyword->update($data, array('query_id = ?' => $obj['query_id']));
                 }
                 $data = array('query_id' => $obj['query_id'], 'search_outer_id' => $entry->id, 'search_source' => 'facebook', 'search_published' => $created_time, 'search_content' => addslashes($text), 'search_author_name' => addslashes($entry->from->name), 'search_title' => addslashes($entry->name));
                 $search->insert($data);
                 $data = array('query_id' => $obj['query_id'], 'search_author_name' => addslashes($entry->from->name), 'search_source' => 'facebook', 'cnt' => 1);
                 $influencer->insertOnDuplicate($data, 'UPDATE cnt = cnt + 1');
             }
         }
     }
     // Archiving expired entries.
     $expired_entries = $search->fetchAll(array('query_id IN (?)' => implode(', ', $active_queries), 'search_published < ?' => time() - $settings['keep_history'] * 24 * 3600));
     if (count($expired_entries)) {
         $search_index = new Default_Model_DbTable_SearchIndex();
         echo 'Archiving ' . count($expired_entries) . ' entries.' . "\n";
         foreach ($expired_entries as $a_obj) {
             echo '.';
             $date = mktime(0, 0, 0, date('n', $a_obj['search_published']), date('j', $a_obj['search_published']), date('Y', $a_obj['search_published']));
             $data = array('query_id' => $a_obj['query_id'], 'index_date' => $date, 'index_source' => $a_obj['search_source'], 'index_count' => 1);
             $search_index->insertOnDuplicate($data, 'UPDATE index_count = index_count+1');
             $search->delete(array('search_id' => $a_obj['search_id']));
         }
     }
     $search->optimize();
     echo "\n";
     if (!(int) date('G')) {
         // If hour == 0, sending email digest
         $mail = new Zend_Mail();
         $mail->addTo($bootstrap->getOption('authentication.email'))->setFrom($settings['default_from'])->setSubject('Daily overview of your projects');
         $email_html = '<html><body>logo here<hr/><br/>Project(s) in this email:<br/><ul>';
         foreach ($campaign->getCampaigns() as $cmpgn) {
             $email_html .= '<li><a href="#' . $cmpgn['project_id'] . '">' . $cmpgn['project_name'] . '</a></li>';
         }
         $email_html .= '</ul><br/><br/>';
         foreach ($campaign->getCampaigns() as $cmpgn) {
             $email_html .= '<a name="' . $cmpgn['project_id'] . '"></a>
                 Project: ' . $cmpgn['project_name'] . '<hr/>' . $this->breakdown_block($cmpgn['project_id'], 'twitter') . $this->breakdown_block($cmpgn['project_id'], 'facebook') . '<br/>';
         }
         $email_html .= '</body></html>';
         $mail->setBodyHtml($email_html)->setBodyText(strip_tags(preg_replace('#<br\\s*/?>|<hr\\s*/?>|</ul>|</li>|</h\\d>#i', "\n", $email_html)))->send();
     }
 }
 private function getGraphData($type, $query_ids)
 {
     $results = array('cnt' => $type == 'keyword' ? array('facebook' => array(), 'twitter' => array()) : array(), 'min' => 0, 'max' => 0);
     $search = new Default_Model_DbTable_Search();
     foreach ($search->getGraphInfo($query_ids) as $obj) {
         $darr = getdate($obj['search_published']);
         $date = mktime(0, 0, 0, $darr['mon'], $darr['mday'], $darr['year']);
         $campaign = $type == 'keyword' ? $obj['search_source'] : $obj['query_id'];
         if (isset($results['cnt'][$campaign][$date])) {
             $results['cnt'][$campaign][$date]++;
         } else {
             $results['cnt'][$campaign][$date] = 1;
         }
         $results['min'] = $results['min'] && $results['min'] < $date ? $results['min'] : $date;
         $results['max'] = $results['max'] && $results['max'] > $date ? $results['max'] : $date;
     }
     $search_index = new Default_Model_DbTable_SearchIndex();
     foreach ($search_index->getGraphInfo($query_ids) as $obj) {
         $campaign = $type == 'keyword' ? $obj['index_source'] : $obj['query_id'];
         if (isset($results['cnt'][$campaign][$obj['index_date']])) {
             $results['cnt'][$campaign][$obj['index_date']] += $obj['index_count'];
         } else {
             $results['cnt'][$campaign][$obj['index_date']] = $obj['index_count'];
         }
         $results['min'] = $results['min'] && $results['min'] < $obj['index_date'] ? $results['min'] : $obj['index_date'];
         $results['max'] = $results['max'] && $results['max'] > $obj['index_date'] ? $results['max'] : $obj['index_date'];
     }
     return $results;
 }