使用curl 下载 flurry 事件日志

2023-12-14

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

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

Flurry 只允许下载 100,000 条记录,他们建议经常下载以适应此限制。他们有原始事件下载 API,但由于某种原因放弃了它。因此,唯一的方法是进入事件日志页面并手动下载事件数据。但正如你可以想象的那样,这非常烦人。

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

  1. 在浏览器中访问 flurry 网站并登录
  2. 进入事件日志页面,选择时间范围参数并单击下载
  3. 在嗅探器中复制请求标头
  4. 将它们粘贴到我的 php 代码中
  5. 从现在开始,我可以在 php 中进行此查询,直到会话 cookie 过期

我不确定,但假设 cookie 会在第二天过期,所以所有这些努力都是无用的。

据我了解,我应该尝试使用curl POST 登录,并保持此连接执行GET 下载数据。然而,即使复制整个 POST 登录请求正文,我也无法登录 - 它使用相同的登录页面进行应答,尽管 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;

还尝试传递cookie(就像从浏览器传递cookie一样),但没有任何帮助:

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

谢谢silkfire乱七八糟的问题解决了!


The 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用curl 下载 flurry 事件日志 的相关文章

  • Magento 中的子域 htaccess 问题

    public html www domain com public html subdomain subdomain domain com public html htaccess public html subdomain htacces
  • 如何检查号码是否是巴基斯坦用户的手机号码而不是固定电话号码

    我所做的是从开头删除 92 或 0092 并使用以下代码检查它是否是巴基斯坦人的有效手机号码 if preg match 3 0 4 0 9 number 1 Pakistani mobile number else not a pakis
  • __callStatic():从静态上下文实例化对象?

    我对 PHP 中的 静态 和 动态 函数和对象如何协同工作感到困惑 特别是在 callStatic 方面 callStatic 的工作原理 您可以有一个普通的班级 MyClass 在班级内您可以 放置一个名为 callStatic 的静态函
  • PHP 文件上传帮助

    div align center div 这是我的代码
  • session_regenerate_id 没有创建新的会话 id

    我有一个脚本 旨在完成当前会话并开始新的会话 我使用了一段代码 它在我的开发计算机上运行良好 但是 当我将其发布到生产服务器时 会话 ID 始终保持不变 以下是我重新启动会话的代码 session start SESSION array P
  • 使用 PHP 对 ASP.NET 成员身份中的用户进行身份验证

    我在尝试使用 PHP 针对现有 ASP NET 成员资格数据库对用户进行身份验证时遇到一些问题 我在网上搜索过 发现现有的答案似乎对我不起作用 即 public static function Hash password salt deco
  • 具有动态表单名称的 form_widget

    在我的 Twig 模板中 我有一个 FOR 循环 它创建多个表单 如下所示 for thing in things set form id myform thing Id set form name attribute form myfor
  • 如何将 PHPMailer 与 Codeigniter 3 集成

    嗨 我正在尝试使用PHPMailer 库 https github com PHPMailer PHPMailer来自我的 Codeigniter 应用程序中的 GitHub 我下载了代码并解压到我的application library文
  • 使用 php 更改白天和黑夜的背景?

    我正在制作一个 tumblr 页面 我的 html 页面有两种不同的背景 我希望白天背景从早上 7 点到晚上 8 点显示 夜间背景从晚上 8 点到早上 7 点显示 我决定用 php 来做这件事 但对于 php 来说我是个新手 我的朋友给我发
  • 运行PHPUnit测试时如何避免内部调用函数?以及如何设置内部性能的模拟数据?

    我有一个类 Receipt php
  • Laravel 按动态 ID 数组对集合进行排序 [重复]

    这个问题在这里已经有答案了 我有以下 people array 5 2 9 6 11 people collection People find people 但当我倾倒并死去时 people collection集合按 ID ASC 排序
  • PHP 中的 NOW() 函数

    是否有 PHP 函数以与 MySQL 函数相同的格式返回日期和时间NOW 我知道如何使用date 但我想问是否有专门用于此的功能 例如 返回 2009 12 01 00 00 00 您可以使用date https www php net m
  • 使用PHP套接字发送和接收数据

    我正在尝试通过 PHP 套接字发送和接收数据 一切正常 但是当我尝试发送数据时 PHP 不发送任何内容 Wireshark 告诉我发送的数据长度为 0 我正在使用这段代码
  • 使用 DOJO 自动完成文本框

    我正在寻找一种使用 DOJO 进行文本框自动建议的简单方法 我将查询的数据库表 使用 PHP 脚本 以 JSON 形式返回 有超过 100 000 条记录 因此这确实不应该采用 FilteringSelect 或 ComboBox 的形式
  • 如何在php中使用preg添加html属性

    我正在寻找在 php 中编写一个脚本来扫描 html 文档并根据它找到的内容向元素添加新标记 更具体地说 我是扫描文档并为每个元素搜索CSS标记 float right left 如果找到它 它会添加align right left 基于它
  • 将 MySQL 结果作为 PHP 数组

    mysql 表 config name config value allow autologin 1 allow md5 0 当前的 php 代码 sth mysql query SELECT rows array while r mysq
  • php 表单提交 - Q2

    我对这个虚拟问题感到抱歉 这是我的简单 PHP 表单 其中包含两个 SQL 表和 ADD 提交 按钮 我希望将人员从 Test1 转移到 Test2 很多事情都很好 只有提交按钮不起作用 因此 Test2 表没有反馈 Revised 现在提
  • 为什么 PHP 中不允许“传统”类型提示?

    刚刚发现类型提示 http php net manual en language oop5 typehinting phpPHP 中允许 但不适用于整数 字符串 布尔值或浮点数 为什么 PHP 不允许对整数 字符串等类型进行类型提示 从 P
  • mysqli bind_param 中的 NULL 是什么类型?

    我正在尝试将参数绑定到 INSERT INTO MySQLi 准备好的语句 如果该变量存在 否则插入 null 然后我知道 type variable i corresponding variable has type integer d
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将

