2012-06-30 02:06:59 +00:00
|
|
|
# coding=utf-8
|
|
|
|
|
|
|
|
from datetime import datetime
|
|
|
|
from datetime import timedelta
|
|
|
|
import http.client
|
|
|
|
import hashlib
|
|
|
|
import socket
|
|
|
|
import sys
|
|
|
|
import traceback
|
|
|
|
from urllib.parse import unquote
|
|
|
|
|
|
|
|
from .atom import Atom
|
|
|
|
|
|
|
|
class Site:
|
|
|
|
def __init__(self, item):
|
|
|
|
self.server = item.getAttribute("server")
|
|
|
|
self.page = item.getAttribute("page")
|
|
|
|
if len(self.page) <= 0 or self.page[0] != "/":
|
|
|
|
self.page = "/" + self.page
|
|
|
|
if item.hasAttribute("type"):
|
|
|
|
self.type = item.getAttribute("type")
|
|
|
|
else:
|
|
|
|
self.type = "hash"
|
|
|
|
self.message = item.getAttribute("message")
|
|
|
|
|
|
|
|
if item.hasAttribute("time"):
|
|
|
|
self.updateTime = item.getInt("time")
|
|
|
|
else:
|
|
|
|
self.updateTime = 60
|
|
|
|
self.lastChange = datetime.now()
|
|
|
|
self.lastpage = None
|
|
|
|
|
|
|
|
self.channels = list()
|
|
|
|
for channel in item.getNodes('channel'):
|
|
|
|
self.channels.append(channel.getAttribute("name"))
|
|
|
|
|
|
|
|
self.categories = dict()
|
|
|
|
for category in item.getNodes('category'):
|
|
|
|
self.categories[category.getAttribute("term")] = category.getAttribute("part")
|
|
|
|
|
|
|
|
@property
|
|
|
|
def update(self):
|
|
|
|
if self.lastpage is None:
|
|
|
|
return self.lastChange
|
|
|
|
else:
|
|
|
|
return self.lastChange + timedelta(seconds=self.updateTime)
|
|
|
|
|
|
|
|
@property
|
|
|
|
def url(self):
|
|
|
|
return self.server + self.page
|
|
|
|
|
|
|
|
def send_message (self, msg):
|
|
|
|
global SRVS
|
|
|
|
if len(self.channels) > 0:
|
|
|
|
for server in SRVS.keys():
|
|
|
|
for chan in self.channels:
|
|
|
|
SRVS[server].send_msg (chan, msg)
|
|
|
|
else:
|
|
|
|
for server in SRVS.keys():
|
|
|
|
SRVS[server].send_global (msg)
|
|
|
|
|
|
|
|
def treat_atom (self, content):
|
|
|
|
change=False
|
|
|
|
f = Atom(content)
|
|
|
|
if self.lastpage is not None:
|
|
|
|
diff = self.lastpage.diff (f)
|
|
|
|
if len(diff) > 0:
|
|
|
|
print ("[%s] Page differ!"%self.server)
|
|
|
|
diff.reverse()
|
|
|
|
for d in diff:
|
|
|
|
if self.message.count("%s") == 2 and len(self.categories) > 0:
|
|
|
|
if d.category is None or d.category not in self.categories:
|
|
|
|
messageI = self.message % (self.categories[""], "%s")
|
|
|
|
else:
|
|
|
|
messageI = self.message % (self.categories[d.category], "%s")
|
2012-07-16 22:43:57 +00:00
|
|
|
self.send_message (messageI % d.link)
|
2012-06-30 02:06:59 +00:00
|
|
|
elif self.message.count("%s") == 2:
|
|
|
|
if f.id == youtube.idAtom:
|
2012-07-16 22:43:57 +00:00
|
|
|
youtube.send_global (d.link2, self.message % (unquote(d.title), d.link))
|
2012-06-30 02:06:59 +00:00
|
|
|
else:
|
2012-07-16 22:43:57 +00:00
|
|
|
self.send_message (self.message % (unquote(d.title), d.link))
|
2012-06-30 02:06:59 +00:00
|
|
|
elif self.message.count("%s") == 1:
|
|
|
|
self.send_message(self.message % unquote (d.title))
|
|
|
|
else:
|
|
|
|
self.send_message(self.message)
|
|
|
|
change=True
|
|
|
|
return (f, change)
|
|
|
|
|
|
|
|
def check (self):
|
|
|
|
try:
|
|
|
|
#print ("Check %s"%(self.url))
|
|
|
|
(status, content) = getPage(self.server, self.page)
|
|
|
|
if content is None:
|
|
|
|
return
|
|
|
|
|
|
|
|
if self.type == "atom":
|
|
|
|
(self.lastpage, change) = self.treat_atom(content)
|
|
|
|
else:
|
|
|
|
hash = hashlib.sha224(content).hexdigest()
|
|
|
|
if hash != self.lastpage:
|
|
|
|
if self.lastpage is not None:
|
|
|
|
self.send_message (self.message)
|
|
|
|
self.lastpage = hash
|
|
|
|
|
|
|
|
self.lastChange = datetime.now()
|
|
|
|
|
|
|
|
# if self.updateTime < 10:
|
|
|
|
# self.updateTime = 10
|
|
|
|
# if self.updateTime > 400:
|
|
|
|
# self.updateTime = 400
|
|
|
|
except:
|
|
|
|
print ("Une erreur est survenue lors de la récupération de la page " + self.server + "/" + self.page)
|
|
|
|
exc_type, exc_value, exc_traceback = sys.exc_info()
|
|
|
|
traceback.print_exception(exc_type, exc_value, exc_traceback)
|
|
|
|
self.updateTime *= 2
|
|
|
|
|
|
|
|
|
|
|
|
def getPage(s, p):
|
2012-07-27 16:18:13 +00:00
|
|
|
conn = http.client.HTTPConnection(s, timeout=10)
|
2012-06-30 02:06:59 +00:00
|
|
|
try:
|
|
|
|
conn.request("GET", p)
|
|
|
|
|
|
|
|
res = conn.getresponse()
|
|
|
|
data = res.read()
|
|
|
|
except:
|
|
|
|
print ("[%s] impossible de récupérer la page %s."%(s, p))
|
|
|
|
return (None, None)
|
|
|
|
|
|
|
|
conn.close()
|
|
|
|
return (res.status, data)
|