Browse Source

Merge pull request 'tutorial' (#39) from tutorial into master

Reviewed-on: ZakonVremeni/crossposting#39
pull/45/head
parent
commit
ad96d2e443
  1. 9
      .env.example
  2. 54
      README.md
  3. 24
      cms/management/commands/get_telegram_group_id.py
  4. 4
      crossposting_backend/private/settings.example.py
  5. 16
      crossposting_backend/settings.py

9
.env.example

@ -0,0 +1,9 @@
TELEGRAM_BOT_TOKEN=fdaTTdf
TELEGRAM_CHAT_ID=-1
JOOMLA_TOKEN=c2ddd
VK_LOGIN=user@mail.pro
VK_PASSWORD=123123
VK_OWNER_ID=-2
OK_ACCESS_TOKEN=aatk
OK_APPLICATION_KEY=FFCF
OK_APPLICATION_SECRET_KEY=GGD

54
README.md

@ -0,0 +1,54 @@
# Описание
Приложение для автопостинга содержимого со ссылкой в социальные сети.
Приложение реализовано на Django 4.1.
На данный момент реализован автопостинг в ВКонтакте, Одноклассники и телеграм.
Автопостинг на уровне архитектуры реализован с помощью класса "Маркетолог" cms.promoters.Marketer.
Маркетолог передаёт продвигателям (promoters) статью для продвижения.
# Настраиваем доступ к социальным сетям
## Настраиваем доступ к одноклассникам
1. Создаём [приложение](https://apiok.ru/dev/app/create)
2. Следуем инструкциям по ссылке выше.
3. Создаём приложение.
4. Выбираем тип приложения "Пользовательское".
5. Ставим галочку "Пользовательское"
6. Заполняем описание.
7. Нажимаем "Добавить платформу".
8. Выбираем OAuth.
9. В списке разрешённых redirect_uri указываем https://zakonvremeni.ru
10. Ставим галочку "Разрешить клиентскую OAuth авторизацию".
11. Выставляем права:
* Доступ к личной информации через OAuth (VALUABLE_ACCESS): Опционально
* Получение длинных токенов OAuth (LONG_ACCESS_TOKEN): Опционально
* Установка статуса (SET_STATUS): Не используется
* Изменение фотографий и фотоальбомов (PHOTO_CONTENT): Не используется
* Управление группами (GROUP_CONTENT): Обязательно
11. Нажмите "Сохранить".
12. Вам на почту придут ключи.
13. Нажмите на кнопку "Получить новый" рядом с надписью "Вечный access_token".
14. Скопируйте значение "Вечный access_token" в .env-файл в корне вашего приложения, в качестве значения OK_ACCESS_TOKEN:
15. Вставьте их в .env-файл в корне вашего приложения:
* Публичный ключ приложения - в качестве значения OK_APPLICATION_KEY
* Секретный ключ приложения - в качестве значения OK_APPLICATION_SECRET_KEY
## Настраиваем доступ к телеграм
1. Создайте бота с помощью @BotFather в телеграм.
2. Скопируйте опознак (token).
3. Вставьте токен в .env-файл вашего проекта, в качестве значения переменной TELEGRAM_BOT_TOKEN.
4. Добавьте бота в админы группы
5. Добавьте несколько тестовых сообщений в группу
6. Запустите команду:
```
python manage.py get_telegram_group_id
```
6. В результате будет выведен ид канала
7. Вставьте полученный ид в .env-файл, переменная TELEGRAM_CHAT_ID
### Возможные ошибки
7. Если будет ошибка, что "Нет обновлений", значит, нужно прислать больше сообщений в группу и быстрее запустить команду.
Возможно бот успевает прочитать обновления до вас

24
cms/management/commands/get_telegram_group_id.py

@ -0,0 +1,24 @@
import requests
from django.core.management import BaseCommand
from crossposting_backend.settings import promoter_secrets
class Command(BaseCommand):
def handle(self, *args, **options):
bot_token = promoter_secrets['TELEGRAM_BOT_TOKEN']
get_updates_url = f'https://api.telegram.org/bot{bot_token}/getUpdates'
response = requests.get(get_updates_url)
if response.ok:
json_body = response.json()
if json_body['ok']:
if 'result' in json_body and len(json_body['result']) > 0:
print(json_body['result'][0]['channel_post']['sender_chat']['id'])
else:
print('Нет обновлений')
else:
print(json_body['error_code'])
else:
print(response.status_code)
return 0

4
crossposting_backend/private/settings.example.py

@ -11,6 +11,10 @@ ALLOWED_HOSTS = ['localhost']
CSRF_TRUSTED_ORIGINS = ['http://zakonvremeni.ru:8989',]
# Если False, то данные в .env хранятся в открытом виде,
# иначе в зашифрованном.
ENV_ENCODED = False
LOG_DIR = path.join(Path(__file__).resolve().parent.parent.parent, 'logs/')
LOGGING = {

16
crossposting_backend/settings.py

@ -25,6 +25,15 @@ def decode_env(env_key: str) -> str:
return signer.unsign_object(signed_telegram_chat_id_dict)[env_key]
def return_env(env_key: str) -> str:
"""
Функция нужна как стратегия, если not ENV_ENCODED
:param env_key:
:return:
"""
return getenv(env_key)
BASE_DIR = Path(__file__).resolve().parent.parent
env_file = path.join(BASE_DIR, '.env')
@ -36,8 +45,13 @@ promoter_env_keys = (
'OK_APPLICATION_SECRET_KEY',
)
promoter_secrets = {}
if ENV_ENCODED:
decode_strategy = decode_env
else:
decode_strategy = return_env
for promoter_env_key in promoter_env_keys:
promoter_secrets[promoter_env_key] = decode_env(promoter_env_key)
promoter_secrets[promoter_env_key] = decode_strategy(promoter_env_key)
# Build paths inside the project like this: BASE_DIR / 'subdir'.

Loading…
Cancel
Save