diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..62a9203 --- /dev/null +++ b/.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 \ No newline at end of file diff --git a/README.md b/README.md index e69de29..e6f0402 100644 --- a/README.md +++ b/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. Если будет ошибка, что "Нет обновлений", значит, нужно прислать больше сообщений в группу и быстрее запустить команду. +Возможно бот успевает прочитать обновления до вас \ No newline at end of file diff --git a/cms/management/commands/get_telegram_group_id.py b/cms/management/commands/get_telegram_group_id.py new file mode 100644 index 0000000..ec6676b --- /dev/null +++ b/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 diff --git a/crossposting_backend/private/settings.example.py b/crossposting_backend/private/settings.example.py index eba2761..81c59c7 100644 --- a/crossposting_backend/private/settings.example.py +++ b/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 = { diff --git a/crossposting_backend/settings.py b/crossposting_backend/settings.py index 1ae0c33..9cb42be 100644 --- a/crossposting_backend/settings.py +++ b/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'.