如何使用 Mixpanel API?

10

我无法连接到 Mixpanel。

我已经尝试使用正确的 api_key 和 api_secret 进行连接,像这样:

<html>
<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js" />
    </script>
    <script type="text/javascript" src="faulty-labs-md5.js" />
    </script>
</head>
<body>
    <script type="text/javascript">
$(document).ready(function() {
    $("#btnTest").click(function() {

        var api_key = 'BigSecret';
        var api_secret = 'BigSecret2';
        var expire = new Date('2012', '12', '24').getTime() / 1000 + 3600;
        var from_date = $("#date1").val();
        var to_date = $("#date2").val();
        var sig = faultylabs.MD5("api_key=" + api_key + "expire=" + expire + "from_date=" + from_date + "to_date=" + to_date + api_secret);
        //var path = 'https://data.mixpanel.com/api/2.0/export?api_key=' + api_key + "&expire=" + expire + "&from_date=" + from_date + "&to_date=" + to_date;
        var path = 'https://data.mixpanel.com/api/2.0/export?api_key=' + api_key + "&expire=" + expire + "&from_date=" + from_date;
        path = path + "&sig=" + sig.toLowerCase();
        $.jsonp({
            type: 'GET',
            url: path,
            async: false,
            callback: to_date,  // sneaky bogus shenanigans
            callbackParameter: 'to_date', // more of same
            contentType: "application/json",
            dataType: 'jsonp',
            cache: true,
            success: function(json) {
                alert(json);
            },
            error: function(e) {
                console.log(e.message);
            }
        });
    });
});
    </script>
    <input type="text" id="date1" value="2012-10-29" />
    <input type="text" id="date2" value="2012-10-29" />
    <button onclick="return false" id="btnTest">Test</button>
</body>
</html>

你看,我试图使用JSONP调用这个API,但是我一直处于困惑之中。有没有人了解mixpanel和JSONP?

提前感谢。

编辑:我已经添加了页面的新版本。


你能告诉我们更多信息吗?比如控制台是否有返回任何内容?你检查过控制台了吗?Ajax请求是否被发送出去了?你什么时候调用sendRequestToPage()函数?它不会自己启动。 - Haso Keric
1
我现在收到了一个 {"error": "无效的API签名"}。 - Lajos Arpad
正如@Tyler在他的回答中提到的那样,您需要对签名进行MD5哈希,并将其附加到您的请求中。 - Alan
1
我已经创建了一个Javascript库,使这变得非常容易:https://github.com/michaelcarter/mixpanel-data-export-js - user2534862
1
@stealthysnacks 我认为你可以使用代理。你的Javascript代码可以向你的服务器发送请求,触发你的服务器向MixPanel发送请求。这样API密钥只会被你的服务器知道,而不会被客户端知道。 - Lajos Arpad
显示剩余7条评论
6个回答

3
这是我意识到的一些事情。我能够让所有其他尝试的端点工作,但是“导出”无法工作。我倾向于认为这只是原始数据导出端点特有的问题。通过阅读他们的文档,原始数据端点是唯一不属于主API的端点,因此需要一个不同的基本URI“https://data.mixpanel.com/api/2.0”。所有其他端点,“事件”,“分割”等使用“https://mixpanel.com/api/2.0”。我在下面列出了我经历的步骤。我正在使用jquery.MD5库进行md5实现。
$(function() {
  $("#test_request").click(function() {
    var api_secret, arg_keys, args, args_concat, end_point, key, 
    mixpanel_base_uri, sig, sorted_keys, _i, _len;
    args = {};
    end_point = "export";
    api_secret = "BIG_SECRET2";
    args.api_key = "BIG_SECRET";

    args.from_date = $("input[name=from_date]").val();
    args.to_date = $("input[name=to_date]").val();
    //using Math.floor to round to integer as api expects integer
    args.expire = Math.floor(new Date().getTime() / 1000 + 3600); 
    arg_keys = Object.keys(args);
    sorted_keys = arg_keys.sort();
    args_concat = "";

    //concatenating key value pairs
    for (_i = 0, _len = sorted_keys.length; _i < _len; _i++) {
      key = sorted_keys[_i];
      args_concat = "" + args_concat + key + "=" + args[key];
    }
    sig = $.md5(args_concat + api_secret);

    //merge signature property with args hash
    $.extend(args, {
      sig: sig
    });

    //export endpoint isn't part of the main api and data.mixpanel instead of just mixpanel.com
    DATA_URI = "https://data.mixpanel.com/api/2.0"
    DEFAULT_URI = "https://mixpanel.com/api/2.0"
    BASE_URI = end_point === "export" ? DATA_URI : DEFAULT_URI;
    $.getJSON("" + BASE_URI + "/" + end_point + "?callback=?", args, function(result) {
      alert("result is" + JSON.stringify(result));

    });
  });
});

我也为所有其他端点提供了一个可用的解决方案。这是链接 http://jsfiddle.net/Dantheta/CmKQN/,希望你觉得有用。

