Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.12 KB | None | 0 0
  1. import time
  2. import eventlet
  3. import requests
  4. import logging
  5. import telebot
  6.  
  7. # Каждый раз получаем по 10 последних записей со стены
  8. URL_VK = 'https://api.vk.com/method/wall.get?domain=itclub_psuti&count=10&filter=owner'
  9. FILENAME_VK = 'last_known_id.txt'
  10. BASE_POST_URL = 'https://vk.com/wall-17785357_2576'
  11.  
  12. BOT_TOKEN = '230505048:AAHBRzs0okgQetozpDn98d0093erM_sYGOs'
  13. CHANNEL_NAME = '@itclub_psuti'
  14.  
  15. # Если True, предполагается использование cron для запуска скрипта
  16. # Если False, процесс запускается и постоянно висит запущенный
  17. SINGLE_RUN = False
  18.  
  19. bot = telebot.TeleBot(BOT_TOKEN)
  20.  
  21. def get_data():
  22.     timeout = eventlet.Timeout(10)
  23.     try:
  24.         feed = requests.get(URL_VK)
  25.         return feed.json()
  26.     except eventlet.timeout.Timeout:
  27.         logging.warning('Got Timeout while retrieving VK JSON data. Cancelling...')
  28.         return None
  29.     finally:
  30.         timeout.cancel()
  31.  
  32. def send_new_posts(items, last_id):
  33.     for item in items:
  34.         if item['id'] <= last_id:
  35.             break
  36.         link = '{!s}{!s}'.format(BASE_POST_URL, item['id'])
  37.         bot.send_message(CHANNEL_NAME, link)
  38.         # Спим секунду, чтобы избежать разного рода ошибок и ограничений (на всякий случай!)
  39.         time.sleep(1)
  40.     return
  41.  
  42. def check_new_posts_vk():
  43.     # Пишем текущее время начала
  44.     logging.info('[VK] Started scanning for new posts')
  45.     with open(FILENAME_VK, 'rt') as file:
  46.         last_id = int(file.read())
  47.         if last_id is None:
  48.             logging.error('Could not read from storage. Skipped iteration.')
  49.             return
  50.         logging.info('Previous last_id is {!s}'.format(last_id))
  51.     try:
  52.         feed = get_data()
  53.         # Если ранее случился таймаут, пропускаем итерацию. Если всё нормально - парсим посты.
  54.         if feed is not None:
  55.             # 0 - это какое-то число, так что начинаем с 1
  56.             entries = feed['response'][1:]
  57.             try:
  58.                 # Если пост был закреплен, пропускаем его
  59.                 tmp = entries[0]['is_pinned']
  60.                 send_new_posts(entries[1:], last_id)
  61.             except KeyError:
  62.                 send_new_posts(entries, last_id)
  63.             # Записываем новую "верхушку" группы, чтобы не повторяться
  64.             with open(FILENAME_VK, 'wt') as file:
  65.                 try:
  66.                     tmp = entries[0]['is_pinned']
  67.                     # Если первый пост - закрепленный, то сохраняем ID второго
  68.                     file.write(str(entries[1]['id']))
  69.                     logging.info('New last_id (VK) is {!s}'.format((entries[1]['id'])))
  70.                 except KeyError:
  71.                     file.write(str(entries[0]['id']))
  72.                     logging.info('New last_id (VK) is {!s}'.format((entries[0]['id'])))
  73.     except Exception as ex:
  74.         logging.error('Exception of type {!s} in check_new_post(): {!s}'.format(type(ex).__name__, str(ex)))
  75.         pass
  76.     logging.info('[VK] Finished scanning')
  77.     return
  78.  
  79. if __name__ == '__main__':
  80.     # Избавляемся от спама в логах от библиотеки requests
  81.     logging.getLogger('requests').setLevel(logging.CRITICAL)
  82.     # Настраиваем наш логгер
  83.     logging.basicConfig(format='[%(asctime)s] %(filename)s:%(lineno)d %(levelname)s - %(message)s', level=logging.INFO,
  84.                         filename='bot_log.log', datefmt='%d.%m.%Y %H:%M:%S')
  85.     if not SINGLE_RUN:
  86.         while True:
  87.             check_new_posts_vk()
  88.             # Пауза в 4 минуты перед повторной проверкой
  89.             logging.info('[App] Script went to sleep.')
  90.             time.sleep(5)
  91.     else:
  92.         check_new_posts_vk()
  93.     logging.info('[App] Script exited.\n')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement