Как я могу использовать API 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?

Заранее спасибо.

РЕДАКТИРОВАТЬ: я добавил новую версию страницы.


person Lajos Arpad    schedule 30.10.2012    source источник
comment
Можете ли вы рассказать нам немного больше, например, возвращает ли консоль что-нибудь? Вы проверяли свою консоль, когда-либо отправлялся запрос Ajax? Когда вы вызываете sendRequestToPage()? она сама не запустится.   -  person Haso Keric    schedule 30.10.2012
comment
Теперь я получаю {ошибка: неверная подпись API}   -  person Lajos Arpad    schedule 30.10.2012
comment
Вы не указываете api_secret в своем URL-адресе   -  person Haso Keric    schedule 30.10.2012
comment
Согласно документации, api_secret не является частью URL-адреса.   -  person Lajos Arpad    schedule 31.10.2012
comment
Почему вы используете JSONP?   -  person Alan    schedule 02.11.2012
comment
Как @Tyler упомянул в своем ответе, вам нужно хэшировать подпись MD5 и добавить ее к вашему запросу.   -  person Alan    schedule 02.11.2012
comment
Я создал библиотеку Javascript, чтобы упростить эту задачу: github.com/michaelcarter/mixpanel -данные-экспорт-js   -  person user2534862    schedule 29.06.2013
comment
Может ли кто-нибудь дать мне какие-либо советы, как это сделать, сохраняя при этом секрет моего API? Я хотел бы иметь возможность делать запросы из внешнего кода Javascript, но эта страница будет общедоступной.   -  person stealthysnacks    schedule 10.02.2017
comment
@stealthysnacks Я думаю, вы могли бы использовать прокси. Ваш код Javascript может отправить запрос на ваш сервер, заставив ваш сервер отправить запрос в MixPanel. Таким образом, секрет API будет известен только вашему серверу и никогда не будет передан вашей клиентской стороне.   -  person Lajos Arpad    schedule 10.02.2017
comment
$Lajos Arpad Это хороший ответ. Я предполагаю, что будет дополнительный звонок на наши серверы, но это сохранит анонимность секрета.   -  person stealthysnacks    schedule 10.02.2017
comment
@stealthysnacks да, я думаю, что это лучший способ сохранить свой секрет в секрете в ваших условиях.   -  person Lajos Arpad    schedule 11.02.2017
comment
Недавно за этот вопрос проголосовали. Есть ли причина?   -  person Lajos Arpad    schedule 20.06.2018


Ответы (6)


из документации:

У нас нет клиентской библиотеки JS, но мы внедрили jsonp в серверную часть API. Краткий обзор см. в статье Википедии. Наш параметр 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);
        });
person Greg Dean    schedule 20.11.2012

Вот несколько вещей, которые я понял. Мне удалось заставить его работать со всеми другими конечными точками, которые я пробовал, кроме «экспорта». У меня возникает соблазн поверить, что это что-то особенное только для конечной точки экспорта необработанных данных. Прочитав их документы, необработанные конечная точка данных — это единственная конечная точка, которая не является частью основного 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/

Надеюсь, что вы найдете ее полезной.

person dantheta    schedule 05.02.2013
comment
Спасибо, я постараюсь проверить это в ближайшее время. - person Lajos Arpad; 05.02.2013
comment
Эй, Дэн. Я думаю, что у меня такая же проблема. Я могу заставить /events/top работать, но не экспортировать. Я получаю 400 Bad Request, но я предполагаю, что мой код для совершения вызова, вычисления подписи и т. д. верен из-за успеха первого. Вы когда-нибудь получали успешный экспортный вызов? Кстати, ваш фрагмент jsfiddle помог, хотя он тоже не выполняется. - person Jason; 08.08.2013
comment
Спасибо за скрипку, @dantheta! Я обновил здесь: jsfiddle.net/mytovdp9, так как в вашей строке 13 была опечатка для on поле, и я обновил внешний ресурс до rawgit, чтобы после изменения github снова использовался правильный тип MIME. На самом деле, я только что правильно отредактировал ваш здесь: jsfiddle.net/CmKQN/8 - person qix; 28.08.2014
comment
Эй, некоторым удается заставить «экспорт» работать?? - person Yair hadad; 02.09.2019

Изучив этот PHP, я почти уверен, вам нужно сделать хэш md5 вашей подписи API.

Импортируйте библиотеку 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);

Я пытаюсь сделать то же самое, что и вы, но, к сожалению, у меня все еще не получается.

Изменить – это грубо. API завершится ошибкой, если ЛЮБОЙ параметр не будет хеширован с помощью sig. Также произойдет сбой, если включен какой-либо параметр, не являющийся частью 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.

person Tyler    schedule 31.10.2012
comment
В их документации сказано, что параметр обратного вызова не является частью подписи MD5. - person Alan; 02.11.2012
comment
Uncaught TypeError: функция объекта (a,b){return new p.fn.init(a,b,c)} не имеет метода 'jsonp' - person Lajos Arpad; 04.11.2012
comment
Я отредактировал свой ответ с новой версией страницы. Какой скрипт нужно включить, чтобы можно было использовать $.jsonp? Спасибо. - person Lajos Arpad; 04.11.2012
comment
Сценарий находится здесь github.com/jaubourg/jquery-jsonp, но опять же, это не так. работает для меня, потому что вывод недействителен JSON. - person Tyler; 05.11.2012

Как упоминал Тайлер, вам необходимо хэшировать подпись MD5, прежде чем добавлять ее к URL-адресу запроса.

Кроме того, если то, что вы вставили, является вашим кодом, у вас есть ошибка:

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

должно быть:

path = path + "&sig=" + sig

person Alan    schedule 02.11.2012

Я пробовал много вещей, но мне не удалось отправить запрос на mixpanel с помощью jsonp, потому что он сгенерировал новые параметры. Никто не показал мне рабочего решения, поэтому я думаю, что эта проблема неразрешима. Если кто-то покажет мне решение, я с удовольствием удалю этот ответ и приму его/ее ответ.

person Lajos Arpad    schedule 12.11.2012

Конечная точка /export выглядит так, как будто она не поддерживает обратные вызовы JSONP. Если вы вычислите свою подпись и вызовете URL-адрес без обратного вызова и без очистки кеша (предоставляется по умолчанию с вызовом $.ajax), вы получите результаты.

person Jason    schedule 12.08.2013