2013-03-05 4 views
3

Я пытаюсь добавить отслеживание Google Analytics в свое настольное приложение на C++/Qt. Чтобы сделать это, я делаю HTTP GET для http://www.google-analytics.com/__utm.gif, как указано здесь: http://automateeverything.tumblr.com/post/20500736298/google-analytics-without-javascript-or-cookiesGoogle Analytics в настольном приложении C++

Моего URL выглядит следующим образом:

http://www.google-analytics.com/__utm.gif?utmwv=5.2.5&utmac=UA-XXXXXXXX-1&utmhn=prot-on.com&utms=1&utmn=1763710005&utmcc=__utma%3D265465294.163654595.1362420921.1362420921.1362420921.1%3B&utmp=%2Freallyallheaders.html&utmcs=-&utmr=-&utmip=127.0.0.1&utmul=es-es&utmfl=-&utmje=-&utmsr=1920x1080&utmhid=957274494 

И это мой исходный код:

qint64 currentTimestamp = QDateTime::currentMSecsSinceEpoch()/1000; 
if (this->timeOfFirstVisit == 0) 
    this->timeOfFirstVisit = currentTimestamp; 
if (this->timeOfPreviousVisit == 0) 
    this->timeOfPreviousVisit = currentTimestamp; 

QString googleAnalyticsRequestUrl; 
QTextStream(&googleAnalyticsRequestUrl) << "http://www.google-analytics.com/__utm.gif" 
<< "?utmwv=5.2.5" 
<< "&utmac=" << TRACKING_ID 
<< "&utmhn=" << HOST_NAME 
<< "&utms=" << this->sessionNumberOfQueries 
<< "&utmn=" << QString::number(qrand()) //this->generateRandomUTMN() 
<< "&utmcc=__utma%3D" << this->domainHash 
    << "." << this->sessionId 
    << "." << this->timeOfFirstVisit 
    << "." << this->timeOfPreviousVisit 
    << "." << currentTimestamp 
    << ".1%3B" 
<< "&utmp=" << QString(QUrl::toPercentEncoding(pageUrl)) 
<< "&utmcs=-" 
<< "&utmr=-" 
<< "&utmip=127.0.0.1" 
<< "&utmul=" + QLocale::system().name().toLower().replace("_", "-") 
<< "&utmfl=-" 
<< "&utmje=-" 
<< "&utmsr=" + QString::number(QApplication::desktop()->screenGeometry().width()) + "x" + QString::number(QApplication::desktop()->screenGeometry().height()) 
<< "&utmhid=" + QString::number(qrand()); 

this->timeOfPreviousVisit = currentTimestamp; 
this->updateSessionNumberOfQueries(); 

qDebug() << "Sending Google Analytics request: " << googleAnalyticsRequestUrl; 

// Send a http GET request to the created URL 
QNetworkAccessManager *manager = new QNetworkAccessManager(); 
connect(manager, SIGNAL(finished(QNetworkReply *)),this, SLOT(googleAnalyticsRequestReceived(QNetworkReply *))); 
connect(manager, SIGNAL(finished(QNetworkReply *)),manager, SLOT(deleteLater())); 

QUrl requestUrl(googleAnalyticsRequestUrl); 
QNetworkRequest request(requestUrl); 

// I see this headers with Firebug, but I think that they are not necessary 
request.setRawHeader("Host", "www.google-analytics.com"); 
request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); 
request.setRawHeader("X-Forwarded-For", "127.0.0.1"); 
request.setRawHeader("Connection", "close"); 

manager->get(request); 

Но мои посещения страниц никогда не появляются на моей странице Google Analytics ... Можете ли вы сказать мне, если я что-то сделаю плохо?

+0

Можете ли вы вызывать свой URL прямо из браузера? Он работает, если вызван таким образом, и только сбой при вызове из кода на C++? – PCaetano

+0

Та же проблема из браузера – user1204395

+0

Это ответ с сервера, это 200 OK для этого запроса GET, который вы делаете? –

ответ

1

Решение открыт сокет, как я это PHP библиотека делает: http://code.google.com/p/php-ga/source/browse/trunk/src/GoogleAnalytics/Internals/Request/HttpRequest.php#175

я вставляю свой исходный код:

GoogleAnalyticsManager::GoogleAnalyticsManager() 
    : domainHash(this->generateDomainHash(HOST_NAME)), 
     sessionId(qrand()), 
     sessionNumberOfQueries(1), 
     timeOfFirstVisit(0), 
     timeOfPreviousVisit(0) 
{ 

} 

void GoogleAnalyticsManager::sendPageVisit(const char *pageUrl) 
{ 
    QTcpSocket socket; 
    socket.connectToHost("www.google-analytics.com", 80); 
    socket.waitForConnected(); 
    if (socket.state() != QAbstractSocket::ConnectedState) { 
     qDebug() << "Impossible to connect to www.google-analytics.com"; 
     return; 
    } 

    qint64 currentTimestamp = QDateTime::currentMSecsSinceEpoch()/1000; 
    if (this->timeOfFirstVisit == 0) 
     this->timeOfFirstVisit = currentTimestamp; 
    if (this->timeOfPreviousVisit == 0) 
     this->timeOfPreviousVisit = currentTimestamp; 

    QString googleAnalyticsRequest; 
    QTextStream(&googleAnalyticsRequest) << "GET /__utm.gif" 
    << "?utmwv=5.2.5" 
    << "&utmac=" << TRACKING_ID 
    << "&utmhn=" << HOST_NAME 
    << "&utms=" << this->sessionNumberOfQueries 
    << "&utmn=" << QString::number(qrand()) 
    << "&utmcc=__utma%3D" << this->domainHash 
     << "." << this->sessionId 
     << "." << this->timeOfFirstVisit 
     << "." << this->timeOfPreviousVisit 
     << "." << currentTimestamp 
     << ".1%3B" 
    << "&utmp=" << QString(QUrl::toPercentEncoding(pageUrl)) 
    << "&utmcs=-" 
    << "&utmr=-" 
    << "&utmip=127.0.0.1" 
    << "&utmul=" + QLocale::system().name().toLower().replace("_", "-") 
    << "&utmfl=-" 
    << "&utmje=-" 
    << "&utmsr=" + QString::number(QApplication::desktop()->screenGeometry().width()) + "x" + QString::number(QApplication::desktop()->screenGeometry().height()) 
    << "&utmhid=" + QString::number(qrand()) 
    << " HTTP/1.0\r\n" 
    << "Host: www.google-analytics.com\r\n" 
    << "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0\r\n" 
    << "X-Forwarded-For: 127.0.0.1\r\n" 
    << "Connection: close\r\n\r\n\r\n"; 

    this->timeOfPreviousVisit = currentTimestamp; 
    this->updateSessionNumberOfQueries(); 

    qDebug() << "Sending Google Analytics request: " << googleAnalyticsRequest; 

    socket.write(googleAnalyticsRequest.toStdString().c_str()); 
    socket.waitForBytesWritten(); 
    socket.close(); 
} 

int GoogleAnalyticsManager::generateDomainHash(const QString &domain) 
{ 
    int hash = 1; 

    if (domain != NULL && !domain.isEmpty()) { 
     hash = 0; 

     for (int pos = domain.length()-1; pos >= 0; pos--) { 
      int current = domain.at(pos).toAscii(); 
      hash = ((hash << 6) & 0xfffffff) + current + (current << 14); 
      int leftMost7 = hash & 0xfe00000; 

      if(leftMost7 != 0) { 
       hash ^= leftMost7 >> 21; 
      } 
     } 
    } 

    return hash; 
} 

void GoogleAnalyticsManager::updateSessionNumberOfQueries() 
{ 
    this->sessionNumberOfQueries++; 

    if (this->sessionNumberOfQueries > 500) { 
     this->sessionId = qrand(); 
     this->sessionNumberOfQueries = 1; 
     this->timeOfFirstVisit = 0; 
     this->timeOfPreviousVisit = 0; 
    } 
} 
3

К сожалению, у Google нет официальной библиотеки Qt. Однако я рекомендую вам изучить их API Google Analytics (в настоящее время в бета-версии) https://developers.google.com/analytics/devguides/collection/protocol/v1/ Это также говорит о том, что он всегда будет возвращать 200, даже если ваш запрос был недействительным и не обработан правильно. Они, скорее всего, поддержат вас, используя этот бета-интерфейс, а затем переконвертируют свой javascript, чтобы использовать его напрямую.

Редактировать: Также, глядя на ваш код, вероятно, разумнее начать с QUrl сразу и добавить элементы запроса, используя http://harmattan-dev.nokia.com/docs/library/html/qt4/qurl.html#addQueryItem, поэтому Qt позаботится о правильной кодировке и все такое.

+0

Проверка http://code.google.com/p/php-ga/source/browse/trunk/src/GoogleAnalytics/Internals/Request/HttpRequest.php#175 Я вижу, что эта библиотека открывает сокет и отправляет запросы (с тем же форматом моего вопроса). Оно работает! :) – user1204395

+0

Не могли бы вы показать мне свой рабочий код? Я смотрел на интеграцию аналитики в мое приложение Qt только на прошлой неделе, и я немного перестаю следить за тем, как узнал о бета-апи. – Schoentoon

+1

Я ответил на вопрос http://stackoverflow.com/a/15245938/1204395 – user1204395

0

Вот небольшой класс (содержится в одном заголовке файла) для отправки измерения событий в Google Analytics из Qt приложения:

https://github.com/tesch1/qt-google-analytics-collector

из конечно, не забудьте следовать политике конфиденциальности Google о том, что вы не отправляете личную идентификационную информацию, информированное согласие и предлагаете пользователям отказаться ...

Смежные вопросы