Merge pull request 'tutorial' (#39) from tutorial into master
Reviewed-on: http://pulsdel.ru/ZakonVremeni/crossposting/pulls/39
This commit is contained in:
commit
ad96d2e443
9
.env.example
Normal file
9
.env.example
Normal file
@ -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
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
Normal file
24
cms/management/commands/get_telegram_group_id.py
Normal file
@ -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
|
@ -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 = {
|
||||
|
@ -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…
x
Reference in New Issue
Block a user