Code-Refactor

This commit is contained in:
Andreas Bielawski 2016-12-13 21:20:02 +01:00
parent 4d9a498e50
commit 39b9b6a23f

106
bot.py
View File

@ -4,28 +4,26 @@
# RSS Bot # RSS Bot
# Python 3 required # Python 3 required
import logging
import re import re
import redis
import feedparser
from json import loads
from configparser import ConfigParser from configparser import ConfigParser
from json import loads
from urllib.parse import urlparse
import feedparser
import redis
from bs4 import BeautifulSoup
from telegram import ChatAction, ParseMode from telegram import ChatAction, ParseMode
from telegram.error import TelegramError, Unauthorized, BadRequest, TimedOut, NetworkError, ChatMigrated
from telegram.ext import Updater, Job, CommandHandler, MessageHandler, Filters from telegram.ext import Updater, Job, CommandHandler, MessageHandler, Filters
from telegram.ext.dispatcher import run_async from telegram.ext.dispatcher import run_async
from telegram.error import (TelegramError, Unauthorized, BadRequest,
TimedOut, NetworkError, ChatMigrated)
import logging
from bs4 import BeautifulSoup
from urllib.parse import urlparse
# Bot Configuration # Bot Configuration
config = ConfigParser() config = ConfigParser()
config.read_file(open('config.ini')) config.read_file(open('config.ini'))
redis_conf = config['REDIS'] redis_conf = config['REDIS']
redis_db = redis_conf.get('db' , 0) redis_db = redis_conf.get('db', 0)
redis_host = redis_conf.get('host') redis_host = redis_conf.get('host')
redis_port = redis_conf.get('port', 6379) redis_port = redis_conf.get('port', 6379)
redis_socket = redis_conf.get('socket_path') redis_socket = redis_conf.get('socket_path')
@ -51,6 +49,7 @@ if not r.ping():
print('Konnte nicht mit Redis verbinden, prüfe deine Einstellungen') print('Konnte nicht mit Redis verbinden, prüfe deine Einstellungen')
quit() quit()
def is_number(s): def is_number(s):
try: try:
float(s) float(s)
@ -58,15 +57,18 @@ def is_number(s):
except ValueError: except ValueError:
return False return False
def remove_tags(html): def remove_tags(html):
return ''.join(BeautifulSoup(html, "html.parser").findAll(text=True)) return ''.join(BeautifulSoup(html, "html.parser").findAll(text=True))
def can_use(update): def can_use(update):
if update.message.from_user.id in admins: if update.message.from_user.id in admins:
return True return True
else: else:
return False return False
def cleanRSS(str): def cleanRSS(str):
str = str.replace('[…]', '') str = str.replace('[…]', '')
str = str.replace('[bilder]', '') str = str.replace('[bilder]', '')
@ -99,65 +101,74 @@ def cleanRSS(str):
str = re.sub('http://www\.serienjunkies.de/.*\.html', '', str) str = re.sub('http://www\.serienjunkies.de/.*\.html', '', str)
return str return str
def check_chat(bot, username): def check_chat(bot, username):
try: try:
return bot.getChat(username) return bot.getChat(username)
except: except:
return return
# Commands # Commands
@run_async @run_async
def start(bot, update): def start(bot, update):
if not can_use(update): if not can_use(update):
return return
bot.sendMessage( bot.sendMessage(
chat_id = update.message.chat_id, chat_id=update.message.chat_id,
text = '<b>Willkommen beim RSS-Bot!</b>\nLass uns anfangen! Sende /hilfe, um zu starten.', text='<b>Willkommen beim RSS-Bot!</b>\nLass uns anfangen! Sende /hilfe, um zu starten.',
reply_to_message_id = update.message.message_id, reply_to_message_id=update.message.message_id,
parse_mode = ParseMode.HTML parse_mode=ParseMode.HTML
) )
@run_async @run_async
def help(bot, update): def help(bot, update):
if not can_use(update): if not can_use(update):
return return
bot.sendMessage( bot.sendMessage(
chat_id = update.message.chat_id, chat_id=update.message.chat_id,
text = '<b>/rss</b>: Abonnierte Feeds anzeigen\n<b>/sub</b> <i>Feed-URL</i>: Feed abonnieren\n<b>/del</b> <i>n</i>: Feed löschen', text='<b>/rss</b>: Abonnierte Feeds anzeigen\n<b>/sub</b> <i>Feed-URL</i>: Feed abonnieren\n<b>/del</b> <i>n</i>: Feed löschen',
reply_to_message_id = update.message.message_id, reply_to_message_id=update.message.message_id,
parse_mode = ParseMode.HTML parse_mode=ParseMode.HTML
) )
def subscribe_to_rss(bot, update, args): def subscribe_to_rss(bot, update, args):
if not can_use(update): if not can_use(update):
return return
if len(args) < 1: if len(args) < 1:
bot.sendMessage(chat_id=update.message.chat_id, text='Bitte gebe eine Feed-URL ein.', reply_to_message_id=update.message.message_id) bot.sendMessage(chat_id=update.message.chat_id, text='Bitte gebe eine Feed-URL ein.',
reply_to_message_id=update.message.message_id)
return return
feed_url = args[0] feed_url = args[0]
is_url = re.search("http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+", feed_url) is_url = re.search("http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+", feed_url)
if not is_url: if not is_url:
bot.sendMessage(chat_id=update.message.chat_id, text='Dies ist keine URL.', reply_to_message_id=update.message.message_id) bot.sendMessage(chat_id=update.message.chat_id, text='Dies ist keine URL.',
reply_to_message_id=update.message.message_id)
return return
if len(args) > 1: if len(args) > 1:
username = args[1] username = args[1]
chat_info = check_chat(bot, username) chat_info = check_chat(bot, username)
if not chat_info: if not chat_info:
bot.sendMessage(chat_id=update.message.chat_id, text='Dieser Kanal existiert nicht!', reply_to_message_id=update.message.message_id) bot.sendMessage(chat_id=update.message.chat_id, text='Dieser Kanal existiert nicht!',
reply_to_message_id=update.message.message_id)
return return
chat_id = str(chat_info.id) chat_id = str(chat_info.id)
else: else:
chat_id = str(update.message.chat_id) chat_id = str(update.message.chat_id)
if r.sismember('pythonbot:rss:' + chat_id, feed_url): if r.sismember('pythonbot:rss:' + chat_id, feed_url):
bot.sendMessage(chat_id=update.message.chat_id, text='Dieser Feed wurde bereits abonniert.', reply_to_message_id=update.message.message_id) bot.sendMessage(chat_id=update.message.chat_id, text='Dieser Feed wurde bereits abonniert.',
reply_to_message_id=update.message.message_id)
return return
bot.sendChatAction(update.message.chat_id, action=ChatAction.TYPING) bot.sendChatAction(update.message.chat_id, action=ChatAction.TYPING)
feed_data = feedparser.parse(feed_url) feed_data = feedparser.parse(feed_url)
if not 'link' in feed_data.feed: if not 'link' in feed_data.feed:
bot.sendMessage(chat_id=update.message.chat_id, text='Kein gültiger Feed.',reply_to_message_id=update.message.message_id) bot.sendMessage(chat_id=update.message.chat_id, text='Kein gültiger Feed.',
reply_to_message_id=update.message.message_id)
return return
if not 'title' in feed_data.feed: if not 'title' in feed_data.feed:
@ -177,48 +188,53 @@ def subscribe_to_rss(bot, update, args):
r.sadd('pythonbot:rss:' + feed_url + ':subs', int(chat_id)) r.sadd('pythonbot:rss:' + feed_url + ':subs', int(chat_id))
r.sadd('pythonbot:rss:' + chat_id, feed_url) r.sadd('pythonbot:rss:' + chat_id, feed_url)
bot.sendMessage( bot.sendMessage(
chat_id = update.message.chat_id, chat_id=update.message.chat_id,
text = '<b>' + feed_title + '</b> hinzugefügt!', text='<b>' + feed_title + '</b> hinzugefügt!',
reply_to_message_id = update.message.message_id, reply_to_message_id=update.message.message_id,
parse_mode = ParseMode.HTML parse_mode=ParseMode.HTML
) )
def unsubscribe_rss(bot, update, args): def unsubscribe_rss(bot, update, args):
if not can_use(update): if not can_use(update):
return return
if len(args) < 1: if len(args) < 1:
bot.sendMessage(chat_id=update.message.chat_id, text='Bitte gebe eine Nummer ein', reply_to_message_id=update.message.message_id) bot.sendMessage(chat_id=update.message.chat_id, text='Bitte gebe eine Nummer ein',
reply_to_message_id=update.message.message_id)
return return
if len(args) > 1: if len(args) > 1:
username = args[1] username = args[1]
chat_info = check_chat(bot, username) chat_info = check_chat(bot, username)
if not chat_info: if not chat_info:
bot.sendMessage(chat_id=update.message.chat_id, text='Dieser Kanal existiert nicht!', reply_to_message_id=update.message.message_id) bot.sendMessage(chat_id=update.message.chat_id, text='Dieser Kanal existiert nicht!',
reply_to_message_id=update.message.message_id)
return return
chat_id = str(chat_info.id) chat_id = str(chat_info.id)
else: else:
chat_id = str(update.message.chat_id) chat_id = str(update.message.chat_id)
if not is_number(args[0]): if not is_number(args[0]):
bot.sendMessage(chat_id=update.message.chat_id, text='Bitte gebe eine Nummer ein.', reply_to_message_id=update.message.message_id) bot.sendMessage(chat_id=update.message.chat_id, text='Bitte gebe eine Nummer ein.',
reply_to_message_id=update.message.message_id)
return return
uhash = 'pythonbot:rss:' + chat_id uhash = 'pythonbot:rss:' + chat_id
n = int(args[0]) n = int(args[0])
subs = list(r.smembers(uhash)) subs = list(r.smembers(uhash))
if n < 1 or n > len(subs): if n < 1 or n > len(subs):
bot.sendMessage(chat_id=update.message.chat_id, text='Abonnement-ID ist zu hoch.', reply_to_message_id=update.message.message_id) bot.sendMessage(chat_id=update.message.chat_id, text='Abonnement-ID ist zu hoch.',
reply_to_message_id=update.message.message_id)
return return
sub = subs[n-1] sub = subs[n - 1]
lhash = 'pythonbot:rss:' + sub + ':subs' lhash = 'pythonbot:rss:' + sub + ':subs'
r.srem(uhash, sub) r.srem(uhash, sub)
r.srem(lhash, int(chat_id)) r.srem(lhash, int(chat_id))
bot.sendMessage( bot.sendMessage(
chat_id = update.message.chat_id, chat_id=update.message.chat_id,
text = '<b>' + sub + '</b> entfernt.', text='<b>' + sub + '</b> entfernt.',
reply_to_message_id = update.message.message_id, reply_to_message_id=update.message.message_id,
parse_mode = ParseMode.HTML parse_mode=ParseMode.HTML
) )
left = r.smembers(lhash) left = r.smembers(lhash)
if len(left) < 1: # no one subscribed, remove it if len(left) < 1: # no one subscribed, remove it
@ -232,9 +248,10 @@ def get_rss_list(chat_id, chat_name):
return '<b>Keine Feeds abonniert!</b>' return '<b>Keine Feeds abonniert!</b>'
text = '<b>' + chat_name + '</b> hat abonniert:\n' text = '<b>' + chat_name + '</b> hat abonniert:\n'
for n, feed in enumerate(subs): for n, feed in enumerate(subs):
text = text + str(n+1) + ') ' + feed + '\n' text = text + str(n + 1) + ') ' + feed + '\n'
return text return text
@run_async @run_async
def list_rss(bot, update, args): def list_rss(bot, update, args):
if not can_use(update): if not can_use(update):
@ -243,7 +260,8 @@ def list_rss(bot, update, args):
username = args[0] username = args[0]
chat_info = check_chat(bot, username) chat_info = check_chat(bot, username)
if not chat_info: if not chat_info:
bot.sendMessage(chat_id=update.message.chat_id, text='Dieser Kanal existiert nicht!', reply_to_message_id=update.message.message_id) bot.sendMessage(chat_id=update.message.chat_id, text='Dieser Kanal existiert nicht!',
reply_to_message_id=update.message.message_id)
return return
rss_list = get_rss_list(str(chat_info.id), chat_info.title) rss_list = get_rss_list(str(chat_info.id), chat_info.title)
else: else:
@ -254,14 +272,15 @@ def list_rss(bot, update, args):
rss_list = get_rss_list(str(update.message.chat_id), chat_name) rss_list = get_rss_list(str(update.message.chat_id), chat_name)
bot.sendMessage( bot.sendMessage(
chat_id=update.message.chat_id, chat_id=update.message.chat_id,
text = rss_list, text=rss_list,
reply_to_message_id=update.message.message_id, reply_to_message_id=update.message.message_id,
parse_mode=ParseMode.HTML parse_mode=ParseMode.HTML
) )
def get_new_entries(last, new_entries): def get_new_entries(last, new_entries):
entries = [] entries = []
for k,v in enumerate(new_entries): for k, v in enumerate(new_entries):
if 'id' in v: if 'id' in v:
if v.id == last: if v.id == last:
return entries return entries
@ -274,16 +293,18 @@ def get_new_entries(last, new_entries):
entries.append(v) entries.append(v)
return entries return entries
def manually_check_rss(bot, update): def manually_check_rss(bot, update):
if not can_use(update): if not can_use(update):
return return
check_rss(bot, '') check_rss(bot, '')
bot.sendMessage( bot.sendMessage(
chat_id=update.message.chat_id, chat_id=update.message.chat_id,
text = 'Ausgeführt.', text='Ausgeführt.',
reply_to_message_id=update.message.message_id reply_to_message_id=update.message.message_id
) )
@run_async @run_async
def check_rss(bot, job): def check_rss(bot, job):
keys = list(r.keys('pythonbot:rss:*:subs')) keys = list(r.keys('pythonbot:rss:*:subs'))
@ -357,6 +378,7 @@ def check_rss(bot, job):
print('HTTP-Fehler: ' + str(feed_data.status)) print('HTTP-Fehler: ' + str(feed_data.status))
print('----------') print('----------')
def error(bot, update, error): def error(bot, update, error):
logger.warn('Update "%s" verursachte Fehler "%s"' % (update, error)) logger.warn('Update "%s" verursachte Fehler "%s"' % (update, error))