随机推荐

  • 创建具有可拖动和可调整大小的选择窗口的自定义图片框

    我使用以下代码在图片框上绘制一个选择矩形 并允许用户选择它并将其拖动到所需的位置 我想要实现的是允许用户通过实现调整矩形大小的选项来调整矩形大小 目前我已经实现了以下目标 如何解决这个问题 public class DraggablePic
  • 复制 mongodb 集合

    使用 C 在同一服务器上复制 Mongodb 中的集合的正确方法是什么 MongoVUE 有一个选项 重复集合 C 有类似的选项吗 没有使用 C 驱动程序复制集合的内置方法 但您仍然可以非常简单地执行此操作 如下所示 var source
  • 函数只返回一次,为什么?

    在我的编码过程中 我确实陷入了这个问题 我跑了一个foreach循环 对于每个项目 我都必须从函数中获取特定的值 但我只收到一张退回的 我不明白发生了什么事 我希望你们一定会的 下面是我的程序的简短版本 最后给出了数据库结构
  • 为什么这个DateTimePicker脚本会导致IE6和IE7无法加载页面

    我在asp net MVC 3站点上有几个页面导致IE6和7在加载菜单后提示 无法加载页面 我已经能够通过以下方式解决此问题DateTimePicker script
  • 使用 NHibernate 更新 Top n

    我怎样才能让 NHibernate 产生这个 t sql 请求 更新前 n 个任务 设置修改 其中条件 我不想进行事务 批量更新 请检查一下 13 3 DML 风格的操作 引用的代码片段 ISession session sessionFa
  • 在 Windows Phone 应用程序中将动态 BitmapImage 转换为灰度 BitmapImage

    我想将位图图像转换为灰度位图图像 这是我从方法中获得的 因此 宽度和高度对我来说是未知的 我尝试过研究 WritableBitmapEx 和静态扩展方法等选项 但它们对我没有帮助 因为我希望返回数据类型为 BitmapImage 然后需要将
  • 如何更改 PostgreSQL 表并使列唯一?

    我在 PostgreSQL 中有一个表 其架构如下所示 CREATE TABLE foo table id serial NOT NULL PRIMARY KEY permalink varchar 200 NOT NULL text va
  • 定时自动注销和浏览器关闭

    我出于学习目的创建了一个非常简单的多用户游戏 当用户登录时 每个其他用户都会获得所有当前登录用户的更新 当用户登录时 它只是将该用户在 SQL 数据库中的值设置为 1 当用户注销时 该值应为 0 我正在使用 window unload fu
  • 快速读取并与Data.Table的Fread和Rbindlist合并

    我正在寻找一种使用 data table 的 fread 和 rbindlist 函数快速读取和合并一堆数据文件的方法 我认为如果 fread 可以将文件名向量作为参数 那么它可能是一个优雅的行 例如 mergeddata rbindlis
  • 如何计算逻辑向量中的 TRUE 值

    在 R 中 计算数量的最有效 惯用的方法是什么TRUE逻辑向量中的值 我可以想到两种方法 z lt sample c TRUE FALSE 1000 rep TRUE sum z 1 498 table z TRUE TRUE 498 你喜
  • Javascript 按名称获取子元素

    我正在传递一个 varel变成一个函数 el包含以前抓取的元素 使用 getElementById 并且当我 console logel在函数中我得到以下内容 当我尝试抓取内部的元素时 问题就出现了el using el getElemen
  • 串行端口 - 如何设置字符?

    考虑 Baud rate 19200 RTS on DTR on Data bits 8 Stop bits 1 Parity None Set chars Eof 0x00 Error 0x2A Break 0x2A Event 0x00
  • 如果使用 loadHTMLString 加载视图,如何在 uiwebview 中设置 http 标头

    我有一个UIWebView我正在加载使用loadHTMLString我需要在请求标头上设置cookie 我知道如何使用loadRequest但不加载网络视图loadHTMLString我没有请求对象 有人做过这样的事吗 从 loadRequ
  • 使用 open() 错误 22(Windows 路径)

    我无法让以下代码正常工作 path C Users jiversen Documents Jsons jsonName json with open path w as outfile json dump df outfile 我收到以下错
  • 类型错误:create_int():函数参数不兼容

    我最近一直在使用 python 学习计算机视觉 在制作手部检测器项目时 我遇到了这个错误 Traceback most recent call last File c Users idhant OneDrive 007lakshya Idh
  • 比较两个数组并以 github 风格呈现交集/差异

    我有两个按字母顺序排序的数组 每个数组都包含唯一的值 但某些值将在两个数组之间共享 示例数组 src apple cherry grape lemon orange strawberry dst apple banana cherry or
  • Hadoop 中的reduce 任务什么时候开始?

    Hadoop中reduce任务什么时候开始 它们是否在映射器完成一定百分比 阈值 后开始 如果是这样 这个阈值是固定的吗 通常使用什么样的阈值 reduce阶段有3个步骤 shuffle sort reduce Shuffle 是减速器从每
  • windowActivated 和 windowFocusGained 之间的区别

    windowActivated 方法 从 WindowListener 实现 和 windowGainedFocus 从 WindowFocusListener 实现 方法之间的主要区别是什么 Java 文档说 窗口获得焦点 当 Windo
  • 我可以仅使用类型而不是具体变量来获取 Rust 数组的长度吗?

    我想将以下 C 代码重写为 Rust using storage array
  • 使用curl 下载 flurry 事件日志

    我开始使用Flurry Analytics 发现它的分析工具不足且速度太慢 3 个步骤的简单漏斗处理了 3 天 而通常在 100 000 行的表上使用 3 个左连接进行查询需要 0 001 秒 Flurry 允许在 事件日志 页面上下载 c