Заработал геотаргетинг

Новости нашей системы, а также ваши комментарии, замечания и пожелания...
Ответить
Аватара пользователя
vitocool2
Эксперт
Эксперт
Сообщения: 235
Зарегистрирован: 02 янв 2007, 00:51
Откуда: Пятигорск
Контактная информация:

Сообщение vitocool2 » 11 дек 2008, 16:37

В общем решение найдено:

Код: Выделить всё

<?
$geoIP="88.215.136.0/23";   

$ip=explode("/",$geoIP);
$mask=0xFFFFFFFF;
for ($j=0;$j<32-$ip[1];$j++) $mask=$mask<<1;
$lip=ip2long($ip[0]);    

$ip_start=$lip&$mask;
$ip_end=($lip&$mask)+(~$mask);

echo $ip_start." - ".$ip_end;
// выдаст 1490520064 - 1490520575
?>


Таким образом диапозоны IP есть, коды насёлённых пунктов есть. Реализация задачи - как два пальца об асфальт )))
Последний раз редактировалось vitocool2 11 дек 2008, 16:49, всего редактировалось 1 раз.

Евгений
Эксперт
Эксперт
Сообщения: 276
Зарегистрирован: 20 июл 2005, 08:27
Контактная информация:

Сообщение Евгений » 11 дек 2008, 16:48

Или так, кому как больше нравится, результаты одинаковые:

Код: Выделить всё

<?php
$geoIP="88.215.136.0/23";

list($firstip, $mask) = explode("/", $geoIP);
$firstip = sprintf("%u\n", ip2long($firstip));
$lastip = $firstip + pow(2, (32-$mask)) - 1;

print long2ip($firstip)." - ".long2ip($lastip);
?>


Для корректного вычисления

Код: Выделить всё

$firstip = ip2long($firstip);

заменен на

Код: Выделить всё

$firstip = sprintf("%u\n", ip2long($firstip));


Связано с тем, что , цитирую: Since PHP uses signed ints you got a negative number on X86 where signed ints are limited to 2147483647 and your result is >3 billion.

Теперь можно систематизировать эту информацию - как распарсить geo-nginx.map и получить id региона, и в хелп, задача ведь стандартная.
Последний раз редактировалось Евгений 14 дек 2008, 21:21, всего редактировалось 1 раз.

Atomic
Сообщения: 104
Зарегистрирован: 23 ноя 2006, 20:22

Сообщение Atomic » 11 дек 2008, 21:14

Код: Выделить всё

// geoip
function geoip($IP) {
if (preg_match_all("!^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$!si", $IP, $match)) {
$bits['a']=implode($match[1]);
$bits['b']=implode($match[2]);
$bits['c']=implode($match[3]);
$bits['d']=implode($match[4]);
} else return 0;
$error = 0;
if (!($bits['a'] >= '0' and $bits['a'] <= '255')){$error=1;}
if (!($bits['b'] >= '0' and $bits['b'] <= '255')){$error=1;}
if (!($bits['c'] >= '0' and $bits['c'] <= '255')){$error=1;}
if (!($bits['d'] >= '0' and $bits['d'] <= '255')){$error=1;}
if ($error == 0) {
$ADDRESS = $bits['a']*256*256*256+$bits['b']*256*256+$bits['c']*256+$bits['d'];
$master_file='cidr_ru_master_index.db';
$master_record=file($_SERVER['DOCUMENT_ROOT']."/lib/geoip/".$master_file);
$master_index=0;
foreach($master_record as $key=>$master_new_record) {
//$new_record=trim($new_record);
list($start,$stop,$inetnum,$country,$city,$region,$district,$status,$slave,$n_slave) = preg_split('!\t!', $master_new_record);
$master[$master_index] =array("start" => $start,"stop" => $stop,"inetnum" => $inetnum,"country" => $country,"city"=>$city,"region"=>$region,"district"=>$district,"status" => $status,"slave" => $slave,"n_slave" => $n_slave);$master_index++;
}
foreach($master as $key=>$new_master) {
if ($ADDRESS>=$new_master['start'] && $ADDRESS<=$new_master['stop']) $NEW_ADDRESS_0=$new_master;
}
if (!empty($NEW_ADDRESS_0)){
$slave_file='cidr_ru_slave_index.db';
$slave_record=file($_SERVER['DOCUMENT_ROOT']."/lib/geoip/".$slave_file);
$slave_index=0;
$min=$NEW_ADDRESS_0['slave'];
$max=$min+$NEW_ADDRESS_0['n_slave'];
while($min<$max){
$slave_record[$min]=trim($slave_record[$min]);
@list($start,$stop,$inetnum,$country,$city,$region,$district,$status,$rest) = preg_split('!\t!', $slave_record[$min]);
$_slave[$slave_index]=array("start" => $start,"stop" => $stop,"inetnum" => $inetnum,"country" => $country,"city"=>$city,"region"=>$region,"district"=>$district,"status"=>$status);$slave_index++;$min++;}
foreach($_slave as $key=>$new_slave) {
if ($ADDRESS>=$new_slave['start'] && $ADDRESS<=$new_slave['stop']) $NEW_ADDRESS_1=$new_slave;
}

if (!empty($NEW_ADDRESS_1)) return $NEW_ADDRESS_1; else return $NEW_ADDRESS_0;
}
return 0;
}
 return 0;
}


вот такое работает, где
$master_file='cidr_ru_master_index.db';
$slave_file='cidr_ru_slave_index.db';

cidr_ru_master_index.db, cidr_ru_slave_index.db - базы диапазонов

на выходе, например, массив с страной Ru , регионом Москва итд
базы диапазонов хотел бы прикрепить но нет возможности..

Меня что коробит, вот представьте такую ситуацию, яндекс индексирует страничку, соответсвенно своим алгоритмам выдает в поиске результат по запросу, заинтересованный человечек переходит и что он видит? Где информация которую он ожидал увидеть? Он и слыхом не слыховал о геотаргетинге и ему наплевать на наши с вами заморочки. Закрывает сайт. И о каком повышении кач-ва площадки вы говорите?
Что-то данный геотаргетинг мне напоминает схему из черного сео,когда в зависимости от нужд поиску выдается одна информация ...юзерам другая...
Для начала я хотел бы увидеть возможность выставления заглушки средствами самой системы в случае если ип реферера не соотв геотаргетину, а не перекладывать все на партнеров. По остальному партнеры сами со временем решат, что им выгодней, удобней и тп.

Аватара пользователя
ivanov
Эксперт
Эксперт
Сообщения: 2192
Зарегистрирован: 20 фев 2006, 19:02
Откуда: Санкт-Петербург
Контактная информация:

Сообщение ivanov » 11 дек 2008, 21:26

Atomic писал(а):заинтересованный человечек переходит и что он видит?

Видит он надпись типа «сорри, для вашего региона нет подходящих предложений; если интересно, можете посмотреть предложения для Москвы». Это например.

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

Atomic писал(а):выставления заглушки средствами самой системы

Это как? Писать «сорри, это предложение не для тебя, вернись обратно»? Как мы это делаем, когда товар устарел?
Денис Иванов, экс-Миксмаркет
upyrj@ya.ru

Евгений
Эксперт
Эксперт
Сообщения: 276
Зарегистрирован: 20 июл 2005, 08:27
Контактная информация:

Сообщение Евгений » 11 дек 2008, 21:29

Atomic, сдается мне, этот код будет тормозить и нагружать сервер. cidr_ru_slave_index.db весит 11 мб. Каждый раз перечитывать файлы не рационально. Или я что-то недопонял? :?

Может для обсуждения реализации алгоритма отдельную ветку в форуме создать?

ilyaska
Сотрудник Миксмаркета
Сотрудник Миксмаркета
Сообщения: 79
Зарегистрирован: 22 янв 2007, 17:01

Сообщение ilyaska » 11 дек 2008, 21:40

cidr_ru_master_index.db, cidr_ru_slave_index.db - базы диапазонов

на выходе, например, массив с страной Ru , регионом Москва итд


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

Atomic
Сообщения: 104
Зарегистрирован: 23 ноя 2006, 20:22

Сообщение Atomic » 11 дек 2008, 21:47

Видит он надпись типа «сорри, для вашего региона нет подходящих предложений; если интересно, можете посмотреть предложения для Москвы». Это например.

...кликает, загружается страница, а там таких надписей, как грязи и нет информации. (если реклам понравится такой "таргетинг" и он пойдет в массы).
Это как? Писать «сорри, это предложение не для тебя, вернись обратно»? Как мы это делаем, когда товар устарел?

Все лучше, чем "халявные" переходы.

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

Ссыль на первоисточник в студию, будьте любезны.
Евгений при великой посещаемости можно запустить через базы, распарсив это добро, но думаю нагрузка, так или иначе, будет не маленькая. (Широка страна моя родная ;))

Евгений
Эксперт
Эксперт
Сообщения: 276
Зарегистрирован: 20 июл 2005, 08:27
Контактная информация:

Сообщение Евгений » 11 дек 2008, 21:49

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

