Свой сервис коротких ссылок

Главные вкладки

Аватар пользователя Andruxa Andruxa 12 августа 2012 в 3:50

Потребовалось сделать сервис коротких ссылок на своём домене
да, в дополнение к тем 100500, которые уже есть в сети
не спрашивайте, зачем.

Нужно, чтобы при создании контента на сайте, происходил кросспост в разные фейсбуки и при этом в нем сразу указывалась короткая ссылка на алиас, по которому расположен этот контент, т.е.
создается нода www.site.com/node/100500, при её сохранении pathauto генерит ей алиас www.site.com/контент/чпу-ноды, содержимое публикуется в нужной соцсети и в кросспосте указывается короткая ссылка вида si.te/hhVHV, по которой происходит редирект 301 на www.site.com/контент/чпу-ноды (а не на системный путь www.site.com/node/100500)

Вроде недостатка в скриптах таких сервисов нет, но хотелось бы обойтись без http запросов к своему же серверу, думаю что можно сделать так:

Оба сайта: с контентом - www.site.com и короткий - si.te, поднять на мультисайтинге с одной БД, с разными префиксами таблиц, к примеру - main_ и short_
редиректить можно с помощью одноименного модуля Redirect, сразу стоит обратить внимание, что адрес-источник (короткий) указывается без имени домена

соответственно, в настройках префиксов таблиц для каждого сайта указать общий префикс для таблицы redirect, к примеру - share_

таблица эта имеет следующие поля:
rid Primary Key: Unique redirect ID.
hash A unique hash based on source, source_options, and language.
type The redirect type; if value is ’redirect’ it is a normal redirect handled by the module.
uid The shared_users.uid of the user who created the redirect.
source The source path to redirect from.
source_options A serialized array of source options.
redirect The destination path to redirect to.
redirect_options A serialized array of redirect options.
language The language this redirect is for; if blank, the alias will be used for unknown languages.
status_code The HTTP status code to use for the redirect.
count The number of times the redirect has been used.
access The timestamp of when the redirect was last accessed.

Т.е. на сайте с контентом нужно добавлять записи в таблицу share_redirect при создании контента, а на сайте с коротким именем на основании этих записей будет происходить переадресация.

Внимание, вопросы:
1. Не встречал ли кто-нибудь что-то готовое на эту тему?
2. Смущает отсутствие доменного имени у короткой ссылки, из-за этого не хочется держать модуль Redirect включенным на сайте с контентом, т.к. там будет работать неправильный редирект с www.site.com/hhVHV на www.site.com/контент/чпу-ноды, это вроде как несмертельно, но не хочется.
3. В любом случае, потребуется генератор коротких ссылок - видимо, выдрать из имеющихся модулей
4. По причине п.2 - понадобится свой код для записи в таблицу, смущает поле hash: каким образом оно создается, и в каких ещё таблицах присутствует. Надо покурить redirect.module
5. Проблемы взаимосвязи таблицы share_redirect с другими таблицами сайтов - это, в первую очередь хэш из п.4 и индексы с ключом rid

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

Комментарии

Аватар пользователя kyky kyky 12 августа 2012 в 5:45

В гугле по запросу "php url shortener" выдается сразу 4-5 примеров сокрощалок.

Все же спрошу, зачем свой велосипед? Потренироваться полезно, но беда в том, что если ваш сервис отвалится, то все ссылки умрут. Используйте goo.gl или bit.ly, оба сервиса предоставляют статистику и отчетность по кликам. И API у них удобные. Сам пользуюсь goo.gl, писал класс под их API.

Еще нужен будет какой-то короткий домен, типа si.te, потому что если у вас домен mysiteexample.com, то ссылка http://mysiteexample.com/A1ld2, будет не такой уж короткой. А купить такой домен очень трудно, отчасти потому, что приставка на конце относится к какой-нибудь зоне стран Третьего мира, где домен так просто не купишь. Пишу, потому что интересовался этой темой. Купить домен типа bit.ly или pep.si неебически трудно.

Аватар пользователя kyky kyky 12 августа 2012 в 5:52

Дополню: самая легкая с использовании сокращалка: это http://tinyurl.com/
Никаких ключей и авторизаций, просто посылаем запрос:

Получаем: http://tinyurl.com/2gmqw

ВСЁ!!!

Аватар пользователя kyky kyky 12 августа 2012 в 6:00

Еще дополнение: для кросспоста в Твиттер и Фейсбук есть сервис twitterfeed, который сам укорачивает ссылки. Он берет инфу из RSS-ленты. Если нужна нестандартная лента, то ее можно сделать через views.

Аватар пользователя Andruxa Andruxa 12 августа 2012 в 12:21

kyky, спасибо за живой интерес к моему вопросу

"kyky" wrote:
беда в том, что если ваш сервис отвалится, то все ссылки умрут

как раз поэтому хочется мультисайтнг - общая база, общий движок, т.е. случись что - по всем законам физики, сайты (с контентом + короткий) будут падать одновременно и с одинаковым ускорением
"kyky" wrote:
А купить такой домен очень трудно, отчасти потому, что приставка на конце относится к какой-нибудь зоне стран Третьего мира, где домен так просто не купишь.

ну, если вы про .ru - то несложно:)

на самом деле, двухсимвольных зон навалом, проблема скорее в том, двухсимвольные имена доменов допустимы далеко не во всех, да и заняты они все вместе с трёхсимвольными.

Но, в данном случае, домены уже куплены: под контент в .com, короткий - четырёхсимвольный в .co, дорогой зараза.

Аватар пользователя Andruxa Andruxa 13 августа 2012 в 1:41

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

имеет смысл курить к нему маны?

Аватар пользователя kyky kyky 13 августа 2012 в 2:09

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

Аватар пользователя Anonym_tsk Anonym_tsk 13 августа 2012 в 6:35

Что-то вы перемудрили. Сделайте простой модуль, который будет по si.te/[nid] отдавать нужную ноду, да и всё. si.te и site.ru настройте на один сайт.

Аватар пользователя Andruxa Andruxa 25 августа 2012 в 12:40

"cunard" wrote:
drupal.org/project/shurly

таки да, разобрался с ним - делает именно то, что нужно

можно обращаться к shurly_service по адресу /shurly/api/shorten и генерить короткие ссылки, подробности в readme
но - столкнулся с такой неприятной особенностью: существует отдельное разрешение для ролей на создание ссылок, и есть возможность сгенерить определенному юзеру ключ, передаваемый в запросе, по которому он будет идентифицирован сервисом, видимо - чтобы определить, можно ли юзеру генерить ссылки или нет

так вот, оно не работает (с), вернее - работает неправильно

всё дело в том, что в hook_menu модуля проверяется разрешение на генерацию ссылок ещё до того, как будет получен ключ:

function shurly_service_menu() {
  $items = array();
  $items['shurly/api/shorten'] = array(
    'file'             => 'shurly_service.inc',
    'page callback'    => 'shurly_service_shorten',
    'access arguments' => array('Create short URLs'),
    'type'             => MENU_CALLBACK,
  );
}

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

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

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

На длинном сайте использовал надстройку над shurly в виде своего модуля, в котором реализовал hook_path_insert, hook_path_update и hook_path_delete
Весь гешефт в hook_path_update - если меняется алиас, а такое иногда случается, то в короткой ссылке указывается новый редирект, и она не становится битой.

Также, с помощью hook_block_view вызывается блок ShareThis, которому вместо длинной ссылки подсовывается короткая - с Вконтактом и ЖЖ всё ок, для твиттера и фейсбука оно всё равно прогоняет ссылки через свой сокращатель (не помню, какой).
Значит, ShareThis ждет лоботомия.

Поскольку таблицы shurly общие, то короткие ссылки с редиректами, сгенерённые на длинном сайте становятся доступными короткому, который с чистой совестью редиректит.

Ну и осталось написать токены.

Аватар пользователя kyky kyky 25 августа 2012 в 14:40

"Anonym_tsk" wrote:
Сделайте простой модуль, который будет по si.te/[nid] отдавать нужную ноду

Палка о двух концах. Пока нод мало, ссылки будут короткие, а когда перевалит за 9999, то уже 5 знаков на ноду. Хеш будет однозначно короче.

Аватар пользователя Anonym_tsk Anonym_tsk 25 августа 2012 в 16:33

"kyky" wrote:
Палка о двух концах. Пока нод мало, ссылки будут короткие, а когда перевалит за 9999, то уже 5 знаков на ноду. Хеш будет однозначно короче.

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

Аватар пользователя kyky kyky 25 августа 2012 в 16:50

Да. Значность такой системы исчисления равна 26 англ. букв в нижнем регистре + 26 в верхнем + 10 цифр - 62 символа. Переводить id ноды из десятичной системы в 62-значную и обратно.

Аватар пользователя Andruxa Andruxa 25 августа 2012 в 17:01

дело в том, что ссылки нужны не только на страницы ноды

"Andruxa" wrote:
www.site.com/контент/чпу-ноды

предполагается, что весь фронт будет иметь адреса-алиасы на русском, и ссылки на любую страницу станут кодироваться в 16-ричный юникод, например, вышеприведенная ссылка будет иметь вид
www.site.cоm/%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D1%82/%D1%87%D0%BF%D1%83-%D0%BD%D0%BE%D0%B4%D1%8B

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

Аватар пользователя Andruxa Andruxa 25 августа 2012 в 17:07

"kyky" wrote:
62 символа

рекомендуется исключать похожие символы O,0,I,l и т.п. - их там остается 56-57 валидных

за это время серьёзно углубился в физику процесса, перепробовал штук 5 разных скриптов для подобного рода сервисов )

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

Аватар пользователя Andruxa Andruxa 27 августа 2012 в 15:12

"Andruxa" wrote:
ShareThis ждет лоботомия

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