/** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $url = $request->url_string; re_scrape($url); $CrawlerDetect = new CrawlerDetect(); if ($CrawlerDetect->isCrawler()) { return; } else { return $next($request); } }
public function track_download($file = '', $episode = 0, $referrer = '') { global $wpdb; session_start(); if (!$file || !$episode || !isset($episode->ID)) { return; } // Make sure that the referrer is always a string (even if empty) $referrer = (string) $referrer; // Get request user agent $user_agent = (string) $_SERVER['HTTP_USER_AGENT']; // Include Crawler Detect library require_once 'lib/CrawlerDetect/CrawlerDetect.php'; // Check if this user agent is a crawler/bot to prevent false stats $CrawlerDetect = new CrawlerDetect(); if ($CrawlerDetect->isCrawler($user_agent)) { return; } // Check for specific podcasting services in user agent // The iOS Podcasts app makes a HEAD request with user agent Podcasts/2.4 and then a GET request with user agent AppleCoreMedia // This conditional will prevent double tracking from that app if (stripos($user_agent, 'podcasts/') !== false) { return; } if (stripos($user_agent, 'itunes') !== false || stripos($user_agent, 'AppleCoreMedia') !== false) { $referrer = 'itunes'; } elseif (stripos($user_agent, 'stitcher') !== false) { $referrer = 'stitcher'; } elseif (stripos($user_agent, 'overcast') !== false) { $referrer = 'overcast'; } elseif (stripos($user_agent, 'Pocket Casts') !== false) { $referrer = 'pocketcasts'; } // Get episode ID for database insert $episode_id = $episode->ID; // Get remote client IP address // If server is behind a reverse proxy (e.g. Cloudflare or Nginx), we need to get the client's IP address from HTTP headers // Cloudflare headers reference: https://support.cloudflare.com/hc/en-us/articles/200170986 // The order of precedence here being Cloudflare, then other reverse proxies such as Nginx, then remote_addr $ip_address = ''; if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { $ip_address = $_SERVER['HTTP_CF_CONNECTING_IP']; } elseif (isset($_SERVER['CF-Connecting-IP'])) { $ip_address = $_SERVER['CF-Connecting-IP']; } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif (isset($_SERVER['X-Forwarded-For'])) { $ip_address = $_SERVER['X-Forwarded-For']; } else { // None of the above headers are present (meaning we're not behind a reverse proxy) so fallback to using REMOTE_ADDR $ip_address = $_SERVER['REMOTE_ADDR']; } // Exit if there is no detectable IP address if (!$ip_address) { return; } // Create transient name from episode ID, IP address and referrer $transient = 'sspdl_' . $episode_id . '_' . str_replace('.', '', $ip_address) . '_' . $referrer; // Allow forced transient refresh if (isset($_GET['force'])) { delete_transient($transient); } // Check transient to prevent excessive tracking if (get_transient($transient)) { return; } // Insert data into database $insert_row = $wpdb->insert($this->_table, array('post_id' => $episode_id, 'ip_address' => $ip_address, 'referrer' => $referrer, 'date' => $this->current_time), array('%d', '%s', '%s', '%d')); // Set transient if successful to prevent excessive tracking if ($insert_row) { set_transient($transient, $this->current_time, HOUR_IN_SECONDS); } }