Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from listanimal.parseranimal import RtNewsAnimalParser
- from django.core.management.base import BaseCommand
- from listanimal.models import NewestLogFileContent, AnimalNews
- from django.core.mail import send_mail
- import vk_api, logging, time, os, requests
- from django.conf import settings
- from django.utils import timezone
- logger = logging.getLogger('commands.createnews')
- log_db = open('logger/news.log', 'r')
- class VKController:
- '''
- Класс для интеграции с соцсетью VK.com
- '''
- group_id = settings.GROUP_ID
- vk_session = vk_api.VkApi(token=settings.ACESS_TOKEN_ATTACHEMENT)
- def wall_post(self, msg: str, attachments=None):
- '''
- :param msg: Строка с сообщением, которое требуется опубликовать в посте группы
- :param attachments: Список вложений к посту ВК
- :return:
- '''
- data = {
- 'owner_id': -self.group_id,
- 'from_group': 1,
- 'message': msg
- }
- if attachments is not None:
- data['attachments'] = attachments
- response = self.vk_session.method('wall.post',
- data)
- return response
- def get_wall_upload_server(self):
- '''
- Получить сервер ВК для загрузки изображений
- :return:
- '''
- upload_url = self.vk_session.method('photos.getWallUploadServer',
- {'group_id': self.group_id,
- 'v': 5.95})['upload_url']
- return upload_url
- def _upload_photo(self, filepath):
- '''
- Сохранить фото на сервере ВК
- :param filepath: Путь к файлу
- :return: Объект requests.Response
- '''
- upload_url = self.get_wall_upload_server()
- request = requests.post(upload_url, files={'file': open(filepath, 'rb')})
- return request
- def save_wall_photo(self, filepath):
- '''
- Загрузить файл на сервер ВК и закрепить его за указанной группой
- :param filepath:
- :return:
- '''
- upload_response = self._upload_photo(filepath)
- save_wall_photo = self.vk_session.method('photos.saveWallPhoto',
- {'group_id': self.group_id, 'v': 5.95,
- 'photo': upload_response.json()['photo'],
- 'server': upload_response.json()['server'],
- 'hash': upload_response.json()['hash']})
- return save_wall_photo
- class Command(BaseCommand):
- parser = RtNewsAnimalParser()
- vk_controller = VKController()
- def handle(self, *args, **options):
- self.createnews()
- def createnews(self):
- summ_new_news = ''
- news = RtNewsAnimalParser.rt_news_animal(self)
- for animal_news in news:
- create_object, is_created = AnimalNews.objects.get_or_create(heading=animal_news['heading'],
- defaults=animal_news)
- if is_created:
- self.vk_wall_post_news(animal_news, summ_new_news)
- self.send_news(summ_new_news, animal_news)
- def vk_wall_post_news(self, animal_news, summ_new_news):
- summ_new_news += '\n' + ' Заголовок статьи:' + animal_news['heading']
- try:
- if animal_news.get('url_media', None) is not None:
- if animal_news['url_media'].endswith('.mp4'):
- message = '{}\nСсылка на оригинал:{}\nВложение:{}\n{}\n{}\n' \
- 'Ссылка на видео:{}'.format(
- animal_news['time_post'], animal_news['url_news'],
- animal_news.get('main_text', None),
- animal_news['description_news'],
- animal_news['heading'], animal_news['url_media'])
- self.vk_controller.wall_post(message)
- else:
- photo = requests.get(animal_news['url_media'])
- images = open('images.jpg', 'wb')
- images.write(photo.content)
- save_wall_photo = self.vk_controller.save_wall_photo('images.jpg')
- owner_id = str(save_wall_photo[0]['owner_id'])
- wall_photo_id = str(save_wall_photo[0]['id'])
- saved_photo_name = 'photo{}_{}'.format(owner_id, wall_photo_id)
- message = '{}\nСсылка на оригинал:{}\nВложение:{}\n{}\n{}'.format(
- animal_news['time_post'], animal_news['url_news'],
- animal_news.get('main_text', None),
- animal_news['description_news'],
- animal_news['heading'])
- self.vk_controller.wall_post(message, attachments=saved_photo_name)
- os.remove('images.jpg')
- elif animal_news.get('gallery_img', None) is not None:
- saved_gallery = ''
- for one_img in animal_news['gallery_img']:
- photo = requests.get(one_img.replace(' ', ''))
- images = open('images.jpg', 'wb')
- images.write(photo.content)
- time.sleep(5)
- save_wall_photo = self.vk_controller.save_wall_photo('images.jpg')
- saved_photo = 'photo' + str(save_wall_photo[0]['owner_id']) + '_' + str(
- save_wall_photo[0]['id'])
- saved_gallery += saved_photo + ','
- os.remove('images.jpg')
- message = '{}\nСсылка на оригинал:{}\n' \
- 'Вложение:{}\n{}\n{}'.format(
- animal_news['time_post'], animal_news['url_news'],
- animal_news.get('main_text', None),
- animal_news['description_news'],
- animal_news['heading'])
- self.vk_controller.wall_post(message, attachments=saved_gallery)
- else:
- message = '{}\nСсылка на оригинал:{}\nВложение:{}\n{}\n{}'.format(
- animal_news['time_post'], animal_news['url_news'],
- animal_news.get('main_text', None),
- animal_news['description_news'],
- animal_news['heading'])
- self.vk_controller.wall_post(message)
- except vk_api.VkApiError:
- logger.error(msg='Ошибка отправки новости в вк {},{}'
- .format(animal_news['description_news'],
- str(timezone.now())))
- NewestLogFileContent.objects.get_or_create(
- log_filename='commands.createnews',
- defaults={'content': log_db.read()[-100:-1]})
- def send_news(self, summ_new_news, animal_news):
- if summ_new_news != '':
- send_mail('новая новость епта', summ_new_news,
- settings.EMAIL_HOST_USER, ['paveligin1861@gmail.com'],
- fail_silently=False)
- elif summ_new_news == '':
- send_mail('нет новостей', 'новостей нет',
- settings.EMAIL_HOST_USER, ['paveligin1861@gmail.com'],
- fail_silently=False)
- else:
- logger.error(msg='Ошибка отправки новости на '
- 'ящик:{},{}'.format(animal_news['description_news'],
- timezone.now()))
- NewestLogFileContent.objects.get_or_create(
- defaults={'log_filename': 'commands.createnews',
- 'content': log_db.read()})
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement