Browse Source

Merge pull request 'Реализовал доступ к ВК по опознаку (token)' (#48) from vk_auth into master

Reviewed-on: #48
master
parent
commit
75af7b0b79
  1. 52
      README.md
  2. 25
      cms/promoters.py
  3. 2
      crossposting_backend/settings.py

52
README.md

@ -1,6 +1,6 @@
# Описание # Описание
Приложение для автопостинга содержимого со ссылкой в социальные сети. Приложение для автопостинга содержимого со ссылкой в социальные сети.
Приложение реализовано на Django 4.1. Приложение реализовано на Django 4.1.
На данный момент реализован автопостинг в ВКонтакте, Одноклассники и телеграм. На данный момент реализован автопостинг в ВКонтакте, Одноклассники и телеграм.
Автопостинг на уровне архитектуры реализован с помощью класса "Маркетолог" cms.promoters.Marketer. Автопостинг на уровне архитектуры реализован с помощью класса "Маркетолог" cms.promoters.Marketer.
@ -16,30 +16,36 @@
4. Выбираем тип приложения "Пользовательское". 4. Выбираем тип приложения "Пользовательское".
5. Ставим галочку "Пользовательское" 5. Ставим галочку "Пользовательское"
6. Заполняем описание. 6. Заполняем описание.
7. Нажимаем "Добавить платформу". 7. Нажимаем "Добавить платформу".
8. Выбираем OAuth. 8. Выбираем OAuth.
9. В списке разрешённых redirect_uri указываем URL вашего сайта, откуда будете производить кросспостинг, 9. В списке разрешённых redirect_uri указываем URL вашего сайта, откуда будете производить кросспостинг,
например, https://mirocod.ru например, https://mirocod.ru
10. Ставим галочку "Разрешить клиентскую OAuth авторизацию". 10. Ставим галочку "Разрешить клиентскую OAuth авторизацию".
11. Выставляем права: 11. Выставляем права:
* Доступ к личной информации через OAuth (VALUABLE_ACCESS): Опционально * Доступ к личной информации через OAuth (VALUABLE_ACCESS): Опционально
* Получение длинных токенов OAuth (LONG_ACCESS_TOKEN): Опционально * Получение длинных токенов OAuth (LONG_ACCESS_TOKEN): Опционально
* Установка статуса (SET_STATUS): Не используется * Установка статуса (SET_STATUS): Не используется
* Изменение фотографий и фотоальбомов (PHOTO_CONTENT): Не используется * Изменение фотографий и фотоальбомов (PHOTO_CONTENT): Не используется
* Управление группами (GROUP_CONTENT): Обязательно * Управление группами (GROUP_CONTENT): Обязательно
11. Нажмите "Сохранить". 11. Нажмите "Сохранить".
12. Вам на почту придут ключи. 12. Вам на почту придут ключи.
13. Нажмите на кнопку "Получить новый" рядом с надписью "Вечный access_token". 13. Нажмите на кнопку "Получить новый" рядом с надписью "Вечный access_token".
14. Скопируйте значение "Вечный access_token" в .env-файл в корне вашего приложения, в качестве значения OK_ACCESS_TOKEN: 14. Скопируйте значение "Вечный access_token" в .env-файл в корне вашего приложения, в качестве значения OK_ACCESS_TOKEN:
15. Вставьте их в .env-файл в корне вашего приложения: 15. Вставьте их в .env-файл в корне вашего приложения:
* Публичный ключ приложения - в качестве значения OK_APPLICATION_KEY * Публичный ключ приложения - в качестве значения OK_APPLICATION_KEY
* Секретный ключ приложения - в качестве значения OK_APPLICATION_SECRET_KEY * Секретный ключ приложения - в качестве значения OK_APPLICATION_SECRET_KEY
## Настраиваем доступ к ВКонтакте ## Настраиваем доступ к ВКонтакте
1. Укажите логин, ваш email, под которым вы авторизуетесь в ВК, в качестве значения VK_LOGIN
2. Укажите пароль, в качестве значения VK_PASSWORD 1. Создайте приложение в ВК (standalone). Укажите в приложении сообщество
3. Укажите ид группы, добавьте к нему минус в начале. Т.е. если № группы 7002, то нужно указать -7002, в качестве значения VK_OWNER_ID 2. Скопируйте ссылку ниже, укажите ID приложения.Вставьте ссылку в адресную строку браузере, нажмите Enter
https://oauth.vk.com/authorize?client_id=ID-приложения&scope=wall,offline&redirect_uri=https://oauth.vk.com/blank.html&display=page&response_type=token&revoke=1
3. После этого в вашей адресной строке появится необходимый ключ. Он копируется вручную: после access\_token= и перед &expires\_in.
4. Укажите токен, в качестве значения VK_TOKIN
5. Укажите id сообщества со знаком «-», в качестве значения VK_OWNER_ID
## Настраиваем доступ к телеграм ## Настраиваем доступ к телеграм
@ -50,64 +56,80 @@
5. Добавьте бота в админы группы 5. Добавьте бота в админы группы
6. Добавьте несколько тестовых сообщений в группу 6. Добавьте несколько тестовых сообщений в группу
7. Запустите команду: 7. Запустите команду:
``` ```
python3.8 manage.py get_telegram_group_id python3.8 manage.py get_telegram_group_id
``` ```
6. В результате будет выведен ид канала 6. В результате будет выведен ид канала
7. Вставьте полученный ид в .env-файл, переменная TELEGRAM_CHAT_ID 7. Вставьте полученный ид в .env-файл, переменная TELEGRAM_CHAT_ID
### Возможные ошибки ### Возможные ошибки
7. Если будет ошибка, что "Нет обновлений", значит, нужно прислать больше сообщений в группу и быстрее запустить команду.
Возможно бот успевает прочитать обновления до вас.
7. Если будет ошибка, что "Нет обновлений", значит, нужно прислать больше сообщений в группу и быстрее запустить команду.
Возможно бот успевает прочитать обновления до вас.
# Задаём доступ к веб-интерфейсу # Задаём доступ к веб-интерфейсу
1. Зайдите по ssh на хостинг. 1. Зайдите по ssh на хостинг.
2. Зайдите по root. 2. Зайдите по root.
3. Активируйте виртуальное окружение: 3. Активируйте виртуальное окружение:
```shell ```shell
source /home/crossposting_env/bin/activate source /home/crossposting_env/bin/activate
``` ```
4. Перейдите в папку проекта: 4. Перейдите в папку проекта:
```shell ```shell
cd /var/www/crossposting/backend/current/ cd /var/www/crossposting/backend/current/
``` ```
5. Запустите консоль django: 5. Запустите консоль django:
```shell ```shell
python3.8 manage.py shell python3.8 manage.py shell
``` ```
1. Выполните команду на python: 1. Выполните команду на python:
```python ```python
from django.contrib.auth.models import User from django.contrib.auth.models import User
``` ```
2. Создайте пользователя, под которым будете авторизоваться. Укажите своё имя пользователя, электропочту и пароль: 2. Создайте пользователя, под которым будете авторизоваться. Укажите своё имя пользователя, электропочту и пароль:
```python ```python
user = User.objects.create_user(username='user', email='user@mail.pro', password='123123123') user = User.objects.create_user(username='user', email='user@mail.pro', password='123123123')
``` ```
3. Выйти из консоли: 3. Выйти из консоли:
```python ```python
quit() quit()
``` ```
# Шифруем .env-файл # Шифруем .env-файл
1. По умолчанию настройка шифрования в crossposting_backend/private/settings.py ENV_ENCODED равна False. Это означает, 1. По умолчанию настройка шифрования в crossposting_backend/private/settings.py ENV_ENCODED равна False. Это означает,
что .env-файл не шифрован. что .env-файл не шифрован.
2. Если нужно повысить защищённость данных, то шифруем .env-файл. 2. Если нужно повысить защищённость данных, то шифруем .env-файл.
3. Если у вас уже зашифрован .env-файл, то на всякий случай создайте резервную копию этого файла. 3. Если у вас уже зашифрован .env-файл, то на всякий случай создайте резервную копию этого файла.
4. Далее создайте .env-файл и укажите незашифрованные доступы к социальным сетям. 4. Далее создайте .env-файл и укажите незашифрованные доступы к социальным сетям.
5. В crossposting_backend/private/settings.py значение ENV_ENCODED д.б. False. 5. В crossposting_backend/private/settings.py значение ENV_ENCODED д.б. False.
6. Перезапустите веб-приложение: 6. Перезапустите веб-приложение:
```shell ```shell
supervisorctl restart crossposting_django supervisorctl restart crossposting_django
``` ```
7. Выполните команду для шифровки: 7. Выполните команду для шифровки:
python3.8 manage.py encode_file python3.8 manage.py encode_file
8. В результате будет создан файл .env.encoded 8. В результате будет создан файл .env.encoded
9. Замените .env созданным файлом .env.encoded 9. Замените .env созданным файлом .env.encoded
10. В crossposting_backend/private/settings.py значение ENV_ENCODED замените на True. 10. В crossposting_backend/private/settings.py значение ENV_ENCODED замените на True.
11. Перезапустите веб-приложение: 11. Перезапустите веб-приложение:
```shell ```shell
supervisorctl restart crossposting_django supervisorctl restart crossposting_django
``` ```

25
cms/promoters.py

@ -37,21 +37,22 @@ class TelegramPromoter(Promoter):
class VkontaktePromoter(Promoter): class VkontaktePromoter(Promoter):
def promote(self): def promote(self):
vk_login = promoter_secrets['VK_LOGIN']
vk_password = promoter_secrets['VK_PASSWORD']
vk_owner_id = promoter_secrets['VK_OWNER_ID'] vk_owner_id = promoter_secrets['VK_OWNER_ID']
vk_token = promoter_secrets['VK_TOKEN']
import vk_api from_group = 1
session = vk_api.VkApi(login=vk_login,
password=vk_password)
session.auth()
api = session.get_api()
try: try:
api.wall.post(owner_id=vk_owner_id, requests.post('https://api.vk.com/method/wall.post',
message=self.article.body, params={
attachments=self.article.link) 'access_token': vk_token,
except vk_api.VkApiError as exc: 'owner_id': vk_owner_id,
'from_group': from_group,
'message': self.article.body,
'attachment': self.article.link,
'signed': 0,
'v': '5.131'
})
except Exception as exc:
raise PromoteError(exc) raise PromoteError(exc)

2
crossposting_backend/settings.py

@ -41,7 +41,7 @@ dotenv.read_dotenv(env_file)
promoter_env_keys = ( promoter_env_keys = (
'TELEGRAM_BOT_TOKEN', 'TELEGRAM_CHAT_ID', 'JOOMLA_TOKEN', 'TELEGRAM_BOT_TOKEN', 'TELEGRAM_CHAT_ID', 'JOOMLA_TOKEN',
'VK_LOGIN', 'VK_PASSWORD', 'VK_OWNER_ID', 'OK_ACCESS_TOKEN', 'OK_APPLICATION_KEY', 'VK_OWNER_ID', 'VK_TOKEN', 'OK_ACCESS_TOKEN', 'OK_APPLICATION_KEY',
'OK_APPLICATION_SECRET_KEY', 'OK_GROUP_ID', 'OK_APPLICATION_SECRET_KEY', 'OK_GROUP_ID',
) )
promoter_secrets = {} promoter_secrets = {}

Loading…
Cancel
Save