Changeset 6 in feed2telegram for trunk


Ignore:
Timestamp:
07/30/17 12:28:35 (7 years ago)
Author:
cheese
Message:

#1 callback is called for only new entries

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/feed2telegram.py

    r4 r6  
    11#-*- coding: utf-8 -*-
     2import datetime
     3import email
    24import json
    35import os
    46import sys
    57import threading
     8import time
    69import traceback
    710import urlparse
     
    3336            header = {
    3437                'accept': 'application/x-www-form-urlencoded',
    35                 'agent': ('Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
    36                           'AppleWebKit/537.36 (KHTML, like Gecko) '
    37                           'Chrome/59.0.3071.115 Safari/537.36'),
    3838            }
    3939            return header
     
    114114        return self.feed
    115115
     116class Datetime:
     117    def __init__(self):
     118        self.datetime = None
     119
     120    def setRfc2822(self, value):
     121        parsed = email.utils.parsedate(value)
     122        self.datetime = datetime.datetime(*parsed[:6])
     123        return self
     124
     125    def toTimestamp(self):
     126        timetuple = self.datetime.timetuple()
     127        return time.mktime(timetuple)
     128
    116129class Feed2Telegram:
    117130    def __init__(self,
    118131                 feed_url,              # required
    119132                 telegram_token,        # required
    120                  callback_get_iterator, # required, method returns iterable object from dictionary parsed by feedparser, prototype: def get_iterator(feed)
    121                  callback_get_message,  # required, method returns a message to send with an object of iterable object , prototype: def get_data(obj)
     133                 callback_get_message,  # required
     134                 callback_get_entries=lambda entries: entries,
    122135                 check_interval=60*60,
     136                 new_entries_only=False,
    123137                 send_error=True,
    124138                 continue_on_error=False,
     
    130144        self.telegram = Telegram(self.token)
    131145
    132         self.get_iterator = callback_get_iterator
    133         self.get_message  = callback_get_message
    134 
     146        self.get_message = callback_get_message
     147        self.get_entries = callback_get_entries
     148
     149        self.new_entries_only = new_entries_only
    135150        self.send_error = send_error
    136151        self.continue_on_error = continue_on_error
     
    141156
    142157        self.stop_event = threading.Event()
     158        self.last_modified = None
     159
     160    def isSendingEntry(self, entry):
     161        if self.new_entries_only and self.last_modified:
     162            published = Datetime().setRfc2822(entry.published).toTimestamp()
     163            last      = Datetime().setRfc2822(self.last_modified).toTimestamp()
     164
     165            if published > last:
     166                return True
     167
     168        return False
    143169
    144170    def run(self):
    145171        while not self.stop_event.is_set():
    146172            try:
     173                self.last_modified = self.feed.modified
    147174                feed = self.feed.get()
    148175
    149                 for obj in self.get_iterator(feed):
     176                for entry in self.get_entries(feed.entries):
    150177                    if self.stop_event.is_set():
    151178                        break
    152179
    153                     message = self.get_message(obj)
     180                    if not self.isSendingEntry(entry):
     181                        continue
     182
     183                    message = self.get_message(entry)
    154184                    self.telegram.sendMessage(message)
    155185
    156                 else:
    157                     self.feed.save()
     186                self.feed.save()
    158187
    159188            except:
  • trunk/implements/hikarinoakariost_feeder.py

    r5 r6  
    77Feed2Telegram(url,
    88              token,
    9               lambda feed : reversed(feed.entries),
    10               lambda entry: entry['link'],
    11               continue_on_error=True
     9              lambda entry  : entry['link'],
     10              lambda entries: reversed(entries),
     11              new_entries_only=True,
     12              continue_on_error=True,
    1213             ).start()
    1314
Note: See TracChangeset for help on using the changeset viewer.