This commit is contained in:
2025-11-24 11:31:29 +09:00
parent ce7119e9e9
commit 1da6180658
30 changed files with 4352 additions and 272 deletions

138
TELEGRAM_LINKS_INFO.md Normal file
View File

@@ -0,0 +1,138 @@
# Как работают ссылки Telegram
## Проблема
Ссылки на **личные профили пользователей** через `https://t.me/username` **не работают напрямую** в браузере.
**НЕ РАБОТАЕТ**: `https://t.me/trevor1985` (для личного профиля)
**РАБОТАЕТ**: `https://t.me/smartsoltech` (для каналов, групп, ботов)
## Решение
### 1. Использование tg:// протокола
**Для личных профилей пользователей** используется специальный протокол `tg://`:
```html
<a href="tg://resolve?domain=trevor1985">Открыть в Telegram</a>
```
Этот формат:
- ✅ Открывает Telegram приложение (Desktop или Mobile)
- ✅ Работает на всех платформах (Windows, macOS, Linux, iOS, Android)
-Не работает в браузере, если Telegram не установлен
### 2. Типы ссылок Telegram
| Тип | Формат для браузера | Формат для приложения |
|-----|-------------------|----------------------|
| **Бот** | `https://t.me/botusername` | `tg://resolve?domain=botusername` |
| **Канал/Группа** | `https://t.me/channelname` | `tg://resolve?domain=channelname` |
| **Личный профиль** | ❌ Не поддерживается | `tg://resolve?domain=username` |
| **Номер телефона** | `https://t.me/+1234567890` | `tg://resolve?phone=+1234567890` |
### 3. Реализация в проекте
#### TeamMember модель (web/models.py)
```python
telegram = models.CharField(
max_length=100,
blank=True,
verbose_name='Telegram',
help_text='Username без @ (например: trevor1985)'
)
```
**Важно**: Вводить username **БЕЗ символа @**
- ✅ Правильно: `trevor1985`
- ❌ Неправильно: `@trevor1985`
#### Шаблон team_section.html
```django
{% if member.telegram %}
<a href="tg://resolve?domain={{ member.telegram }}"
title="Открыть в Telegram: @{{ member.telegram }}"
class="btn btn-outline-primary btn-sm rounded-circle">
<i class="fab fa-telegram-plane"></i>
</a>
{% endif %}
```
### 4. Альтернативные варианты
#### Вариант A: Только показывать username
```html
<span>@{{ member.telegram }}</span>
<small class="text-muted">Найдите в поиске Telegram</small>
```
#### Вариант B: Копировать в буфер обмена
```html
<button onclick="navigator.clipboard.writeText('@{{ member.telegram }}')">
<i class="fab fa-telegram-plane"></i> Копировать username
</button>
```
#### Вариант C: Универсальная ссылка (fallback)
```html
<a href="tg://resolve?domain={{ member.telegram }}"
onclick="window.open('https://t.me/{{ member.telegram }}', '_blank')">
```
### 5. Для ботов и каналов
Если нужно сослаться на **бота** или **канал**, используйте обычные HTTPS ссылки:
```python
# FooterSettings или другие модели
telegram_url = models.URLField(blank=True, verbose_name='Telegram URL')
```
```django
<a href="https://t.me/smartsoltech" target="_blank">
@smartsoltech
</a>
```
### 6. Документация Telegram
Официальная документация по ссылкам:
- https://core.telegram.org/api/links
- https://telegram.org/faq#q-what-are-usernames-how-do-i-get-one
**Deep Links схема**:
- `tg://resolve?domain=USERNAME` - открыть профиль/канал
- `tg://resolve?phone=PHONE_NUMBER` - открыть по номеру
- `tg://msg?to=USERNAME&text=TEXT` - отправить сообщение
- `tg://join?invite=HASH` - присоединиться к группе по инвайту
### 7. Проверка в проекте
После изменений:
1. ✅ Обновлен `team_section.html` - использует `tg://resolve?domain=`
2. ✅ Добавлен `help_text` в модель `TeamMember`
3. ✅ Применена миграция `0012_alter_teammember_telegram.py`
4.В админке теперь подсказка: "Username без @"
### 8. Тестирование
Для проверки корректности:
1. Откройте страницу `/about/` (О нас)
2. Нажмите на иконку Telegram у члена команды
3. Должно открыться Telegram приложение с профилем пользователя
**Примечание**: Если Telegram не установлен, браузер может показать ошибку "Protocol not supported" - это нормально.
## Вывод
**Используйте**:
- `tg://resolve?domain=username` для личных профилей
- `https://t.me/botname` для ботов и каналов
- Username **БЕЗ @** в базе данных