Advertisement
a_igin

Untitled

Nov 28th, 2020
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.11 KB | None | 0 0
  1. from listanimal.parseranimal import RtNewsAnimalParser
  2. from django.core.management.base import BaseCommand
  3. from listanimal.models import NewestLogFileContent, AnimalNews
  4. from django.core.mail import send_mail
  5. import vk_api, logging, time, os, requests
  6. from django.conf import settings
  7. from django.utils import timezone
  8.  
  9. logger = logging.getLogger('commands.createnews')
  10. log_db = open('logger/news.log', 'r')
  11.  
  12.  
  13. class VKController:
  14. '''
  15. Класс для интеграции с соцсетью VK.com
  16. '''
  17. group_id = settings.GROUP_ID
  18. vk_session = vk_api.VkApi(token=settings.ACESS_TOKEN_ATTACHEMENT)
  19.  
  20. def wall_post(self, msg: str, attachments=None):
  21. '''
  22. :param msg: Строка с сообщением, которое требуется опубликовать в посте группы
  23. :param attachments: Список вложений к посту ВК
  24.  
  25. :return:
  26. '''
  27. data = {
  28. 'owner_id': -self.group_id,
  29. 'from_group': 1,
  30. 'message': msg
  31. }
  32. if attachments is not None:
  33. data['attachments'] = attachments
  34. response = self.vk_session.method('wall.post',
  35. data)
  36. return response
  37.  
  38. def get_wall_upload_server(self):
  39. '''
  40. Получить сервер ВК для загрузки изображений
  41. :return:
  42. '''
  43. upload_url = self.vk_session.method('photos.getWallUploadServer',
  44. {'group_id': self.group_id,
  45. 'v': 5.95})['upload_url']
  46. return upload_url
  47.  
  48. def _upload_photo(self, filepath):
  49. '''
  50. Сохранить фото на сервере ВК
  51. :param filepath: Путь к файлу
  52. :return: Объект requests.Response
  53. '''
  54. upload_url = self.get_wall_upload_server()
  55. request = requests.post(upload_url, files={'file': open(filepath, 'rb')})
  56. return request
  57.  
  58. def save_wall_photo(self, filepath):
  59. '''
  60. Загрузить файл на сервер ВК и закрепить его за указанной группой
  61. :param filepath:
  62. :return:
  63. '''
  64. upload_response = self._upload_photo(filepath)
  65. save_wall_photo = self.vk_session.method('photos.saveWallPhoto',
  66. {'group_id': self.group_id, 'v': 5.95,
  67. 'photo': upload_response.json()['photo'],
  68. 'server': upload_response.json()['server'],
  69. 'hash': upload_response.json()['hash']})
  70. return save_wall_photo
  71.  
  72.  
  73. class Command(BaseCommand):
  74. parser = RtNewsAnimalParser()
  75. vk_controller = VKController()
  76.  
  77. def handle(self, *args, **options):
  78. self.createnews()
  79.  
  80. def createnews(self):
  81. summ_new_news = ''
  82. news = RtNewsAnimalParser.rt_news_animal(self)
  83. for animal_news in news:
  84. create_object, is_created = AnimalNews.objects.get_or_create(heading=animal_news['heading'],
  85. defaults=animal_news)
  86. if is_created:
  87. self.vk_wall_post_news(animal_news, summ_new_news)
  88. self.send_news(summ_new_news, animal_news)
  89.  
  90. def vk_wall_post_news(self, animal_news, summ_new_news):
  91. summ_new_news += '\n' + ' Заголовок статьи:' + animal_news['heading']
  92. try:
  93. if animal_news.get('url_media', None) is not None:
  94. if animal_news['url_media'].endswith('.mp4'):
  95. message = '{}\nСсылка на оригинал:{}\nВложение:{}\n{}\n{}\n' \
  96. 'Ссылка на видео:{}'.format(
  97. animal_news['time_post'], animal_news['url_news'],
  98. animal_news.get('main_text', None),
  99. animal_news['description_news'],
  100. animal_news['heading'], animal_news['url_media'])
  101.  
  102. self.vk_controller.wall_post(message)
  103. else:
  104. photo = requests.get(animal_news['url_media'])
  105. images = open('images.jpg', 'wb')
  106. images.write(photo.content)
  107.  
  108. save_wall_photo = self.vk_controller.save_wall_photo('images.jpg')
  109.  
  110. owner_id = str(save_wall_photo[0]['owner_id'])
  111. wall_photo_id = str(save_wall_photo[0]['id'])
  112. saved_photo_name = 'photo{}_{}'.format(owner_id, wall_photo_id)
  113.  
  114. message = '{}\nСсылка на оригинал:{}\nВложение:{}\n{}\n{}'.format(
  115. animal_news['time_post'], animal_news['url_news'],
  116. animal_news.get('main_text', None),
  117. animal_news['description_news'],
  118. animal_news['heading'])
  119. self.vk_controller.wall_post(message, attachments=saved_photo_name)
  120. os.remove('images.jpg')
  121. elif animal_news.get('gallery_img', None) is not None:
  122. saved_gallery = ''
  123. for one_img in animal_news['gallery_img']:
  124. photo = requests.get(one_img.replace(' ', ''))
  125. images = open('images.jpg', 'wb')
  126. images.write(photo.content)
  127. time.sleep(5)
  128. save_wall_photo = self.vk_controller.save_wall_photo('images.jpg')
  129. saved_photo = 'photo' + str(save_wall_photo[0]['owner_id']) + '_' + str(
  130. save_wall_photo[0]['id'])
  131. saved_gallery += saved_photo + ','
  132. os.remove('images.jpg')
  133.  
  134. message = '{}\nСсылка на оригинал:{}\n' \
  135. 'Вложение:{}\n{}\n{}'.format(
  136. animal_news['time_post'], animal_news['url_news'],
  137. animal_news.get('main_text', None),
  138. animal_news['description_news'],
  139. animal_news['heading'])
  140. self.vk_controller.wall_post(message, attachments=saved_gallery)
  141.  
  142. else:
  143. message = '{}\nСсылка на оригинал:{}\nВложение:{}\n{}\n{}'.format(
  144. animal_news['time_post'], animal_news['url_news'],
  145. animal_news.get('main_text', None),
  146. animal_news['description_news'],
  147. animal_news['heading'])
  148.  
  149. self.vk_controller.wall_post(message)
  150.  
  151. except vk_api.VkApiError:
  152. logger.error(msg='Ошибка отправки новости в вк {},{}'
  153. .format(animal_news['description_news'],
  154. str(timezone.now())))
  155. NewestLogFileContent.objects.get_or_create(
  156. log_filename='commands.createnews',
  157. defaults={'content': log_db.read()[-100:-1]})
  158.  
  159. def send_news(self, summ_new_news, animal_news):
  160.  
  161. if summ_new_news != '':
  162. send_mail('новая новость епта', summ_new_news,
  163. settings.EMAIL_HOST_USER, ['paveligin1861@gmail.com'],
  164. fail_silently=False)
  165. elif summ_new_news == '':
  166. send_mail('нет новостей', 'новостей нет',
  167. settings.EMAIL_HOST_USER, ['paveligin1861@gmail.com'],
  168. fail_silently=False)
  169. else:
  170. logger.error(msg='Ошибка отправки новости на '
  171. 'ящик:{},{}'.format(animal_news['description_news'],
  172. timezone.now()))
  173. NewestLogFileContent.objects.get_or_create(
  174. defaults={'log_filename': 'commands.createnews',
  175. 'content': log_db.read()})
  176.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement