Пишем сервис для сокращения ссылок на Django, DRF / Хабр
Привет, меня зовут Денис. Это моя первая статья на habr. Не знаю, что из этого получится, но думаю, если все будет совсем плохо, модераторы позаботятся о том, чтобы ее никто не увидел.
Итак, на днях я получил тестовое задание от потенциального работодателя и решил убить двух зайцев сразу: выполнить тестовое задание и написать статью, в которой подробно описать весь процесс.
Задание
Итак, что мы имеем:
Ваша задачa — Реализовать сервис для сокращения ссылок
Требования к сервису:
– Страница с полем для ввода ссылки и кнопкой или API для генерации
– Страница со статистикой переходов по коротким ссылкам
– Переход по сокращенной ссылке перенаправляет на оригинальный URL
– Токен короткой ссылки должен быть длиной 6 символов и состоять из букв (разного регистра) и цифр
– Реализация на Django или Django Rest Framework
– Ссылка на гит-репозиторий с кодом сервиса
То есть грубо говоря нам необходимо создать сервис, который будет принимать url, например “https://habr. com/ru/company/southbridge/blog/714358/”, генерировать и возвращать пользователю уникальную короткую ссылку (из 6 цифр и букв разного регистра), например “tR5Gq0”. И при обращении по короткому url (в нашем случае https://my_domain.ru/tR5Gq0) браузер будет перенаправлять нас на https://habr.com/ru/company/southbridge/blog/714358/.
Я выбрал вариант с написание API, так как он мне значительно ближе.
Для начала опишу предполагаемую механику работы приложения. Условно, весь функционал можно разделить на две части:
Генерация короткой ссылки:
Получить post запрос с url адресом, который необходимо сократить (‘full_url’).
Сгенерировать уникальную короткую ссылка и создать запись в базе данных.
Вернуть короткую ссылку(со всеми необходимыми данными) пользователю.
Редирект по короткой ссылке на необходимый url.
Теперь давайте определимся с терминологией. Я не стал заморачиваться и для себя решил, что пара (‘full_url’ → ‘short_url’)
будет называться токеном.
Погнали!
Предварительная подготовка
Я начинаю любой проект с создания репозитория в Git
Создаем репозиторий, клонируем его на локальный компьютер.
git clone https://github.com/<user_name>/<rep_name>
Открываем рабочую папку.
Создаем и активируем виртуальное окружение:
python -m venv venv
source venv/bin/activate
Устанавливаем Django в виртуальное окружение (я поставил версию 3.2, хотя в нашем случае подошла бы наверное почти любая)
pip install Django==3.2
Рекомендую после установки каждого пакета обновлять файл requirements.txt:
pip freeze > requirements.txt
Создаем новый Django-проект:
django-admin startproject link_shortner
Для проверки можем попробовать запустить проект на локальном сервере, выполнив из рабочей папки команду:
python manage.
На экране появится что-то типа:
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run ‘python manage.py migrate’ to apply them.
March 05, 2021 — 04:27:33
Django version 2.2.19, using settings ‘link_shortner.settings’
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Если открыть в брайзере http://127.0.0.1:8000 то увидите примерно такую картинку:
Так и должно быть, мы убедились что все ок, и идем дальше.
Внутри проекта создаем приложение API:
python3 manage.py startapp api
Регистрируем приложение в файле настроек settings.py:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django. contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'api' # дописываем в список наше приложение ]
Готово! Все приготовления выполнены! Теперь можно непосредственно переходить к созданию приложения.
Описание ORM модели
Создадим ORM модель данных для хранения наших токенов.
link_shorter/api/models.py
и заполняем его следующим образом:import random # импортируем модуль random для генерации короткой ссылки from django.conf import settings # подтягиваем значение констант из фала настроек from django.db import models class Tokens(models.Model): """Модель для хранения токенов""" full_url = models.URLField(unique=True) short_url = models.CharField( max_length=20, unique=True, db_index=True, blank=True ) requests_count = models.IntegerField(default=0) created_date = models.DateTimeField(auto_now_add=True) is_active = models.BooleanField(default=True) class Meta: ordering = ('-created_date',) # сортировка по дате создания токена def save(self, *args, **kwargs): """ При создании токена достаточно только полной ссылки, короткая ссылка генерируется автоматически. Перед сохранением объекта токен проверяется на уникальность """ if not self.short_url: while True: # цикл будет повторять до тех пор пока не сгенерирует уникальную ссылку self.short_url = ''.join( random.choices( settings.CHARACTERS, # алфавит для генерации короткой ссылки мы будем хранить в файле настроек k=settings.TOKEN_LENGTH # длину короткой ссылки тоже ) ) if not Tokens.objects.filter( # проверка на уникальность short_url=self.short_url ).exists(): break super().save(*args, **kwargs) def __str__(self) -> str: return f'{self. short_url} -> {self.full_url}'
Разберем детально некоторые строки:
full_urlfull_url — полная ссылка. Указываем URLField чтобы при отправки чего-то иного запрос не проходил валидацию.
short_urlmax_length=20, # максимальная длина 20 символов. Таких ограничений в ТЗ не было, но я подумал что вряд ли нам понадобиться длина больше 20 символов. Исходя из того, что даже в наших условиях(6 цифр или букв разного регистра) мы можем хранить 56 800 235 584 url-ов в нашей базе.
unique=True, # тут все понятно, короткий url должен быть уникальным
db_index=True, # этот параметр позволяет реализовать ускоренный поиск по уникальному полю в данном случае полю short_url
blank=True # поле short_url может быть пустым, так как мы уже говорили о том что предполагается, что наш сервис будет сам генерить короткие ссылки.
requests_countrequests_count – счетчик обращений к конкретной короткой ссылке
created_datecreated_date — автозаполняемая дата создания токена. Необходимости в ней тоже не было, но мы не знаем как дальше решим масштабировать наш проект и в случае если мы решим ограничить жизненный цикл ссылки каким-то определенным временем, нам будет необходимо знать дату создания токена.
is_active – является ли токен активным или нет. Принимает значения True или False.
Далее рассмотрим метод save.
def save(self, *args, **kwargs): """ При создании токена достаточно только полной ссылки, короткая ссылка генерируется автоматически. Перед сохранением объекта токен проверяется на уникальность """ if not self.short_url: while True: # цикл будет повторять до тех пор пока не сгенерирует уникальную ссылку self.short_url = ''.join( random.choices( settings.CHARACTERS, # алфавит для генерации короткой ссылки мы будем хранить в файле настроек k=settings.TOKEN_LENGTH # длину короткой ссылки тоже ) ) if not Tokens.objects.filter( # проверка на уникальность short_url=self.short_url ).exists(): break super().save(*args, **kwargs)
Он обеспечивает генерацию короткой ссылки, в случае если пользователь самостоятельно не указал ее в теле запроса.
С моделью вроде закончили. Осталось добавить константы в файл settings.py. Открываем файл settings.py и дописываем где-нибудь внизу:
# Параметры Токена(короткой ссылки) CHARACTERS = 'ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz234567890' TOKEN_LENGTH = 6
Сохранили. Готово.
Настройки админки
Настроим панель администратора. По умолчанию Django уже настроил обработку урла admin/
, нам остается только указать как мы хотим чтобы отображалась наша админка. Для этого открываем файл admin.py в папке api и вписываем туда следующий код:
from django.contrib import admin from .models import Tokens # импортируем модель Tokens @admin.register(Tokens) class TokenAdmin(admin.ModelAdmin): """Настройки админки для модели Токенов""" list_display = ( # указываем список отображаемых полей 'full_url', 'short_url', 'requests_count', 'created_date', 'is_active' ) search_fields = ('full_url', 'short_url') # поля по которым можно искать нужный токен ordering = ('-created_date',) # все токены отсортируем по дате создания так чтобы последние были сверху
Все пояснения я написал в комментариях к коду.
Осталось сделать миграции. Из папки с файлом manage.py выполняем команды:
python manage.py makemigrations
python manage.py migrate
Готово! БД создана, админка настроена. Для проверки можно создать суперпользователя, запустить приложение на локальном сервере и войти в админку:
Из папки с файлом manage. py выполняем команды:
python manage.py createsuperuser
Заполняем все необходимые данные (username, email, password)
Запускаем сервер:
python manage.py runserver
Открываем в браузере ссылку http://127.0.0.1:8000/admin/
Вуаля.
TTD (Test-Driven Development)
Теперь давайте перейдем к описанию непосредственной механики работы приложения, но как евангелист TTD (Test-Driven Development) предлагаю сначала описать в тестах, что же мы в итоге хотим получить от нашего приложения.
В папке API cоздаем файл tests.py со следующим содержанием:
from django.test import TestCase from rest_framework.test import APITestCase from .models import Tokens class TestAPI(APITestCase): """Тестируем POST запросы""" url = '/api/tokens/' def setUp(self) -> None: Tokens.objects.create( full_url='https://ya.ru/', short_url='aEdj01', ) def test_token_get(self): """Проверка получения уже существующего токена""" existing_data = { 'full_url': 'https://ya. ru/' } response_get = self.client.post(self.url, data=existing_data) result_get = response_get.json() self.assertEqual(response_get.status_code, 200) self.assertEqual(Tokens.objects.all().count(), 1) self.assertEqual(result_get['full_url'], 'https://ya.ru/') self.assertEqual(result_get['short_url'], 'aEdj01') self.assertIsInstance(result_get, dict) self.assertEqual(len(result_get), 6) def test_token_create(self): """ Проверка создания токена без явного указания короткой ссылки и с явным указанием короткой ссылки """ creation_data = { 'full_url': 'http://post.url.test.ru' } creation_full_data = { 'full_url': 'http://test.ru', 'short_url': 'Q2We34' } response_create = self.client.post(self.url, data=creation_data) result_create = response_create.json() response_create_with_short_url = self.client. post( self.url, data=creation_full_data ) result_create_with_short_url = response_create_with_short_url.json() self.assertEqual(response_create.status_code, 201) self.assertEqual(result_create['full_url'], 'http://post.url.test.ru') self.assertEqual(len(result_create['short_url']), 6) self.assertIsInstance(result_create, dict) self.assertEqual(Tokens.objects.all().count(), 3) self.assertEqual(len(result_create), 6) self.assertEqual( result_create_with_short_url['full_url'], 'http://test.ru', msg='Ошибка full_url' ) self.assertEqual( result_create_with_short_url['short_url'], 'Q2We34', msg='Ошибка short_url' ) class TestRedirection(TestCase): """Тестируем GET запросы""" active_url = '/aEdj01' deactive_url = '/q2Nb23' def setUp(self) -> None: Tokens.objects.create( full_url='https://ya. ru/', short_url='aEdj01', ) Tokens.objects.create( full_url='https://stackoverflow.com/', short_url='q2Nb23', is_active=False ) def test_redirection(self): """Тестируем переадресацию""" response = self.client.get(self.active_url) self.assertEqual(response.status_code, 302) self.assertEqual(response.url, 'https://ya.ru/') def test_response_counter(self): """Тестируем счетчик запросов токена""" self.assertEqual( Tokens.objects.get(short_url='aEdj01').requests_count, 0 ) self.client.get(self.active_url) self.assertEqual( Tokens.objects.get(short_url='aEdj01').requests_count, 1 ) self.assertEqual( Tokens.objects.get(short_url='q2Nb23').requests_count, 0 ) self.client.get(self.deactive_url) self.assertEqual( Tokens.objects.get(short_url='q2Nb23').requests_count, 0 ) def test_deactive_url(self): """Тестируем неактивные токены""" response = self. client.get(self.deactive_url) self.assertEqual(response.content, b'Token is no longer available')
В комментариях я постарался описать то, что тот или иной тест проверяет, поэтому детально останавливаться на этом не будем, все таки эта статья не про тестирование.
Итак, тесты готовы, пора бы написать то, что они должны проверять.
Как мы решили в самом начале, наше приложение будет принимать POST запрос формата:
{ “full_url”: “https://ya.ru” }
или
{ “full_url”: “https://ya.ru” “short_url”: “Q54gP2” }
А в ответ возвращать данные токена. Примерно такие:
{ "id": 34, "full_url": "https://ya.ru/", "short_url": "PQbOuy", "requests_count": 0, "created_date": "2023-02-03T09:26:16.421135Z", "is_active": true }
Сериализатор
Для того чтобы преобразовать данные из запроса в объекты Python, нам нужно написать сериализатор. Создаем в папке api файл serializers.py:
from rest_framework import serializers, status from . models import Tokens class TokenSerializer(serializers.ModelSerializer): """ Сериализатор для обработки запросов на создание токенов: В сериализаторе убрана валидация full_url, но она осталась на уровне модели. Это сделано для того чтобы is_valid пропускал данные и можно было сериализовать их при уже существующем токене. """ class Meta: model = Tokens fields = '__all__' extra_kwargs = {'full_url': {'validators': []}} def create(self, validated_data): """ Переопределенный метод create: возвращает существующий токен или создает новый и возвращает его. """ full_url = validated_data['full_url'] token, created = Tokens.objects.get_or_create(full_url=full_url) if created: status_code = status.HTTP_201_CREATED else: status_code = status.HTTP_200_OK return token, status_code
В комментариях я попытался описать все максимально подробно (все таки код писался для потенциального работодателя). Могу лишь в общих чертах описать что сериализатор мы наследуем от ModelSerializer, то есть нам почти ничего не придется писать самим все будет работать из коробки, от нас лишь требуется указать модель и поля для сериализации. Про отключение валидации я написал в комментариях к стерилизатору, но если что готов ответить на вопросы в комментариях.
View-класс
Итак, с сериализацией вроде разобрались теперь давайте напишем непосредственно функцию обработчик полученных данных. Открывает файл views.py:
from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from .serializers import TokenSerializer class TokenAPIView(APIView): """Вьюха для работы с токенами""" def post(self, request): serializer = TokenSerializer(data=request.data) if serializer.is_valid(raise_exception=True): token, status_code = serializer.create( validated_data=serializer.validated_data ) return Response(TokenSerializer(token). data, status=status_code) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Здесь мы описали View-класс наследованный от APIView. Так как по нашей логике эндпоинт api/tokens/ будет обрабатывать только POST запросы, опишем во view-классе метод post. Он принимает сериализованные данные и если они проходят валидацию, он вызывает описанный выше метод create (создает или достает токен из бд) и в ответе возвращает параметры созданного токена и http-статус ответа. Обработчик готов.
URLconf
Теперь нам надо описать маршруты в файлах urls.py.
В моем случае энпоинтом для создания токенов будет /api/tokens/ (вы разумеется можете придумать свою точку). То есть при правильном POST запросе на https://my_domain.ru/api/tokens/ будет создаваться токен с парой (‘full_url’ → ‘short_url’).
Давайте это опишем в коде. Все запросы изначально обрабатываются файлом urls.py находящемся в папке /link_shorter/link_shorter (там где лежит файл settings. py), поэтому начнем с него:
from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('api.urls')), ]
# запрос https://my_domain.ru/admin/ переадресует нас в админку
# все запросы начинающиеся с https://my_domain.ru/api/… будут перенаправлены в файл urls.py приложения api. Который мы тоже сейчас отредактируем.
Открываем или создаем файл urls.py в папке api:
from django.urls import path from .views import TokenAPIView app_name = 'api' urlpatterns = [ path('tokens/', TokenAPIView.as_view()), ]
Как я уже писал выше, все запросы начинающиеся с https://my_domain.ru/api/… будут перенаправлены сюда, следовательно эту часть пути нам указывать не нужно. Вызов метода as_view() возвращает нам функцию view(), которую Django будет вызывать при совпадении адреса с паттерном ‘tokens/’.
Таким образов path('tokens/', TokenAPIView.as_view())
указывает на то, что запросы на https://my_domain. ru/api/tokens
будет обрабатывать TokenAPIView который мы с вами уже написали.
Функционал создания токена готов, описать алгоритм переадресации, когда по уже созданной короткой ссылке пользователю необходимо перейти на реальный сайт.
То есть нам чтобы по запросу на короткий url (например: https://my_domain.ru/Th55Qw) наше приложение проверяла в базе наличие токена и в случае если все ок и такой токен есть, перенаправляла пользователя на соответствующий полный url.
Переадресация
Для этого давайте создадим отдельный файл для обработки переадресации и счетчика статистики переходов по ссылке. Назовем его service.py
from django.http import HttpResponse from django.shortcuts import redirect from .models import Tokens def get_full_url(url: str) -> str: """ Достаем полную ссылку по short_url Если ссылки нет в базе или она не активна возвращаем ошибку. Если все ок, то добавляем к счетчику статистики 1 и возвращаем полную ссылку. """ try: # Пробуем достать токен, если его нет райзим ошибку, если он есть но не активен - райзим ошибку. token = Tokens.objects.get(short_url__exact=url) if not token.is_active: raise KeyError('Token is no longer available') except Tokens.DoesNotExist: raise KeyError('Try another url. No such urls in DB') token.requests_count += 1 # добавляем 1 к счетчику в случае удачного извлечения токена token.save() # сохраняем изменный экземпляр токена в БД return token.full_url def redirection(request, short_url): """Перенаправляем пользователя по ссылке""" try: full_link = get_full_url(short_url) # получает полный адрес по короткой ссылке return redirect(full_link) # перенаправляем пользователя по ссылке except Exception as e: return HttpResponse(e.args) # если что-то не так, райзим ошибку
Готово. Осталось описать шаблон пути, по которому наше приложение будет принимать запросы на переадресацию. Для этого нам необходимо дописать пару строк в головной файл urls.py (который находится в папке вместе с файлами settings.py и wsgi.py):
from api import services # новая строка from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('api.urls')), path('<str:short_url>', services.redirection), # новая строка ]
Теперь все запросы пришедшие на https://my_domain.ru/???? будут обработаны функцией redirection а она в свою очередь будет либо перекидывать пользователя на нужный сайт либо выдавать ошибку (если ссылки нет в базе или она по той или иной причине уже не активна).
Тестирование и запуск
Запускаем тесты: python manage.py test
. Путь к тестовому файлу указывать не нужно, python сам найдет все файлы начинающиеся со слова test и запустит их.
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
....
----------------------------------------------------------------------
Ran 4 tests in 0.034s
OK
Destroying test database for alias 'default'...
Тесты прошли успешно. Чтобы получить более детальную информацию можно выполнить команду python manage.py test -v2
Проверяем работу программы в POSTMAN.
Отправляем POST запрос на эндпоинт /api/tokens/ в теле которого указываем url который хотим сократить:
Как видим в ответ пришел короткий url и остальные параметры созданного токена.
Обратите внимание на код статуса ответа сервера, сейчас он 201 (created), но если мы повторно направим пост запрос с этим же урлом, то получим те же данные(так как токен уже создан), но статус код уже будет 200 (ok).
и сразу давайте отправим второй запрос с указанием короткой ссылки:
Как видим, у нас получилось создать токен с явным указанием короткой ссылки. Проверяем работу переадресации. Вводим в адресной строке: https://my_domain. ru/R3u2N1 нажимаем ввод и отправляемся на сайт Бегового сообщества (https://runc.run).
На этом все, уверен, есть более элегантные способы написания подобного сервиса, поэтому с удовольствием получу ваши замечания и предложения в комментариях к посту. Повторюсь, это мой первый пост и первое реальное тестовое задание, поэтому я открыт к любой критике:) Спасибо.
Ссылка на GitHub-репозиторий с проектом
Сервисы коротких ссылок – Программирование и не только
Ни для кого не секрет, что существует огромное множество полезных сервисов коротких ссылок. Обычно такие ссылки используются с целью сокращения длинного URL, а также специально для сокрытия конечного адреса ссылки. Конечно же, сокрытие действительного адреса ссылки не всегда положительно сказывается на поведенческих факторах пользователей. Например, некоторые пользователи, завидев такую ссылку, принципиально не переходят по ней.
Однако, случаются такие ситуации, когда сокращение ссылки является обязательным шагом, т. к. есть ограничение на длину публикуемой ссылки. Тем более, если сайт имеет хорошую репутацию, то пользователь никогда не усомнится в безопасности перехода по короткой ссылке.
1. Bitly
Хороший зарубежный сервис для создания коротких ссылок. С его помощью вы сможете легко укоротить вашу ссылку и повысить шансы бесперебойной работы на всех устройствах. В дополнение, можно отслеживать аналитику переходов по вашим ссылкам.
2. IS.GD
Очень простой и функциональный сервис по укорачиванию ссылок. Аналогично, зарубежный ресурс, но стабильный. Простые настройки в виде стандартной ссылки, в нижем регистре или в нижнем произносимом регистре. Также можно учитывать статистику переходов по ссылке.
3. To.click Link Managment
Интересный и полезный сервис для коротких ссылок от отечественного разработчика. Приведу перечень того, что сайт умеет делать:
- Создание коротких и красивых ссылок.
- Создание QR-кода из ссылок.
- Создание Deeplink для мобильных устройств.
- Настройка таргетинга аудитории как в RTB-кампаниях.
- Простой и удобный шеринг ссылки в социальных сетях с вашим дизайном и текстом.
- Анализ и статистика данных по ссылкам.
И, это еще не все. Более подробно можно ознакомиться на самом сайте.
4. Bit.Do
Аналогичный простой сервис по созданию коротких ссылок. Автогенериция QR-кода и ссылки со статистикой.
5. Кликер
Отечественный ресурс от Яндекса по созданию коротких ссылок. Есть возможность перенести ссылку в закладку, при нажатии на которую, автоматически будет укорачиваться адрес просматриваемого в данный момент сайта. Просто и удобно.
6. Bc.vc
Неплохой сервис по созданию коротких ссылок от зарубежного разработчика. Быстро и удобно.
7. RLU
С помощью данного сервиса вы можете из длинной ссылки получить ссылку, состоящую буквально из нескольких символов. Как уже говорилось — это полезно в тех случаях, когда есть ограничения на количество вводимых символов и нет возможности указать в тексте длинную ссылку. Если зарегистрироваться, то можно будет просматривать статистику или удалить не нужные ссылки. Еще один сайт для поддержки отечественного разработчика
8. Сокращение cсылок Вконтакте
А вот еще один сервис от довольно известной социальной сети Вконтакте. Здесь вы сможете сделать из длинной и сложной ссылки простую.
Такие ссылки удобнее использовать в записях и сообщениях самой социальной сети, а также в других местах.
9. U.to
Очень простой сервис для сокращения ваших ссылок. Как говорится, простота — залог успеха!
Итог
Существует огромное множество подобных сервисов и сайтов, с помощью которых можно укоротить ссылки. Какие-то содержат минимальный функционал, какие-то чуть более. Каким пользоваться сайтом — решать только вам. Хотя, я бы уделил внимание ресурсам, которые существует не первый день. В обзор не вошли некоторые сайты, которые скоро прекратят свою поддержку (например, сервис коротких ссылок от Google).
Кстати, есть сайты, с помощью которых можно узнать, куда ведет сокращенная ссылка.
Если вы нашли подобный полезный сайт, то делитесь, по возможности добавим в статью. До новых встреч!
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Корпоративный URL-адрес Shortener, брендированные URL-адреса, управление ссылками
Открыть основную навигацию на мобильном телефонеСовместная работа, соответствие нормативным требованиям и творчество
BL.INK предоставляет Link of Record для управления каждым прикосновением, контроля точности и предоставления аналитических сведений для измерения ценности и производительности для вашей глобальной аудитории.
Исследовать
Короткие ссылки с вашим брендом Атрибуция и отслеживание параметров QR-коды Аналитика(наша и ваша) Командное сотрудничество SMS, социальные и другие интеграции
Нам доверяют более 1000 компаний
Начало работы с
BL. INKЗагрузка лучших практик
Ознакомьтесь с нашей коллекцией лучших практик от множества клиентов, которые успешно запускаем крупномасштабный маркетинг и обмен транзакционными сообщениями кампании.
Скачать ресурсы
Создайте идеальную атрибуцию, измеряйте каждое прикосновение и следите за точностью.
Ссылка на запись
BL.INK создает среду для управления каждым прикосновением, контроля точности и предоставления аналитических сведений для измерения ценности и производительности.
BL.INK в социальных сетяхBL.INK повышает вашу социальную ценность, обеспечивая больший контроль, повышенную гибкость и защиту ваших аналитических данных. Клиенты полагаются на BL.INK, чтобы повысить эффективность своей социальной активности.
Начать
BL.INK в системе обмена сообщениямиИспользуйте BL. INK для безопасной доставки действенных и измеримых ссылок через SMS или любую платформу обмена сообщениями.
Начать
BL.INK EverywhereИспользуйте BL.INK в бесчисленном списке носителей, включая QR-коды, электронную почту, печать, PDF-файлы, телефон, прямую почтовую рассылку, радио и многое другое.
Начать
НОВЫЙМасштаб без ограничений для бесконечных возможностей
Blaze для безумно масштабных кампанийСоздание миллионов фирменных коротких ссылок в день может быть проблемой — до сих пор.
Blaze был разработан для удовлетворения всех потребностей вашей кампании. Географически избыточный, очень устойчивый, безумно масштабируемый, безопасный, совместимый, невероятно быстрый и масштабируемая модель выставления счетов с оплатой по факту использования, которая взимает плату только за созданные вами ссылки.
Запросить дополнительную информацию
БлейзПредложения
Неограниченное количество кликов
Необработанные или обработанные журналы
API с поддержкой
Ограничения скорости для любого размера
Запросить дополнительную информацию
Сотрудничество, соответствие нормативным требованиям и творчество
Создан для предприятий с первого дняС 2008 года BL. INK обслуживает корпоративные организации по всему миру. Платформа управления ссылками BL.INK эволюционировала, сосредоточившись на функциях, которые больше всего нужны нашим клиентам: Совместная работа. Согласие. Креативность.
РЕЗУЛЬТАТЫ?
Самое гибкое и клиентоориентированное решение для управления ссылками. В BL.INK мы знаем, что у каждой организации есть уникальные потребности, а также гибкость и стремление к корпоративной согласованности.
BL.INK интегрируется с вашими существующими инструментами, соответствует вашим организационным требованиям и дает вашим командам смелость выполнять работу.
Не соглашайтесь на простой инструмент для сокращения ссылок
Связь с BL.INK
Начать
5 из 5 звезд
BL.INK «..полностью интегрированы в нашу социальную деятельность Spredfast, предоставляя нам фирменные ссылки и улучшенное отслеживание по отличной цене. Они также неизменно надежны благодаря высокому качеству продукции и обслуживанию клиентов. Это решение, которое нам было нужно».
5 из 5 звезд
«Они позволили нашей организации лучше отслеживать и анализировать взаимодействие в социальных сетях. Команда была доступной, отзывчивой и более чем любезной для особых запросов, отзывов и поддержки».
5 из 5 звезд
«С самого начала они были только услужливыми и любезными. Ни одна проблема не была слишком большой или маленькой, с постоянным дружелюбным и теплым ответом на все запросы, которые у нас возникали во время реализации. Отличный сервис и настоящий конкурент другим сервисам».
5 из 5 звезд
«… позволяет нам легко измерять конверсии для ссылок, распространяемых через наши социальные платформы».
Short Link ‑ URL Shortener — приложение для сокращения URL для Shopify
Цены
Базовый
Бесплатно
- 10 коротких URL-адресов
- Совокупная аналитика
Плюс
$3,99/месяц
- Неограниченное количество коротких URL-адресов
- Аналитика коротких URL
- Пользовательские короткие URL-адреса (отлично подходят для партнерских программ и продвижения в социальных сетях)
- Сократите ЛЮБОЙ URL-адрес за пределами Shopify
Базовый
Бесплатно
- 10 коротких URL-адресов
- Совокупная аналитика
Плюс
3,9 доллара США9/месяц
- Неограниченное количество коротких URL-адресов
- Аналитика коротких URL
- Пользовательские короткие URL-адреса (отлично подходят для партнерских программ и продвижения в социальных сетях)
- Сократите ЛЮБОЙ URL-адрес за пределами Shopify
Все платежи выставляются в долларах США. Регулярные платежи и платежи на основе использования выставляются каждые 30 дней.
19 отзывов
Общий рейтинг
Количество на уровень рейтинга- 84% оценок — 5 звезд
16
- 0% оценок — 4 звезды
- 0% оценок — 3 звезды
- 0% оценок — 2 звезды
- 16% оценок имеют 1 звезду
3
5 мая 2023 г.
Это приложение использует внешний URL-адрес, принадлежащий этой компании, для перенаправления в ваш собственный магазин. Это не только делает вашу ссылку более спамной, чем беспорядочный URL-адрес, многие пакеты безопасности AVC блокируют этот тип перенаправления. .
Не рекомендуется, если только у вас нет очень специфических потребностей, которые можно решить с помощью перенаправления внешнего URL-адреса.
полезные мемы
КанадаВремя использования приложения: 15 минут
7 января 2023 г.
К сожалению, приложение перестало отслеживать продажи по созданной нами ссылке. Я не буду использовать это приложение снова, но, надеюсь, они улучшат его. Также нет мгновенной поддержки клиентов.
Паула Роуэн
ИрландияВремя использования приложения: 5 дней
28 декабря 2022 г.
Худшее приложение, которое мы когда-либо устанавливали. Ничего нормально не работает! Если вы создадите короткую ссылку, она не приведет вас на сайт автоматически. Приложение сокращает URL-адреса, но не может точно отслеживать порядок каждого URL-адреса. Даже он не работает с тестовыми заказами. Не рекомендуется вообще.
ШИ ТЕРРА ОРГАНИКС
Соединенные ШтатыВремя использования приложения: 1 день
Все отзывы
Об этом приложении
Запущен
7 мая 2020 г.
Языки
Английский
Построен Зегсу
О Зегсу
Веб-сайт
10 приложений
4,5 средний рейтинг
3 года разработки приложений для Shopify App Store
Поддерживать
Отправить сообщение+91 8297720004
Ресурсы
Политика конфиденциальности
Больше таких приложений
Кнопка внешних ссылок Outlink
4.9 из 5 звезд (156) всего 156 отзывов • Доступен бесплатный планДобавить партнерские ссылки или кнопки внешних ссылок в ваш магазин
Легкие перенаправления
4.