Artur Galyamov
2 years ago
3 changed files with 112 additions and 76 deletions
@ -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 %} |
Loading…
Reference in new issue