Browse Source

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

pull/32/head
Artur Galyamov 2 years ago
parent
commit
f4deaee1b1
  1. 99
      cms/promoters.py
  2. 11
      cms/templates/articles/created.html
  3. 78
      cms/views.py

99
cms/promoters.py

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

11
cms/templates/articles/created.html

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

@ -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…
Cancel
Save