Pull to refresh

Сокращаем произвольные ссылки сервисом G.CO

Reading time 2 min
Views 7.3K


Google, недавно запустил сервис для сокращения ссылок — G.CO. Предназначен сервис для внутренних служб Google, на данный момент его поддерживает только Google Maps. Там возможно сократить длинный адрес карты. У меня сразу появилось желание поиграться с этой штукой, а точнее сократить внешний URL. О том, как мне это удалось Вы можете почитать в этой статье.



Ловим запрос


Первое, что мне пришло в голову — поймать HTTP запрос к серверу и подменить значение длинного адреса. Для этого я использовал HTTP сниффер. Google шлет вот такой POST запрос для сокращения ссылки:
http://maps.google.ru/maps/urlshortener?q=http:%2F%2Fmaps.google.ru%2F%3Fll%3D55.354135,40.297852%26spn%3D28.518959,86.572266%26z%3D4%26vpsrc%3D0&abauth={уникальное значение}&authuser=0

И от сервера приходит подобный ответ:
{short_url:"http://g.co/maps/a9qd", status_code:0}

К сожалению, если подменить значение q на произвольное, Google не будет сокращать ссылку, а будет возвращать ссылку, которую мы ему отправили, например:
{short_url:"http://habr.ru/", status_code:0}

Так не пойдет. Давайте думать дальше…

Ищем редирект


Вторая идея — найти редирект с maps.google.com на внешний сайт и попробовать сократить такую ссылку. К сожалению, единственный редирект, который я нашел — maps.google.ru/url?q=http://yandex.ru, очевидно, редирект с предупреждением нам не подходит, поэтому будем искать другое решение. Кстати, если адрес редиректа — *.google.com/*, тогда перенаправление работает без всякого предупреждения. Что ж, возьмем это на заметку ;)

Сайты Google


Ещё одна мысль — попробовать запихнуть код редиректа в сайт, созданный через этот сервис. Итак, понятно, что произвольный javascript Google туда вставить не даст, поэтому в панели редактирования страниц нужно выбрать «Добавить дополнительные гаджеты» и в окне выбора гаджетов найти redirect, в настройках выбрать URL, на который гаджет будет перенаправлять и задержку поставить в 0.

И тут я подумал, ведь гаджет находится внутри iframe, то значит, что он работает примерно так:
top.location.href = "http://someurl.com/";


Да, а это значит, что он перенаправит родительское окно!

Теперь нам осталось найти iframe с динамическим URL на сервисе Google Maps.

Ищем iframe на Google Maps


Как я и предполагал, долго искать не пришлось. Iframe нашелся тут:

Вот его адрес.
Очевидно, что тут нужно просто подменить параметр url, но вот опять проблема — url, который открывается внутри iframe может быть только на домене maps.google.com. А вот тут мы и используем наш редирект! У нас получится вот такой адрес:
http://maps.google.ru/maps/empw?url=http://maps.google.com/url?q=https://sites.google.com/site/{yoursite}


В двух словах, что тут происходит:
По адресу maps.google.ru/maps/empw открывается iframe, у которого фильтруется src (разрешено только для домена maps.google.com), мы обходим этот фильтр через редирект maps.google.com/url. А maps.google.com/url перенаправляет адрес айфрема на наш сайт гугл. На сайте гугл, в свою очередь, расположен гаджет редиректа родительского окна браузера.

Пробуем сократить этот адрес, шлем запрос
http://maps.google.ru/maps/urlshortener?q=http://maps.google.ru/maps/empw?url=http://maps.google.com/url?q=https://sites.google.com/site/{yoursite}&abauth={уникальное значение}&authuser=0

Все работает! Отлично.

Живой пример.
Tags:
Hubs:
+86
Comments 51
Comments Comments 51

Articles