Выводим сообщение в случае успешного/провального продвижения #17

This commit is contained in:
Artur Galyamov 2022-12-20 11:52:33 +05:00
parent 82b151a3a7
commit f4deaee1b1
3 changed files with 112 additions and 76 deletions

99
cms/promoters.py Normal file
View 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()

View File

@ -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 %}

View File

@ -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