From d8184327f5ab831b296b945cddb60160d4386735 Mon Sep 17 00:00:00 2001 From: Luke Murphy Date: Thu, 6 Feb 2020 15:29:18 +0100 Subject: [PATCH] Initiating the bots repository --- README.md | 3 + logbot/README.md | 15 ++ logbot/logbot.py | 218 ++++++++++++++++++++++ xmpp.streambot/README.md | 38 ++++ xmpp.streambot/avatar.png | Bin 0 -> 104290 bytes xmpp.streambot/streambot.py | 258 ++++++++++++++++++++++++++ xmpp.streambot/streambot.sleekxmpp.py | 132 +++++++++++++ 7 files changed, 664 insertions(+) create mode 100644 README.md create mode 100644 logbot/README.md create mode 100644 logbot/logbot.py create mode 100644 xmpp.streambot/README.md create mode 100644 xmpp.streambot/avatar.png create mode 100644 xmpp.streambot/streambot.py create mode 100644 xmpp.streambot/streambot.sleekxmpp.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..16e2d58 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# bots + +All our bots. diff --git a/logbot/README.md b/logbot/README.md new file mode 100644 index 0000000..33b575a --- /dev/null +++ b/logbot/README.md @@ -0,0 +1,15 @@ +# logbot + +A small XMPP bot written in Python (using the slixmpp library) that logs all images and messages with the mentioning of *@bot* to an HTML page, to allow collaborative log writing over time. + +To run it: + + $ python3 logbot.py + +Dependencies: + + $ sudo pip3 install slixmpp beautifulsoup4 + +--- + +That's all for now! diff --git a/logbot/logbot.py b/logbot/logbot.py new file mode 100644 index 0000000..06bb961 --- /dev/null +++ b/logbot/logbot.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# To run this bot: +# $ python3 logbot.py +# The output folder of this bot currently is: /var/www/logs/digital-autonomy + +import logging +from getpass import getpass +from argparse import ArgumentParser + +import slixmpp +import ssl, os, requests, urllib + +class MUCBot(slixmpp.ClientXMPP): + """ + A simple Slixmpp bot that will save images + and messages that are marked with @bot to a folder. + """ + + def __init__(self, jid, password, room, nick, output): + slixmpp.ClientXMPP.__init__(self, jid, password) + + self.room = room + self.nick = nick + self.output = output + + # The session_start event will be triggered when + # the bot establishes its connection with the server + # and the XML logs are ready for use. We want to + # listen for this event so that we we can initialize + # our roster. + self.add_event_handler("session_start", self.start) + + # The groupchat_message event is triggered whenever a message + # stanza is received from any chat room. If you also also + # register a handler for the 'message' event, MUC messages + # will be processed by both handlers. + self.add_event_handler("groupchat_message", self.muc_message) + + + def start(self, event): + self.get_roster() + self.send_presence() + + # https://xmpp.org/extensions/xep-0045.html + self.plugin['xep_0045'].join_muc(self.room, + self.nick, + # If a room password is needed, use: + # password=the_room_password, + wait=True) + + # Send a message to the room + self.send_message(mto=self.room, mbody='Hello! Logbot here. I\'m here to log all the images that are send to this group. You can also log text messages, by including @bot in your message. Happy logging! PS. you can access the logs at https://vvvvvvaria.org/logs/', mtype='groupchat') + + def muc_message(self, msg): + # Some inspection commands + #print('Message: {}'.format(msg)) + + # Always check that a message is not the bot itself, otherwise you will create an infinite loop responding to your own messages. + if msg['mucnick'] != self.nick: + + # Check if output folder exists + if not os.path.exists(self.output): + os.mkdir(self.output) + + # Check if an OOB URL is included in the stanza (which is how an image is sent) + # (OOB object - https://xmpp.org/extensions/xep-0066.html#x-oob) + if len(msg['oob']['url']) > 0: + + # Send a reply + self.send_message(mto=self.room, + mbody="Super, our log is growing. Your image is added!", + mtype='groupchat') + + # Save the image to the output folder + url = msg['oob']['url'] # grep the url in the message + filename = os.path.basename(url) # grep the filename in the url + output_path = os.path.join(self.output, filename) + u = urllib.request.urlopen(url) # read the image data + f = open(output_path, 'wb') # open the output file + f.write(u.read()) # write image to file + f.close() # close the output file + + # Add the image to the log + img = ''.format(filename) + log = 'log.html' + log_path = os.path.join(self.output, log) + f = open(log_path, 'a+') + f.write(img+'\n') + f.close() + + + # Include messages in the log (only when '@bot' is used in the message) + if '@bot' in msg['body']: + + # reply from the bot + self.send_message(mto=self.room, + mbody="Noted! And added to the log. Thanks {}!".format(msg['mucnick']), + mtype='groupchat') + + # Add the message to the log! + message = '

{}

'.format(msg['body'].replace('@bot','')) + log = 'log.html' + log_path = os.path.join(self.output, log) + f = open(log_path, 'a+') + f.write(message+'\n') + f.close() + + if '/book' in msg['body']: # Check if this is a book ... + + self.send_message(mto=self.room, + mbody="Oh a book, that's cool! Thanks {}!".format(msg['mucnick']), + mtype='groupchat') + + # Start of book feature + from bs4 import BeautifulSoup + import re + + book = msg['body'].replace('@bot', '').replace('/book', '') + book = re.sub(' +', ' ', book) # remove double spaces + book = book.lstrip().rstrip() # remove spaces at the beginning and at the end + book = book.replace(' ', '+').lower() # turn space into + and lowercase + + page_link = 'https://www.worldcat.org/search?q={}&qt=results_page'.format(book) + + page_response = requests.get(page_link, timeout=5) + + page_content = BeautifulSoup(page_response.content, "html.parser") + + try: + book_title = page_content.findAll("div", {"class": "name"})[0].text + book_author = page_content.findAll("div", {"class": "author"})[0].text + book_publisher = page_content.findAll("div", {"class": "publisher"})[0].text + + response = 'BOOK: ' + book_title + ' ' + book_author + ' ' + book_publisher + + book_found = True + + except IndexError: + + book_found = False + + if book_found: + + # Add message to log + message = 'BOOK: ' + book_title + ' ' + book_author + ' ' + book_publisher + log = 'log.html' + log_path = os.path.join(self.output, log) + f = open(log_path, 'a+') + f.write(message+'\n') + f.close() + + self.send_message(mto=self.room, mbody='Hope this was the book you were looking for: ' + book_title + ' ' + book_author + ' ' + book_publisher, mtype='groupchat') + + else: + + self.send_message(mto=self.room, mbody='Sorry, no book found!', mtype='groupchat') + + + + +if __name__ == '__main__': + # Setup the command line arguments. + parser = ArgumentParser() + + # output verbosity options. + parser.add_argument("-q", "--quiet", help="set logging to ERROR", + action="store_const", dest="loglevel", + const=logging.ERROR, default=logging.INFO) + parser.add_argument("-d", "--debug", help="set logging to DEBUG", + action="store_const", dest="loglevel", + const=logging.DEBUG, default=logging.INFO) + + # JID and password options. + parser.add_argument("-j", "--jid", dest="jid", + help="JID to use") + parser.add_argument("-p", "--password", dest="password", + help="password to use") + parser.add_argument("-r", "--room", dest="room", + help="MUC room to join") + parser.add_argument("-n", "--nick", dest="nick", + help="MUC nickname") + + # output folder for images + parser.add_argument("-o", "--output", dest="output", + help="output folder, this is where the files are stored", + type=str) + + args = parser.parse_args() + + # Setup logging. + logging.basicConfig(level=args.loglevel, + format='%(levelname)-8s %(message)s') + + if args.jid is None: + args.jid = input("XMPP address: ") + if args.password is None: + args.password = getpass("Password: ") + if args.room is None: + args.room = input("MUC room: ") + if args.nick is None: + args.nick = input("MUC nickname: ") + if args.output is None: + args.output = input("Output folder: ") + + # Setup the MUCBot and register plugins. Note that while plugins may + # have interdependencies, the order in which you register them does + # not matter. + xmpp = MUCBot(args.jid, args.password, args.room, args.nick, args.output) + xmpp.register_plugin('xep_0030') # Service Discovery + xmpp.register_plugin('xep_0045') # Multi-User Chat + xmpp.register_plugin('xep_0199') # XMPP Ping + xmpp.register_plugin('xep_0066') # Process URI's (files, images) + + # Connect to the XMPP server and start processing XMPP stanzas. + xmpp.connect() + xmpp.process() diff --git a/xmpp.streambot/README.md b/xmpp.streambot/README.md new file mode 100644 index 0000000..4ac505d --- /dev/null +++ b/xmpp.streambot/README.md @@ -0,0 +1,38 @@ +# xmpp.streambot + +This is the home of Varia's xmpp.streambot! + +When the streambot is listening ... it saves all images that are sent to the muc members@muc.vvvvvvaria.org and streams them to [vvvvvvaria.org/stream/](https://vvvvvvaria.org/stream/). + +*archivist.py* was written by Ruben van der Ven during Relearn 2017. + +*streambot.py* is based on *archivist.py*. It is a custom Varia bot that will communicate one day with our Pelican plugins-custom/stream plugin. :) + + +# run streambot on the server + +To start the streambot: + + sudo systemctl start streambot.service + +To check its status: + + sudo systemctl status streambot.service + +To stop it: + + sudo systemctl stop streambot.service + +Error logs go to: + + sudo journalctl -xe + + +# git hooks (disabled at the moment) + +There are git-hooks enabled that will stop and (re)start streambot on every commit. + +**pre-receive**: streambot is stopped + +**post-update**: the repository is updated with a pull, streambot is started + diff --git a/xmpp.streambot/avatar.png b/xmpp.streambot/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..0892486e24dcc5c4ee9cc7f39b800126b1608dcc GIT binary patch literal 104290 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

Pw3U~Wi%9$)|MX#nduw~1SO>_x)o?%cE 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�)W`TSUUkoscYOD-oQjjTfren*8ffp^>mf9X|TNhpIyVy0*MNBGX#W>1TX`C=+ONCPARAMPSjkOj^S*NP0hE#c~DAj85*||FO zm?)VjLG1$*!$&-|E?LNa70e<>551X{qF3t5FBN^>Z;WQmxsScJ+pRMMMWpZh_}fqD z*?-I#%>HqX2b=d?mzB=dzUepljc6l6;D#*(3c;A^B0P^MKo#fk8G$>iiqbTNsbZXT%$5pLrCNfj<*}$B z3#uTCRpBHi3Q@9inWLm)5I#F~JjK)Ka){$M`B{*3b^Kd3T(h{!+am{GXZqxvMWkt( z_)ne6F0E+W)=_*Gs(8aS=kLsw(Vvs%N343TW+GzdwyI`k5QPOaWU8Pll-$$85J&?t z2fLqYh_!31ZHiYtePbbF)wLm5Y$${W*Do*tB2!bTrXEmHQH6?Nx1UnwDe0IkWn_g^ zGDAavni#55QK~AgkN`}HNyYrR0%~~TpyN31b58*Ni4S@%^A!FaCX9H`Bh4Yg{ikO= zZP#`2w|vD*b3%6{Tdh_<{P2ToQpa%wFin%kzn@O0$MsJC^Z3Zf8Rrjx0ZdQ`5rLa( z#!3Lln3@DC`D(ZXAc200000NkvXXu0mjfzNGLh literal 0 HcmV?d00001 diff --git a/xmpp.streambot/streambot.py b/xmpp.streambot/streambot.py new file mode 100644 index 0000000..4e82b0e --- /dev/null +++ b/xmpp.streambot/streambot.py @@ -0,0 +1,258 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" + Slixmpp: The Slick XMPP Library + Copyright (C) 2010 Nathanael C. Fritz + This file is part of Slixmpp. + + See the file LICENSE for copying permission. +""" + +# Code source: https://git.poez.io/slixmpp/tree/examples/muc.py + +# To run this script (local): +# $ python3 streambot.py -j streambot@vvvvvvaria.org -p slowstreaming -r test@muc.vvvvvvaria.org -n streambot -o ./stream/ + + +import logging +from getpass import getpass +from argparse import ArgumentParser + +import slixmpp + +import ssl, os, requests, urllib + +#we will reactivate +class MUCBot(slixmpp.ClientXMPP): + + """ + A simple Slixmpp bot that will greets those + who enter the room, and acknowledge any messages + that mentions the bot's nickname. + """ + + def __init__(self, jid, password, room, nick, output): + slixmpp.ClientXMPP.__init__(self, jid, password) + + self.room = room + self.nick = nick + self.datadir = output + + # The session_start event will be triggered when + # the bot establishes its connection with the server + # and the XML streams are ready for use. We want to + # listen for this event so that we we can initialize + # our roster. + self.add_event_handler("session_start", self.start) + + # The groupchat_message event is triggered whenever a message + # stanza is received from any chat room. If you also also + # register a handler for the 'message' event, MUC messages + # will be processed by both handlers. + self.add_event_handler("groupchat_message", self.muc_message) + + # The groupchat_presence event is triggered whenever a + # presence stanza is received from any chat room, including + # any presences you send yourself. To limit event handling + # to a single room, use the events muc::room@server::presence, + # muc::room@server::got_online, or muc::room@server::got_offline. + # self.add_event_handler("muc::{}::got_online".format(self.room), self.muc_online) + + + def start(self, event): + """ + Process the session_start event. + + Typical actions for the session_start event are + requesting the roster and broadcasting an initial + presence stanza. + + Arguments: + event -- An empty dictionary. The session_start + event does not provide any additional + data. + """ + self.get_roster() + self.send_presence() + self.plugin['xep_0045'].join_muc(self.room, + self.nick, + # If a room password is needed, use: + # password=the_room_password, + wait=True) + + self.register_plugin('xep_0066') # To send URI's (files, images) + # Needed to work with images + # This makes slixmpp understand an OOB object - https://xmpp.org/extensions/xep-0066.html#x-oob + + def muc_message(self, msg): + """ + Process incoming message stanzas from any chat room. Be aware + that if you also have any handlers for the 'message' event, + message stanzas may be processed by both handlers, so check + the 'type' attribute when using a 'message' event handler. + + Whenever the bot's nickname is mentioned, respond to + the message. + + IMPORTANT: Always check that a message is not from yourself, + otherwise you will create an infinite loop responding + to your own messages. + + This handler will reply to messages that mention + the bot's nickname. + + Arguments: + msg -- The received message stanza. See the documentation + for stanza objects and the Message stanza to see + how it may be used. + """ + + # some inspection commands + # print('\nMessage:{}'.format(msg)) + # print('\nMessage TYPE:{}'.format(msg['type'])) + # print('\nMessage body:{}'.format(msg['body'])) + # print('\nMessage OOB:{}'.format(msg['oob'])) + # print('\nMessage OOB URL:{}'.format(msg['oob']['url'])) + # print('\nMessage MUCK NICK:{}'.format(msg['mucnick'])) + + # Always check that a message is not the bot itself, otherwise you will create an infinite loop responding to your own messages. + if msg['mucnick'] != self.nick: + + # publish images + if len(msg['oob']['url']) > 0: + + # reply from the bot + self.send_message(mto=msg['from'].bare, + mbody="I'll stream that image further, {}.".format(msg['mucnick']), + mtype='groupchat') + + # save image to folder + url = msg['oob']['url'] + filename = os.path.basename(url) + targetDir = self.datadir + + if not os.path.exists(targetDir): + os.mkdir(targetDir, '0755') + + targetFile = os.path.join(targetDir, filename) + + # needed to disable certificate validation, when we work in a local network: + # ctx = ssl.create_default_context() + # ctx.check_hostname = False + # ctx.verify_mode = ssl.CERT_NONE + + # write image to file + # u = urllib.request.urlopen(url, context=ctx) # use this line when SSL needs to be disabled + u = urllib.request.urlopen(url) + f = open(targetFile, 'wb') + f.write(u.read()) + f.close() + + # add image to the stream markdown log + stream_update = '![An image sent over XMPP]({})'.format(targetFile) + + filename = 'stream.md' + targetFile = os.path.join(targetDir, filename) + + f = open(targetFile, 'a+') + f.write(stream_update+'\n\n') + f.close() + + # publish regular messages (only when '#publish' is used in the message) + if '#stream' in msg['body']: + + # reply from the bot + self.send_message(mto=msg['from'].bare, + mbody="I'll stream that further, {}.".format(msg['mucnick']), + mtype='groupchat') + + # add message to the stream markdown log + stream_update = msg['body'] + + targetDir = self.datadir + if not os.path.exists(targetDir): + os.mkdir(targetDir, '0755') + + filename = 'stream.md' + targetFile = os.path.join(targetDir, filename) + + f = open(targetFile, 'a+') + f.write(stream_update+'\n\n') + f.close() + + + # def muc_online(self, presence): + # """ + # Process a presence stanza from a chat room. In this case, + # presences from users that have just come online are + # handled by sending a welcome message that includes + # the user's nickname and role in the room. + + # Arguments: + # presence -- The received presence stanza. See the + # documentation for the Presence stanza + # to see how else it may be used. + # """ + # if presence['muc']['nick'] != self.nick and presence['muc']['nick'] != '': + # self.send_message(mto=presence['from'].bare, + # mbody="Hello, {} {}".format(presence['muc']['role'], presence['muc']['nick']), + # mtype='groupchat') + + +if __name__ == '__main__': + # Setup the command line arguments. + parser = ArgumentParser() + + # Output verbosity options. + parser.add_argument("-q", "--quiet", help="set logging to ERROR", + action="store_const", dest="loglevel", + const=logging.ERROR, default=logging.INFO) + parser.add_argument("-d", "--debug", help="set logging to DEBUG", + action="store_const", dest="loglevel", + const=logging.DEBUG, default=logging.INFO) + + # JID and password options. + parser.add_argument("-j", "--jid", dest="jid", + help="JID to use") + parser.add_argument("-p", "--password", dest="password", + help="password to use") + parser.add_argument("-r", "--room", dest="room", + help="MUC room to join") + parser.add_argument("-n", "--nick", dest="nick", + help="MUC nickname") + + # Output directory for images + parser.add_argument("-o", "--output", dest="output", + help="Output folder, this is where the material is stored", + default="./stream/", type=str) + + args = parser.parse_args() + + # Setup logging. + logging.basicConfig(level=args.loglevel, + format='%(levelname)-8s %(message)s') + + if args.jid is None: + args.jid = input("Username: ") + if args.password is None: + args.password = getpass("Password: ") + if args.room is None: + args.room = input("MUC room: ") + if args.nick is None: + args.nick = input("MUC nickname: ") + if args.output is None: + args.output = input("Directory where the material can be stored: ") + + # Setup the MUCBot and register plugins. Note that while plugins may + # have interdependencies, the order in which you register them does + # not matter. + xmpp = MUCBot(args.jid, args.password, args.room, args.nick, args.output) + xmpp.register_plugin('xep_0030') # Service Discovery + xmpp.register_plugin('xep_0045') # Multi-User Chat + xmpp.register_plugin('xep_0199') # XMPP Ping + + # Connect to the XMPP server and start processing XMPP stanzas. + xmpp.connect() + xmpp.process() + diff --git a/xmpp.streambot/streambot.sleekxmpp.py b/xmpp.streambot/streambot.sleekxmpp.py new file mode 100644 index 0000000..c9db2ad --- /dev/null +++ b/xmpp.streambot/streambot.sleekxmpp.py @@ -0,0 +1,132 @@ +import logging + +import argparse +from sleekxmpp import ClientXMPP +from sleekxmpp.exceptions import IqError, IqTimeout +import os, subprocess +import urllib.request +import datetime +import ssl +from PIL import Image +from pprint import pprint + +# python3 streambot.py -j streambot@vvvvvvaria.org -p ******* -m test@muc.vvvvvvaria.org -o ./stream/ + +# rewrite script to work with slixmpp >>> https://slixmpp.readthedocs.io/getting_started/muc.html + +parser = argparse.ArgumentParser() +parser.add_argument("-j", "--jid", help="jabber identifier", type=str, required=True) +parser.add_argument("-p", "--password", help="password", type=str, required=True) +parser.add_argument("-m", "--muc", help="destination muc", type=str, required=True) +parser.add_argument("-n", "--nick", help="nickname of the bot", default="streambot", type=str) +parser.add_argument("-o", "--output", help="output folder", default="./stream/", type=str) +args = parser.parse_args() + +# This was a useful tutorial: http://sleekxmpp.com/getting_started/echobot.html#echobot + +class ArchivistBot(ClientXMPP): + + def __init__(self, jid, password, room, nick, output): + ClientXMPP.__init__(self, jid, password) + + self.datadir = output + self.room = room + self.nick = nick + + self.add_event_handler("session_start", self.session_start) + self.add_event_handler("message", self.archive_msg) # by using 'message' instead of 'groupchat_message' every message received can be archived (also personal msgs) + + # self.add_event_handler("groupchat_message", self.archive_msg2) + + self.register_plugin('xep_0045') + self.register_plugin('xep_0030') + self.register_plugin('xep_0084') + self.register_plugin('xep_0096') # Transfer files.. + self.register_plugin('xep_0066') # Transfer files.. + + def session_start(self, event): + roster = self.get_roster() + print('\nRoster:', roster) + + self.send_presence() + + self.plugin['xep_0045'].joinMUC(self.room, self.nick) # MUC plugin + + with open('avatar.png', 'rb') as avatar_file: + avatar = avatar_file.read() + avatar_id = self['xep_0084'].generate_id(avatar) + info = { + 'id': avatar_id, + 'type': 'image/png', + 'bytes': len(avatar) + } + self['xep_0084'].publish_avatar(avatar) + self['xep_0084'].publish_avatar_metadata(items=[info]) + + # XEP-0153: vCard-Based Avatars + # Not working ATM + + self['xep_0153'].set_avatar(avatar=avatar, mtype='image/png') + + def archive_msg(self, msg): + print('\nMessage:{}'.format(msg)) + print('\nMessage TYPE:{}'.format(msg['type'])) + print('\nMessage OOB:{}'.format(msg['oob'])) + print('\nMessage OOB URL:{}'.format(msg['oob']['url'])) + print('\nMessage MUCK NICK:{}'.format(msg['mucnick'])) + + # Always check that a message is not the bot itself, otherwise you will create an infinite loop responding to your own messages. + if msg['mucnick'] != self.nick: + + if msg['type'] in ('groupchat', 'normal'): + + # only works if messages are not encrypted + if len(msg['oob']['url']) > 0: + + # logging.getLogger().debug("received OOB from %s with %s" % (self.nick, msg['oob']['url'])) + + filename = os.path.basename(msg['oob']['url']) + targetDir = self.datadir + if not os.path.exists(targetDir): + os.mkdir(targetDir, '0755') + + targetFile = os.path.join(targetDir, filename) + print('\n targetFile', targetFile) + + #needed to disable certificate validation: + ctx = ssl.create_default_context() + ctx.check_hostname = False + ctx.verify_mode = ssl.CERT_NONE + + # save image to file + # urllib.request.urlretrieve(msg['oob']['url'], targetFile, context=ctx) + # with urllib.request.urlopen(msg['oob']['url'], context=ctx) as u, \ + # open(targetFile, 'w+') as f: + # f.write(u.read()) + # f.close() + + # Download the file from `url` and save it locally under `file_name`: + with urllib.request.urlopen(msg['oob']['url']) as response: + data = response.read() # a `bytes` object + f = open(targetFile, 'wb') + f.write(data) + logging.getLogger().debug("saved to %s" % targetFile) + + # subprocess.call(["make","publish"], cwd="/srv/gitea/clones/varia.website/") + + msg.reply("Thanks for sending! I will store that for you." % msg).send() # works! also for omemo messages, but it cannot decrypt them. + + + +if __name__ == '__main__': + # Ideally use optparse or argparse to get JID, + # password, and log level. + + logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s %(message)s') + + client = ArchivistBot(args.jid, args.password, args.muc, args.nick, args.output) + + if client.connect(): + client.process(block=True) + else: + logging.getLogger().error("Can't connect.")