Like-button для своего сайта(своих аккаунтов) [re:авторизация..]

uncle17

отпишись тогда про чужую куку.
Мы ее, правда, сегодня победили-таки, но совсем другим способом. Теперь другая проблема встала - кириллический referer кроссбраузерно определять

serega1604

>кириллический referer кроссбраузерно
удачи, да.

uncle17

совсем бесшансоф?
Мы сгодня полдня проебались со всеми возможными сочетаниями urlencode/urldecode/encodeURIComponent/escape/iconv и т.д.

serega1604

ну конкретно про реферреры я хуй знает, просто помню как года два назад ебался с чем-то похожим - мне нихуя не понравилось.

uncle17

ну похер, да, сама строка урла меня теперь беспокоит. Как ее вытаскивать - нехитрое дело. Но как ее отдать по цепочке скриптов через несколько серверов в правильном виде...

marat7256

uudecode\uuencode?

uncle17

Каждый браузер (из 5 обычно тестируемых) перед отправкой шифрует не-latin URL только ему известным способом. Привести всё к единообразию мы пока не сумели.

Bibi

хм, но в рамках одного браузера шифрование-дешифрование должно ведь быть обратимым?

uncle17

к этому мы к сегодняшнему вечеру и пришли: для каждого браузера строить свою транспортную систему... что, конечно, очень радует :(

Bibi

не понял, какую систему. редиректы же браузером делаются

Dasar

Каждый браузер (из 5 обычно тестируемых) перед отправкой шифрует не-latin URL только ему известным способом. Привести всё к единообразию мы пока не сумели.
а просто url он другим способом кодирует?

uncle17

в том-то и дело, что редиректы делаются браузером, а как именно он отправит referer, зависит только от самого браузера: кто кодирует просто в urlencode, кто отправляет в utf-8, кто - в utf16, кто кодирует только гет-запрос, кто кодирует только данные гет-запроса (без имен переменных и при этом таких отправок существует несколько подряд.
В общем, на урле http://targetdomain/script.html?%F5%F3%E9=%F7%EB%E5%ED мы сегодня позабавились дай боже

uncle17

в "просто урл", записанным нормальными человеческими latin-буквами, кодируются только слеши, амперсанды, знаки вопроса etc.
Ради прикола мы попробовали скормить нашей "системе" адрес http://targetdomain/script.html?秋季&...
От результатов просто пошли покурить

serega1604

если это вам для своей кнопки надо, может вообще с другой стороны подойти? по нажатию на кнопку брать location.href яваскриптом, кодировать известным вам способом в latin и переходить на mydomain.ru/redirect.html?from=codedurl и уже с него на то куда надо в реальности?

uncle17

пробовали
каждый браузер отдает location.href как ему хочется. Попробуй в разных браузерах набрать http://domain/file?%EA%E8%F0%E8%EB%EB%E8%F6%E0

uncle17

тьфу
domain/file?кириллица

serega1604

ну хз, мне щас лень, просто я думаю для яваскрипта есть готовые решения для кросс-браузерного разбора текущего урла.

uncle17

в итоге задача:
Любой мудак человек ставит на своем сайте наш код. Естественно, минимальный по размеру:

<div id="ourlikes"></div>
<script src="http://ourdomain.com/ourlikes_script.php"></script>

В итоге любому посетителю страницы этого человека отдается, зарегистрирован ли он у нас, залогинен ли он у нас, и, если залогинен, то он именно эту страницу (на которой код стоит) может "лайкнуть". Отметить, что она ему нравится. При этом на странице выдастся, что она нравится именно ему, а у него в профайле на нашем сайте отпишется, что она ему понравилась. Это тем, кто еще не понял ТЗ.

Bibi

все, конечно, зависит от того, как это у вас будет эксплуатироваться, но можно сделать так:
когда вас дергают, чтобы скачать код, вы уже получаете реферер.
в этот момент генерите токен = id пользователя + xor("$id:$referer" + secret который вы уже знаете
когда чувак будет кликать, вы получаете этот токен и корректно записываете данные, что этот чувак лайкает эту страницу. понятно, как это расширять на случай, если нужен анлайк

uncle17

Тоже проблема:
Чувак получает код для всего своего сайта (допустим, некий свой app_id, как в VK/FB ставит его на все страницы сразу. А в мыслях - не для всего сайта, а для группы сайтов.
На каком конкретно урле его домена (и какого именно) будет стоять код - непонятно.
Так что $referer всегда будет разным. Даже если встраивать его в JS-код автоматом, свой location.href он может отдавать другой, еще не существующий в нашей базе

Bibi

я наверное, плохо написал. чувак ставит кусочек хтмл-кода, который при загрузке страницы подгружает саму инфу, лайкалась ли эта страница уже, и кнопочку с токеном(либо только токен для кнопочки, которая уже есть в хтмл-коде).

uncle17

нет, ты всё правильно написал, но токен должен откуда-то браться.
Но токен для каждой страницы связан с $referer. Мы ему (пользователю) с удовольствием его отдадим, если он пришлет $referer так, как он был записан изначально (ведь именно он же ключ для поиска по базе). Но проблема в том, что разными браузерами он будет прислан по-разному.

uncle17

т.е. пусть человек вставляет код

document.write('<sc'+'ript src="path_to_script.php?url='+location.href+'"></'+'script>');

но location.href будет разным, даже если человек зашел на одну и ту же страницу с разных браузеров.

Bibi

почитай access.log

uncle17

более того, если напишешь
document.write(location.href)

и

document.write('<sc'+'ript src="path_to_script.php?url='+location.href+'"></'+'script>');

в одном и том же файле, то один браузер напишет "file.html?текст" и вызовет его же, другой напишет в urlencode и то, и вызовет так же, третий напишет прямо, а вызовет в urlencode, четвертый еще и urlencode перекодирует в utf-16 etc.

Dasar

Но токен для каждой страницы связан с $referer.
вставлять необходимо код вида (который уже вытягивает скрипт с вашего сайта)
<script>
   var currentHref = самый-правильный-encode(document.href);
    var ga = document.createElement('script'); ga.type = 'text/javascript';
    ga.src = ('https:' == document.location.protocol ? 'http://ssl' : 'http://www') + '.yourdomain.com/like-button.php?page=' + currentHref;
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  
</script>

uncle17

какой-нибудь-encode(document.href);
вооот
а document.href каждый отдает разный

Bibi

чтобы не было путаницы, замечу, что darkgray какое-то свое решение рассказывает

uncle17

судя по сокращениям, это Google Analytics :)

uncle17

самый-правильный-encode
я тебя апиридил
Вот мы и пришли вечером к выводу, что надо под всех писать свой правильный енкодер, ага.
На гиков нам пофиг, 99.9% браузеров мы асилим, но поработать придется, конечно

Dasar

а document.href каждый отдает разный
так он корёжется уже сразу в document.href, или когда ты его запихиваешь в параметры?

Bibi

на сайте:

<script>
function myCb(response) {
blahblahblah
if (response.token) {
^__^.onclick( function {
^__^.ajaxJSONP("://xxx.com/like.php?cb=myCb&token=response.token");
});
} else if (response.liked) {
рисуем like
}
}
</script>
<script src="://xxx.com/like.php?cb=myCb" />

на сервере (like.php)
php не знаю, псевдокод

if ($_GET['token']) {
$token = $_GET['token']
split
...
} else {
$referer = $ENV{HTTP_REFERER};
$user_id = get_user_id;
$liked = get_liked($user_id, $referer);
$token = $user_id . ':' . my_reversable_function($user_id, $referer, $liked);
print_header;
print("$_GET['cb']($token);");

}

uncle17

он корёжется уже сразу в document.href, или когда ты его запихиваешь в параметры?
it depends
кто как. Зависит еще и от доменно/кроссдоменно. Мы уже все две головы сломали на этой неделе. Сначала куку кроссдоменно вытаскивали, теперь вот реферера надо кроссбраузерно вытащить, я уже боюсь думать, что придется делать, когда нам надо будет универсальный ответ получать, учитывая нашу не-UTF-ность :)

Bibi

короче, не те задачи решаете, ага

uncle17

универсальный код понятен, слава богу
Вот лишь бы $ENV{HTTP_REFERER} оставался всегда одинаковым. А он в разных браузерах разный. Как они понимают друг друга - ниибу.
Ладно, спасибо, ребят, у нас завтра копропротив еще, так что нерабочий день, а просыпаться с утра надо - в Можайск ехать. Но своему напарнику я эти треды покажу - может, в понедельник что и сдюжим. В любом случае много идей подкинули, разберем.

Bibi

вообще, мой пример плох — часто реферер режется проксями и надо бы его явно передавать в запросе. вы правы.

stm7884696

а почему никто не смотрит, как сделано у гугла или того же фейсбука? Там ведь сразу есть js код который нужен. А серверную часть доделать уже не так сложно.
Оставить комментарий
Имя или ник:
Комментарий: