Like-button для своего сайта(своих аккаунтов) [re:авторизация..]
удачи, да.
Мы сгодня полдня проебались со всеми возможными сочетаниями urlencode/urldecode/encodeURIComponent/escape/iconv и т.д.
ну конкретно про реферреры я хуй знает, просто помню как года два назад ебался с чем-то похожим - мне нихуя не понравилось.
ну похер, да, сама строка урла меня теперь беспокоит. Как ее вытаскивать - нехитрое дело. Но как ее отдать по цепочке скриптов через несколько серверов в правильном виде...
uudecode\uuencode?
Каждый браузер (из 5 обычно тестируемых) перед отправкой шифрует не-latin URL только ему известным способом. Привести всё к единообразию мы пока не сумели.
хм, но в рамках одного браузера шифрование-дешифрование должно ведь быть обратимым?
к этому мы к сегодняшнему вечеру и пришли: для каждого браузера строить свою транспортную систему... что, конечно, очень радует
не понял, какую систему. редиректы же браузером делаются
Каждый браузер (из 5 обычно тестируемых) перед отправкой шифрует не-latin URL только ему известным способом. Привести всё к единообразию мы пока не сумели.а просто url он другим способом кодирует?
В общем, на урле http://targetdomain/script.html?%F5%F3%E9=%F7%EB%E5%ED мы сегодня позабавились дай боже
Ради прикола мы попробовали скормить нашей "системе" адрес http://targetdomain/script.html?秋季&...
От результатов просто пошли покурить
если это вам для своей кнопки надо, может вообще с другой стороны подойти? по нажатию на кнопку брать location.href яваскриптом, кодировать известным вам способом в latin и переходить на mydomain.ru/redirect.html?from=codedurl и уже с него на то куда надо в реальности?
каждый браузер отдает location.href как ему хочется. Попробуй в разных браузерах набрать http://domain/file?%EA%E8%F0%E8%EB%EB%E8%F6%E0
domain/file?кириллица
ну хз, мне щас лень, просто я думаю для яваскрипта есть готовые решения для кросс-браузерного разбора текущего урла.
Любой
<div id="ourlikes"></div>
<script src="http://ourdomain.com/ourlikes_script.php"></script>
В итоге любому посетителю страницы этого человека отдается, зарегистрирован ли он у нас, залогинен ли он у нас, и, если залогинен, то он именно эту страницу (на которой код стоит) может "лайкнуть". Отметить, что она ему нравится. При этом на странице выдастся, что она нравится именно ему, а у него в профайле на нашем сайте отпишется, что она ему понравилась. Это тем, кто еще не понял ТЗ.
когда вас дергают, чтобы скачать код, вы уже получаете реферер.
в этот момент генерите токен = id пользователя + xor("$id:$referer" + secret который вы уже знаете
когда чувак будет кликать, вы получаете этот токен и корректно записываете данные, что этот чувак лайкает эту страницу. понятно, как это расширять на случай, если нужен анлайк
Чувак получает код для всего своего сайта (допустим, некий свой app_id, как в VK/FB ставит его на все страницы сразу. А в мыслях - не для всего сайта, а для группы сайтов.
На каком конкретно урле его домена (и какого именно) будет стоять код - непонятно.
Так что $referer всегда будет разным. Даже если встраивать его в JS-код автоматом, свой location.href он может отдавать другой, еще не существующий в нашей базе
я наверное, плохо написал. чувак ставит кусочек хтмл-кода, который при загрузке страницы подгружает саму инфу, лайкалась ли эта страница уже, и кнопочку с токеном(либо только токен для кнопочки, которая уже есть в хтмл-коде).
Но токен для каждой страницы связан с $referer. Мы ему (пользователю) с удовольствием его отдадим, если он пришлет $referer так, как он был записан изначально (ведь именно он же ключ для поиска по базе). Но проблема в том, что разными браузерами он будет прислан по-разному.
document.write('<sc'+'ript src="path_to_script.php?url='+location.href+'"></'+'script>');
но location.href будет разным, даже если человек зашел на одну и ту же страницу с разных браузеров.
почитай access.log
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.
Но токен для каждой страницы связан с $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>
какой-нибудь-encode(document.href);вооот
а document.href каждый отдает разный
чтобы не было путаницы, замечу, что darkgray какое-то свое решение рассказывает
судя по сокращениям, это Google Analytics
самый-правильный-encodeя тебя апиридил
Вот мы и пришли вечером к выводу, что надо под всех писать свой правильный енкодер, ага.
На гиков нам пофиг, 99.9% браузеров мы асилим, но поработать придется, конечно
а document.href каждый отдает разныйтак он корёжется уже сразу в document.href, или когда ты его запихиваешь в параметры?
<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);");
}
он корёжется уже сразу в document.href, или когда ты его запихиваешь в параметры?it depends
кто как. Зависит еще и от доменно/кроссдоменно. Мы уже все две головы сломали на этой неделе. Сначала куку кроссдоменно вытаскивали, теперь вот реферера надо кроссбраузерно вытащить, я уже боюсь думать, что придется делать, когда нам надо будет универсальный ответ получать, учитывая нашу не-UTF-ность
короче, не те задачи решаете, ага
Вот лишь бы $ENV{HTTP_REFERER} оставался всегда одинаковым. А он в разных браузерах разный. Как они понимают друг друга - ниибу.
Ладно, спасибо, ребят, у нас завтра копропротив еще, так что нерабочий день, а просыпаться с утра надо - в Можайск ехать. Но своему напарнику я эти треды покажу - может, в понедельник что и сдюжим. В любом случае много идей подкинули, разберем.
вообще, мой пример плох — часто реферер режется проксями и надо бы его явно передавать в запросе. вы правы.
а почему никто не смотрит, как сделано у гугла или того же фейсбука? Там ведь сразу есть js код который нужен. А серверную часть доделать уже не так сложно.
Оставить комментарий
uncle17
отпишись тогда про чужую куку.Мы ее, правда, сегодня победили-таки, но совсем другим способом. Теперь другая проблема встала - кириллический referer кроссбраузерно определять