Php 使用curl下载flurry事件日志

Php 使用curl下载flurry事件日志,php,curl,flurry,Php,Curl,Flurry,我开始使用Flurry Analytics,发现它的分析工具不足且速度太慢。3个步骤的简单漏斗处理了3天,而对于100000行的表,通常使用3个左联接进行查询需要0001秒 Flurry允许在事件日志页面上下载csv格式的原始事件数据,因此我决定导入所有事件并在家中进行分析 Flurry只允许下载100000条记录,他们建议经常下载以满足这一限制。他们有原始事件下载API,但出于某种原因放弃了它。所以,唯一的方法是转到事件日志页面并手动下载事件数据。但正如你所能想象的那样,这很烦人 所以我决定在

我开始使用Flurry Analytics,发现它的分析工具不足且速度太慢。3个步骤的简单漏斗处理了3天,而对于100000行的表,通常使用3个左联接进行查询需要0001秒

Flurry允许在事件日志页面上下载csv格式的原始事件数据,因此我决定导入所有事件并在家中进行分析

Flurry只允许下载100000条记录,他们建议经常下载以满足这一限制。他们有原始事件下载API,但出于某种原因放弃了它。所以,唯一的方法是转到事件日志页面并手动下载事件数据。但正如你所能想象的那样,这很烦人

所以我决定在php中使用curl获取这些数据。我已经复制了GET-HTTP请求以下载带有标题的链接,并获得了数据。 但整个魔法在于会话/cookies,我可以从现有会话复制。因此,要使curl查询成功,我必须:

  • 在浏览器中转到flurry站点并登录
  • 转到事件日志页面,选择时间框架参数并单击下载
  • 复制嗅探器中的请求头
  • 将它们粘贴到我的php代码中
  • 从现在起,我可以在php中进行此查询,直到会话cookie过期
  • 我不确定,但假设cookies将在第二天过期,所以这一切都是徒劳的

    据我所知,我应该尝试使用curl登录,并保持此连接以获取下载数据。然而,我不能登录,甚至复制整个登录后请求体-它回答了相同的登录页面,虽然302应该重定向到

    看起来flurry在某种程度上不受这种卷曲读数的影响。或者有人成功了

    代码如下:

        $cookie_file_path = "cookies.txt";
        $LOGINURL         = "https://dev.flurry.com/secure/login.do";
        $MY_EMAIL ="my email";
        $MY_PASS="password";
        $MY_GAME_ID="gameid";
    
        $ch = curl_init();
    
        curl_setopt($ch, CURLOPT_HEADER,  0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
        curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
        curl_setopt ($ch, CURLOPT_REFERER, $LOGINURL);
    
    
        curl_setopt($ch, CURLOPT_URL, $LOGINURL);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, "loginEmail=$MY_EMAIL&loginPassword=$MY_PASS&__checkbox_rememberMe=true&struts.token.name=struts.token&struts.token=7NB9NWLOYZ8SD8TWR8LGS63REVDI8SQS");
    
        $result = curl_exec($ch);
    
    
        $remotePageUrl = "https://dev.flurry.com/eventsLogCsv.do?projectID=$MY_GAME_ID&versionCut=versionsAll&intervalCut=7Days&stream=true&direction=1&offset=0";
        curl_setopt($ch, CURLOPT_POST, 0);
        curl_setopt($ch, CURLOPT_URL, $remotePageUrl);
        $result = curl_exec($ch);
    
        echo $result;
    
    还尝试传递cookies(就像从浏览器传递cookies一样),但没有任何帮助:

    Cookie: _ga=GA1.2.100867533.1424333566; S0hZTkM0RFRXRjJNSlg2TVdXSEs_fit=1424333594147; fid=SG1162A8DEFC14B8428E7C2AFC71D3AEA00C1872F5; JSESSIONID=w34~mvbdvftm9x9dez9dg9b2pmhs; _map_zoomLevel=0;
    _map_zoneId=0; __utmt=1; __utmt_~1=1; S0hZTkM0RFRXRjJNSlg2TVdXSEs_fs=eyJiYSI6MTQyNDMzNzkzMzU2OCwicGF1c2VUaW1lc3RhbXAiOjAsImJjIjotMSwiZXZlbnRDb3VudGVyIjowLCJwdXJjaGFzZUNvdW50ZXIiOjAsImVycm9yQ291bnRlciI6MCwidGltZWRFdmVudHMiOltdfQ==;
    __utma=83277827.100867533.1424333566.1424333594.1424336847.2; __utmb=83277827.8.10.1424336847; __utmc=83277827; __utmz=83277827.1424333594.1.1.utmcsr=flurry.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utma=34058230.100867533.1424333566.1424333566.1424336847.2; __utmb=34058230.8.10.1424336847; __utmc=34058230; __utmz=34058230.1424333566.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _mkto_trk=id:802-TBR-126&token:_mch-flurry.com-1424333577360-64839; S0hZTkM0RFRXRjJNSlg2TVdXSEs_flp=1424338032448
    

    多亏了丝火Flurry问题得以解决

    struts.token是一个CRSF令牌,它绑定到会话并在每次页面加载时重新生成。但在代码中,它是静态的。您需要在第一个cURL请求之后获取它,然后将它注入到POST数组中以用于第二个请求

    另外,您必须登录的页面是
    /loginAction.do
    ,而不是
    /login.do

    以下是我成功登录Flurry的方式:

    $post = [
             'loginEmail'        => 'E-MAIL',
             'loginPassword'     => 'PASSWORD',
             'struts.token.name' => 'struts.token'
            ];
    
    $ch = curl_init('https://dev.flurry.com/secure/login.do');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    curl_setopt($ch, CURLOPT_COOKIEFILE, null);
    
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
    libxml_use_internal_errors(true);
    
    $dom = new DOMDocument('1.0', 'UTF-8');
    $dom->loadHTML(curl_exec($ch));
    
    $xpath = new DOMXPath($dom);
    
    
    $post['struts.token'] = $xpath->query('//input[@name="struts.token"]')->item(0)->getAttribute('value');
    
    curl_setopt($ch, CURLOPT_URL, 'https://dev.flurry.com/secure/loginAction.do');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
    
    $data = curl_exec($ch);
    
    
    echo $data;
    

    您在登录时遇到问题吗?您发布的链接仍然要求您输入电子邮件和密码。请向我们展示您使用cURL执行此登录请求的代码。@silkfire我添加了一个测试代码变体。理论上一切都应该正常,但是flurry返回相同的登录页面。我看不出你的cURL代码有什么问题。从表面上看,它应该是有效的。不幸的是,在没有访问帐户的情况下进行测试很困难:(注册需要几分钟:。这个过程涉及电子邮件,所以每个人都应该注册自己。顺便说一句,Flurry是免费的。如果我注册,我从哪里可以获得游戏ID?谢谢,太棒了!我已经设置了CURLOPT_COOKIEFILE和CURLOPT_COOKIEFILE,并且成功了!@Tertium将
    CURLOPT_COOKIEFILE
    设置为
    null
    就足够了。它允许你的cURL句柄存储cookie,但它们只保存在内存中,不会弄乱你的项目文件夹。谢谢,我只是想看看里面有什么。Hi Silkfire&Tertium。我对PHP和这些类型的脚本不太熟悉。我想知道你们中是否有人可以提供一个基于代码的完整解决方案来登录Flurry and获取所有日志事件。目前我不明白这两个脚本如何做到这一点。我希望有一个for循环或其他什么。如果你有时间,你能帮忙吗?谢谢。现在谁在乎呢,flurry数据不好,许多事件都被复制了,甚至我自己的日志也能更好地处理它们。