В хелпе они указаны как дополнительные источники, правильнее будет использовать http://mixmarket.biz/geo-full.xml и http://mixmarket.biz/geo-nginx.map.gz, на их основе уже что-то строить.

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

Нагружать будет по-любому, но если через базу, то нагрузка существенно снизится, главное не забыть создать индексы на соответствующих полях таблицы.
Кстати, в geo-nginx.map сейчас 261182 строки, столько же будет и в таблице. Ерунда какая.
Последний раз редактировалось Евгений 11 дек 2008, 22:03, всего редактировалось 1 раз.

ilyaska
Сотрудник Миксмаркета
Сотрудник Миксмаркета
Сообщения: 79
Зарегистрирован: 22 янв 2007, 17:01

Сообщение ilyaska » 11 дек 2008, 21:56

в хелпе они указаны как дополнительные источники, правильнее будет использовать http://mixmarket.biz/geo-full.xml и http://mixmarket.biz/geo-nginx.map.gz, на их основе уже что-то строить


Верно!

Ну и повторюсь, при использовании nginx вы убьете двух зайцев.

1. Строить ничего не придется, все уже готово, только обновляй базу раз в месяц

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

Евгений
Эксперт
Эксперт
Сообщения: 276
Зарегистрирован: 20 июл 2005, 08:27
Контактная информация:

Сообщение Евгений » 11 дек 2008, 22:00

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

как установить nginx в качестве фронтэнд:
http://blog.kovyrin.net/2006/05/18/ngin ... y/lang/ru/
http://server-help.ru/?p=14

А в этой динамике появится переменная (допустим $_SERVER['HTTP_X_GEO']), которую устанавливает nginx в своем конфиге?
Последний раз редактировалось Евгений 11 дек 2008, 22:25, всего редактировалось 2 раза.

ilyaska
Сотрудник Миксмаркета
Сотрудник Миксмаркета
Сообщения: 79
Зарегистрирован: 22 янв 2007, 17:01

Сообщение ilyaska » 11 дек 2008, 22:04

в этой динамике появится переменная (допустим $_SERVER['HTTP_X_GEO']), которую устанавливает nginx в своем конфиге?


Естественно, апач видит эту переменную окружения, иначе зачем бы это все нужно было :lol:

Atomic
Сообщения: 104
Зарегистрирован: 23 ноя 2006, 20:22

Сообщение Atomic » 11 дек 2008, 22:05

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

Аватара пользователя
ivanov
Эксперт
Эксперт
Сообщения: 2192
Зарегистрирован: 20 фев 2006, 19:02
Откуда: Санкт-Петербург
Контактная информация:

Сообщение ivanov » 11 дек 2008, 22:34

Atomic писал(а):Ссыль на первоисточник в студию, будьте любезны.

Эмм... От Садовского это я лично слышал, кажется, на конференции. Про Гуглю — не помню источника.
Кстати, есть еще такой вариант: «неправильным» посетителям можно показывать все то же самое, но не давать ссылок. Просто писать «не доставляется в %user_region%».
Atomic писал(а):Евгений можно проверять скриптом на этапе клика...раз админы ставить заглушку не хотят, поставим сами ))) но опять же там проблемы с реферами могут начаться...проходили, знаем.

При обычном серверном редиректе (ответ 301 или 302) никаких проблем с реферами не бывает.
Денис Иванов, экс-Миксмаркет
upyrj@ya.ru

Евгений
Эксперт
Эксперт
Сообщения: 276
Зарегистрирован: 20 июл 2005, 08:27
Контактная информация:

Сообщение Евгений » 11 дек 2008, 22:34

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


В смысле отсекать неугодных рекламодателей? Да ну, посетители сайта ни в чем же не виноваты, зачем над ними так издеваться.
Офф
Вот эта хрень мне всегда не нравилась:
ivanov писал(а):... «сорри, это предложение не для тебя, вернись обратно»? Как мы это делаем, когда товар устарел?

уж лучше бы отправляли на главную страницу магазина.
Правда лечится регулярным обновлением прайса.

Евгений
Эксперт
Эксперт
Сообщения: 276
Зарегистрирован: 20 июл 2005, 08:27
Контактная информация:

Сообщение Евгений » 11 дек 2008, 22:43

ivanov писал(а):такой вариант: «неправильным» посетителям можно показывать все то же самое, но не давать ссылок. Просто писать «не доставляется в %user_region%».

Ага, и вместо ссылки "не ссылка". Тупо покликали, а она не кликается, плюнули и закрыли сайт :)

Ответить