我无法连接到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>
正如您所看到的,我尝试将此API与JSONP一起使用,但我在树林里迷失了方向。有没有人知道mixpanel和JSONP?
提前谢谢。
编辑:我添加了新版本的页面。
答案 0 :(得分:3)
这里有一些我意识到的事情。我能够使用我尝试过的所有其他终点,但“导出”。我很想相信它只是原始数据导出端点所特有的。通过他们的docs读取,原始数据端点是唯一不属于主API的端点,因此需要不同的基本URI“https://data.mixpanel.com/api/2.0”。所有其他端点“事件”,“分段”等使用“https://mixpanel.com/api/2.0”。我已经记下了我在下面介绍的步骤。我正在使用jquery.MD5 lib来实现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/
希望你觉得它很有用。
答案 1 :(得分:2)
在眯着眼睛this PHP之后,我很确定你需要对你的api签名做一个md5哈希。
导入md5库,例如this one
<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);
我正在努力完成同样的事情,但不幸的是我仍然没有让它发挥作用。
修改 - 这很糟糕。如果ANF参数未使用sig进行哈希处理,则API将失败。如果包含任何不属于API的参数,它也将失败。 JsonP添加了一个“回调”和一个“_”时间戳参数,因此它可以执行它的操作,这会中断调用。您可以通过使用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。
答案 2 :(得分:1)
来自文档:
我们没有JS客户端库,但是我们已经实现了jsonp API后端。有关简要概述,请参阅Wikipedia文章。我们的 jsonp参数是'回调'。在此期间不会使用此参数 签名计算。
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);
});
答案 3 :(得分:0)
正如Tyler所提到的,在将签名附加到请求URL之前,您需要对签名进行MD5哈希。
此外,如果您粘贴的是您的代码,则会出现错误:
path = path + + "&sig=" + sig;
应该是:
path = path + "&sig=" + sig
答案 4 :(得分:0)
我尝试过很多东西,但是我没有成功向mixpanel发送jsonp请求,因为它生成了新的参数。没人给我看一个有效的解决方案,所以我猜这个问题无法解决。如果有人向我展示了解决方案,我很乐意删除这个答案并接受他/她的回答。
答案 5 :(得分:0)
/ export端点看起来好像不支持JSONP回调。如果你计算你的签名并在没有回调和没有缓存破坏者的情况下调用URL(默认情况下提供$ .ajax调用),你将获得结果。