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.auth import authenticate, login
from django.contrib.auth.decorators import login_required
@ -11,76 +7,28 @@ from django.shortcuts import render
from django.urls import reverse
from django.views import View
from cms import promoters
from cms.forms import ArticleForm, UserForm
from cms.models import Article
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):
post_data = request.POST
article = Article.objects.create(body=post_data['body'],
link=post_data['link'])
self._promote_to_telegram(article)
self._promote_to_ok(article)
self._promote_to_vk(article)
return render(request, template_name='articles/created.html')
marketer = promoters.Marketer(article)
try:
marketer.promote()
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

Loading…
Cancel
Save