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',]
|
CSRF_TRUSTED_ORIGINS = ['http://zakonvremeni.ru:8989',]
|
||||||
|
|
||||||
|
# Если False, то данные в .env хранятся в открытом виде,
|
||||||
|
# иначе в зашифрованном.
|
||||||
|
ENV_ENCODED = False
|
||||||
|
|
||||||
LOG_DIR = path.join(Path(__file__).resolve().parent.parent.parent, 'logs/')
|
LOG_DIR = path.join(Path(__file__).resolve().parent.parent.parent, 'logs/')
|
||||||
|
|
||||||
LOGGING = {
|
LOGGING = {
|
||||||
|
@ -25,6 +25,15 @@ def decode_env(env_key: str) -> str:
|
|||||||
return signer.unsign_object(signed_telegram_chat_id_dict)[env_key]
|
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
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||||
env_file = path.join(BASE_DIR, '.env')
|
env_file = path.join(BASE_DIR, '.env')
|
||||||
|
|
||||||
@ -36,8 +45,13 @@ promoter_env_keys = (
|
|||||||
'OK_APPLICATION_SECRET_KEY',
|
'OK_APPLICATION_SECRET_KEY',
|
||||||
)
|
)
|
||||||
promoter_secrets = {}
|
promoter_secrets = {}
|
||||||
|
if ENV_ENCODED:
|
||||||
|
decode_strategy = decode_env
|
||||||
|
else:
|
||||||
|
decode_strategy = return_env
|
||||||
|
|
||||||
for promoter_env_key in promoter_env_keys:
|
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'.
|
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user