質問

I wrote the following class to measure my server-side traffic through GoogleAnalytics measurement protocol.

The problem is that all active visitors come from Italy which my server is currently on it - I assume the problem cause from fsockopen request IP so is there any way to send user real IP address instead?

<?php
    class GoogleAnalytics {

        public function sendHit($method = null, $info = null) {
            if ($method && $info) {
                // Standard params
                $v   = 1;
                $tid = "UA-xxxxxx-xx";
                $cid = $this->gaParseCookie();
                // Register a PAGEVIEW
                if ($method === 'pageview') {
                    // Send PageView hit
                    $data = array(
                        'v' => $v,
                        'tid' => $tid,
                        'cid' => $cid,
                        't' => 'pageview',
                        'dh' => 'xyz.com',
                        'dt' => $info['title'],
                        'dp' => $info['path']
                    );
                    // Send the data
                    $this->gaFireHit($data);
                }
            }
        }

        // Handle the parsing of the _ga cookie or setting it to a unique identifier
        private function gaParseCookie() {
            if (isset($_COOKIE['_ga'])) {
                list($version, $domainDepth, $cid1, $cid2) = split('[\.]', $_COOKIE["_ga"], 4);

                $contents = array(
                    'version' => $version,
                    'domainDepth' => $domainDepth,
                    'cid' => $cid1 . '.' . $cid2
                );

                $cid      = $contents['cid'];
            } else {
                $cid = $this->gaGenUUID();
            }

            return $cid;
        }

        // Generate UUID v4 function - needed to generate a CID when one isn't available
        private function gaGenUUID() {
            return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', 
                // 32 bits for "time_low"
                mt_rand(0, 0xffff), mt_rand(0, 0xffff), 
                // 16 bits for "time_mid"
                mt_rand(0, 0xffff), 
                // 16 bits for "time_hi_and_version",
                // four most significant bits holds version number 4
                mt_rand(0, 0x0fff) | 0x4000, 
                // 16 bits, 8 bits for "clk_seq_hi_res",
                // 8 bits for "clk_seq_low",
                // two most significant bits holds zero and one for variant DCE1.1
                mt_rand(0, 0x3fff) | 0x8000, 
                // 48 bits for "node"
                mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
            );
        }

        // See https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide
        private function gaFireHit($data = null) {
            if ($data)
                return $this->socketPost('http://www.google-analytics.com/collect', $data);

            return false;
        }

        private function socketPost($url, $params = array(), $ua = null) {
            // create POST string
            $post_params = array();

            foreach ($params as $key => &$val) {
                $post_params[] = $key . '=' . urlencode($val);
            }

            $post_string = implode('&', $post_params);

            // get URL segments
            $parts = parse_url($url);

            // workout port and open socket
            $port = isset($parts['port']) ? $parts['port'] : 80;
            $success = $fp = @fsockopen($parts['host'], $port, $errno, $errstr, 30);

            if ($fp) {
                // create output string
                $output = "POST " . $parts['path'] . " HTTP/1.1\r\n";
                if (is_string($ua)) 
                    $output .= "User-Agent: " . $ua . "\r\n";
                $output .= "Host: " . $parts['host'] . "\r\n";
                $output .= "Content-Type: application/x-www-form-urlencoded\r\n";
                $output .= "Content-Length: " . strlen($post_string) . "\r\n";
                $output .= "Connection: Close\r\n\r\n";
                $output .= isset($post_string) ? $post_string : '';
                // send output to $url handle
                $success = fwrite($fp, $output);

                fclose($fp);
            }

            return $success ? true : false;
        }
    }
?>

Any suggestion would be appreciated...

役に立ちましたか?

解決

Finally Google add this feature to measurement protocol, also it's possible to override User-Agent too.

IP Override
parameter: &uip 
Should be a valid IP address. This will always be anonymized just as though &aip (anonymize IP) had been used.
example: &uip=1.2.3.4

User Agent Override
parameter: &ua
Should be a User Agent reported by the browser (don't forget to URL encode the value!). Note: We have libraries to identify real user agents. Hand crafting your own agent could break at any time.
example: &ua=Opera%2F9.80%20(Windows%20NT%206.0)%20Presto%2F2.12.388%20Version%2F12.14

Source

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top