Выводим сообщение в случае успешного/провального продвижения #17
This commit is contained in:
parent
82b151a3a7
commit
f4deaee1b1
99
cms/promoters.py
Normal file
99
cms/promoters.py
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
import abc
|
||||||
|
import os
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
from cms.models import Article
|
||||||
|
|
||||||
|
|
||||||
|
class PromoteError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Promoter(abc.ABC):
|
||||||
|
def __init__(self, article: Article):
|
||||||
|
self.article = article
|
||||||
|
|
||||||
|
def promote(self):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
|
class TelegramPromoter(Promoter):
|
||||||
|
def promote(self):
|
||||||
|
bot_token = os.getenv('TELEGRAM_BOT_TOKEN')
|
||||||
|
channel_id = os.getenv('TELEGRAM_CHAT_ID')
|
||||||
|
|
||||||
|
long_text = f'{self.article.body}\n{self.article.link}'
|
||||||
|
|
||||||
|
send_message_url = f'https://api.telegram.org/bot{bot_token}/sendMessage?chat_id={channel_id}&text={long_text}'
|
||||||
|
|
||||||
|
response = requests.get(send_message_url)
|
||||||
|
result = response.json()
|
||||||
|
if not result['ok']:
|
||||||
|
raise PromoteError('Похоже, нас послали доделывать приложение :-(')
|
||||||
|
|
||||||
|
|
||||||
|
class VkontaktePromoter(Promoter):
|
||||||
|
def promote(self):
|
||||||
|
vk_login = os.getenv('VK_LOGIN')
|
||||||
|
vk_password = os.getenv('VK_PASSWORD')
|
||||||
|
vk_owner_id = os.getenv('VK_OWNER_ID')
|
||||||
|
|
||||||
|
import vk_api
|
||||||
|
session = vk_api.VkApi(login=vk_login,
|
||||||
|
password=vk_password)
|
||||||
|
session.auth()
|
||||||
|
api = session.get_api()
|
||||||
|
|
||||||
|
try:
|
||||||
|
api.wall.post(owner_id=vk_owner_id,
|
||||||
|
message=self.article.body,
|
||||||
|
attachments=self.article.link)
|
||||||
|
except vk_api.VkApiError as exc:
|
||||||
|
raise PromoteError(exc)
|
||||||
|
|
||||||
|
|
||||||
|
class OdnoklassnikiPromoter(Promoter):
|
||||||
|
def promote(self):
|
||||||
|
from json import JSONEncoder
|
||||||
|
import ok_api
|
||||||
|
|
||||||
|
ok_access_token = os.getenv('OK_ACCESS_TOKEN')
|
||||||
|
ok_application_key = os.getenv('OK_APPLICATION_KEY')
|
||||||
|
ok_application_secret_key = os.getenv('OK_APPLICATION_SECRET_KEY')
|
||||||
|
|
||||||
|
session = ok_api.OkApi(access_token=ok_access_token,
|
||||||
|
application_key=ok_application_key,
|
||||||
|
application_secret_key=ok_application_secret_key)
|
||||||
|
attachments = {
|
||||||
|
'media': [
|
||||||
|
{
|
||||||
|
'type': 'text',
|
||||||
|
'text': self.article.body,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'type': 'link',
|
||||||
|
'url': self.article.link,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
encoded_attachments = JSONEncoder().encode(attachments)
|
||||||
|
try:
|
||||||
|
session.mediatopic.post(type='GROUP_THEME',
|
||||||
|
gid='70000001426867',
|
||||||
|
attachment=encoded_attachments)
|
||||||
|
except ok_api.OkApiException as exc:
|
||||||
|
raise PromoteError(exc)
|
||||||
|
|
||||||
|
|
||||||
|
class Marketer:
|
||||||
|
def __init__(self, article: Article):
|
||||||
|
self.promoters = [
|
||||||
|
TelegramPromoter(article),
|
||||||
|
VkontaktePromoter(article),
|
||||||
|
OdnoklassnikiPromoter(article),
|
||||||
|
]
|
||||||
|
|
||||||
|
def promote(self):
|
||||||
|
for promoter in self.promoters:
|
||||||
|
promoter.promote()
|
@ -1,11 +0,0 @@
|
|||||||
{% extends 'base.html' %}
|
|
||||||
{% block content %}
|
|
||||||
<div class="alert alert-success" role="alert">
|
|
||||||
Статья продвинута успешно!
|
|
||||||
</div>
|
|
||||||
<a
|
|
||||||
href="{% url 'new-article' %}"
|
|
||||||
class="btn btn-primary">
|
|
||||||
Продвиньте новую статью
|
|
||||||
</a>
|
|
||||||
{% endblock content %}
|
|
78
cms/views.py
78
cms/views.py
@ -1,7 +1,3 @@
|
|||||||
import os
|
|
||||||
from json import JSONEncoder
|
|
||||||
|
|
||||||
import requests
|
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth import authenticate, login
|
from django.contrib.auth import authenticate, login
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
@ -11,76 +7,28 @@ from django.shortcuts import render
|
|||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.views import View
|
from django.views import View
|
||||||
|
|
||||||
|
from cms import promoters
|
||||||
from cms.forms import ArticleForm, UserForm
|
from cms.forms import ArticleForm, UserForm
|
||||||
from cms.models import Article
|
from cms.models import Article
|
||||||
|
|
||||||
|
|
||||||
class ArticleView(LoginRequiredMixin, View):
|
class ArticleView(LoginRequiredMixin, View):
|
||||||
def _promote_to_telegram(self, article: Article):
|
|
||||||
bot_token = os.getenv('TELEGRAM_BOT_TOKEN')
|
|
||||||
channel_id = os.getenv('TELEGRAM_CHAT_ID')
|
|
||||||
|
|
||||||
long_text = f'{article.body}\n{article.link}'
|
|
||||||
|
|
||||||
send_message_url = f'https://api.telegram.org/bot{bot_token}/sendMessage?chat_id={channel_id}&text={long_text}'
|
|
||||||
|
|
||||||
response = requests.get(send_message_url)
|
|
||||||
result = response.json()
|
|
||||||
if result['ok']:
|
|
||||||
print('Мы послали сообщение, ура!')
|
|
||||||
else:
|
|
||||||
print('Похоже, нас послали доделывать приложение :-(')
|
|
||||||
|
|
||||||
def _promote_to_vk(self, article: Article):
|
|
||||||
import vk_api
|
|
||||||
vk_login = os.getenv('VK_LOGIN')
|
|
||||||
vk_password = os.getenv('VK_PASSWORD')
|
|
||||||
vk_owner_id = os.getenv('VK_OWNER_ID')
|
|
||||||
|
|
||||||
session = vk_api.VkApi(login=vk_login,
|
|
||||||
password=vk_password)
|
|
||||||
session.auth()
|
|
||||||
api = session.get_api()
|
|
||||||
|
|
||||||
api.wall.post(owner_id=vk_owner_id,
|
|
||||||
message=article.body,
|
|
||||||
attachments=article.link)
|
|
||||||
|
|
||||||
def _promote_to_ok(self, article: Article):
|
|
||||||
import ok_api
|
|
||||||
|
|
||||||
ok_access_token = os.getenv('OK_ACCESS_TOKEN')
|
|
||||||
ok_application_key = os.getenv('OK_APPLICATION_KEY')
|
|
||||||
ok_application_secret_key = os.getenv('OK_APPLICATION_SECRET_KEY')
|
|
||||||
|
|
||||||
session = ok_api.OkApi(access_token=ok_access_token,
|
|
||||||
application_key=ok_application_key,
|
|
||||||
application_secret_key=ok_application_secret_key)
|
|
||||||
attachments = {
|
|
||||||
'media': [
|
|
||||||
{
|
|
||||||
'type': 'text',
|
|
||||||
'text': article.body,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'type': 'link',
|
|
||||||
'url': article.link,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}
|
|
||||||
encoded_attachments = JSONEncoder().encode(attachments)
|
|
||||||
session.mediatopic.post(type='GROUP_THEME',
|
|
||||||
gid='70000001426867',
|
|
||||||
attachment=encoded_attachments)
|
|
||||||
|
|
||||||
def post(self, request: HttpRequest):
|
def post(self, request: HttpRequest):
|
||||||
post_data = request.POST
|
post_data = request.POST
|
||||||
article = Article.objects.create(body=post_data['body'],
|
article = Article.objects.create(body=post_data['body'],
|
||||||
link=post_data['link'])
|
link=post_data['link'])
|
||||||
self._promote_to_telegram(article)
|
marketer = promoters.Marketer(article)
|
||||||
self._promote_to_ok(article)
|
try:
|
||||||
self._promote_to_vk(article)
|
marketer.promote()
|
||||||
return render(request, template_name='articles/created.html')
|
message_type = messages.SUCCESS
|
||||||
|
message_text = 'Продвижение статьи прошло успешно'
|
||||||
|
except promoters.PromoteError as exc:
|
||||||
|
message_type = messages.ERROR
|
||||||
|
message_text = 'Произошла ошибка: %s' % str(exc)
|
||||||
|
messages.add_message(request=request,
|
||||||
|
level=message_type,
|
||||||
|
message=message_text)
|
||||||
|
return HttpResponseRedirect(reverse('new-article'))
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
|
Loading…
x
Reference in New Issue
Block a user