谢谢,我会尽快尝试测试这个。 - Lajos Arpad
嘿,丹。我认为我遇到了同样的问题。我可以让“/events/top”正常工作,但无法使用“export”。我收到了400 Bad Request错误,但我认为我的调用代码、计算签名等都是正确的,因为前者成功了。你有成功的导出调用吗?顺便说一句,你的jsfiddle片段很有帮助,尽管它也没有执行。 - Jason
感谢@dantheta提供的fiddle!我已经更新了这里:http://jsfiddle.net/mytovdp9/,因为您的第13行“on”字段中有一个错别字,并且我将外部资源更新为rawgit,以便在github更改后再次使用正确的MIME类型。实际上,我刚刚在这里适当地编辑了您的内容:http://jsfiddle.net/CmKQN/8/。 - qix
嘿,有人成功让“导出”工作了吗? - Yair hadad

2
在仔细查看这个PHP文件后,我很确定您需要对API签名进行MD5哈希处理。
导入一个MD5库,例如这个
<script type="text/javascript" src="jquery.md5.min.js"></script>

然后可以执行以下操作:
var sig = "api_key=" + api_key + "expire=" + expire + "from_date=" + from_date + "to_date=" + to_date + "bigsecret2";
sig = $.md5(sig);

我正在尝试实现与您相同的事情,但不幸的是我还没有使其工作。
编辑- 这很困难。如果任何参数没有使用sig进行哈希处理,则API将失败。如果包括任何不属于API的参数,则也会失败。JsonP添加了一个“callback”和一个“_”时间戳参数,以便它可以执行它的功能,但这会破坏调用。您可以通过使用cache:true排除时间戳并使用特殊的jsonp插件来解决此问题,该插件允许您重命名callback参数。在这里,我已将其重命名为to_date,并将回调函数命名为“2012-10-29”。这很疯狂,但仍然无法正常工作,因为回复不是有效的json。它是一系列换行符分隔的json对象,无法评估,我仍然卡在那个部分。到目前为止,我已经得到了以下结果:
<script type="text/javascript" src="jquery-1.8.2.js"></script>
<script type="text/javascript" src="jquery.md5.min.js"></script>
<script type="text/javascript" src="jquery.jsonp-2.4.0.js"></script>

<script>
    var events = document.getElementById("events");

    var api_key = "secret";
    var expire = "1351811239";
    var from_date = "2012-10-29";
    var to_date = "2012-10-29";

    var sig = "api_key=" + api_key + "expire=" + expire + "from_date=" + from_date + "to_date=" + to_date + "secret2";
    sig = $.md5(sig);


    var path = 'https://data.mixpanel.com/api/2.0/export?api_key=' + api_key + "&expire=" + expire + "&from_date=" + from_date;
    // to_date will be added later as the sneaky callback

    path = path + "&sig=" + sig;

    $.jsonp({
        type: 'GET',
        url: path,
        async: false,
        callback: to_date,  // sneaky bogus shenanigans
        callbackParameter: 'to_date', // more of same
        contentType: "application/json",
        dataType: 'jsonp',
        cache: true,
        success: function(json) {
            alert(json);
        },
        error: function(e) {
            console.log(e.message);
        }
    });

</script>

最终,我放弃了,并写了一个C#程序来调用API并为我生成CSV文件。


他们的文档说明回调参数不是MD5签名的一部分。 - Alan
未捕获的类型错误:对象函数(a,b){return new p.fn.init(a,b,c)}没有“jsonp”方法。 - Lajos Arpad
我已经用页面的新版本编辑了我的答案。为了能够使用$.jsonp,应该包含哪个脚本?谢谢。 - Lajos Arpad
脚本在这里 https://github.com/jaubourg/jquery-jsonp 但是,它对我来说仍然无法工作,因为输出不是有效的JSON。 - Tyler

1

来自文档:

我们没有JS客户端库,但我们已在API后端上实现了jsonp。请参阅维基百科文章进行简要概述。我们的jsonp参数是“callback”。计算签名时不会使用此参数。

https://mixpanel.com/docs/api-documentation/data-export-api#libs-js

假设您正确计算了签名,下面的示例将起作用:

 $.getJSON('http://mixpanel.com/api/2.0/segmentation/?callback=?', {
            event: event,
            from_date: from_date,
            to_date: to_date,
            expire: expire,
            sig: sig,
            api_key: api_key
        }, function (result) {
            alert(result);
        });

0

正如Tyler所提到的,您需要在将签名附加到请求URL之前对其进行MD5散列。

此外,如果您粘贴的是您的代码,则存在错误:

path = path + + "&sig=" + sig;

应更改为:

path = path + "&sig=" + sig


0

/export 端点似乎不支持 JSONP 回调。如果您计算签名并在没有回调和缓存破坏器的情况下调用 URL(由 $.ajax 调用默认提供),则会获得结果。


0

我尝试了很多方法,但是使用jsonp发送请求到mixpanel时并没有成功,因为它生成了新的参数。没有人向我展示过可行的解决方案,所以我猜这个问题是无法解决的。如果有人向我展示解决方案,我将非常乐意删除这个答案并接受他/她的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接