|
|
Line 4: |
Line 4: |
|
| |
|
| ==prototypes== | | ==prototypes== |
| <code>#!/usr/bin/env python3
| |
| # -*- coding: utf-8 -*-
| |
|
| |
|
| """
| | [User:Simon/archive_bot| Archive Bot] |
| 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 bot:
| |
| # $ python3 streambot.py --jid username@yourdomainname.ext --password password --room channel@groups.domainname.ext --nick nickname --output ./output/
| |
| # python3 streambot.py --jid rita@please.undo.undo.it --room paranodal.activity@groups.please.undo.undo.it --nick test --output ./output/
| |
| | |
| | |
| import logging
| |
| from getpass import getpass
| |
| from argparse import ArgumentParser
| |
| | |
| import slixmpp
| |
| import ssl, os, requests, urllib
| |
| | |
| #idea of class is important: like creating your own concepts, names, etc. like a library
| |
| class MUCBot(slixmpp.ClientXMPP):
| |
| """
| |
| A simple Slixmpp bot that will save images
| |
| and messages that are marked with #publish to a folder.
| |
| """
| |
| | |
| def __init__(self, jid, password, room, nick, output, outputparanodal):
| |
| slixmpp.ClientXMPP.__init__(self, jid, password)
| |
| | |
| self.room = room
| |
| self.nick = nick
| |
| self.output = output
| |
| self.outputparanodal = outputparanodal
| |
| self.tmp = None
| |
| | |
| | |
| # 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)
| |
| | |
| | |
| 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.
| |
| """
| |
| | |
| 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)
| |
| | |
| 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('......,.......................')
| |
| print('Message:{}'.format(msg))
| |
| # print('\nMessage TYPE:{}'.format(msg['type']))
| |
| # print('\nMessage body:{}'.format(msg['body']))
| |
| print('Message OOB:{}'.format(msg['oob']))
| |
| print('Message 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:
| |
| #
| |
| #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)
| |
| print(len(msg['oob']['url']))
| |
| if len(msg['oob']['url']) > 0:
| |
| | |
| | |
| | |
| | |
| # Save the image to the output folder
| |
| url = msg['oob']['url'] # grep the url in the message
| |
| self.tmp = url
| |
| | |
| | |
| #Send a reply
| |
| | |
| self.send_message(mto=msg['from'].bare,
| |
| mbody="Please put hashtag!",
| |
| mtype='groupchat')
| |
| # message = '<p class="message">{}</p>'.format(msg['body'])
| |
| # if not os.path.exists(word):
| |
| # os.mkdir(word)
| |
| | |
| # # Send a reply
| |
| # self.send_message(mto=msg['from'].bare,
| |
| # mbody="oke {}.".format(msg['mucnick']),
| |
| # mtype='groupchat')
| |
| #
| |
| # output = self.output
| |
| # if not os.path.exists(output):
| |
| # os.mkdir(output)
| |
| # output_path = os.path.join(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 image to stream
| |
| # img = '<img class="image" src="{}">'.format(filename)
| |
| # stream = 'stream.html'
| |
| # stream_path = os.path.join(output, stream)
| |
| # f = open(stream_path, 'a+')
| |
| # f.write(img+'\n')
| |
| # f.close()
| |
| | |
| # Include messages in the stream (only when '#' is used in the message. creates a folder for each #)
| |
| for word in msg['body'].split():
| |
| if word.startswith('#'):
| |
| if self.tmp:
| |
| url = self.tmp
| |
| print('URL:', url)
| |
| folder = word.replace('#', '')
| |
| filename = os.path.basename(url) # grep the filename in the url
| |
| if not os.path.exists(folder):
| |
| os.mkdir(folder)
| |
| output_path = os.path.join(folder, 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 image to stream
| |
| img = '<img class="image" src="{}">'.format(filename)
| |
| stream = 'index.html'
| |
| stream_path = os.path.join(folder, stream)
| |
| f = open(stream_path, 'a+')
| |
| f.write(img+'\n')
| |
| f.close()
| |
| else:
| |
| folder = word.replace('#', '')
| |
| self.send_message(mto=msg['from'].bare,
| |
| mbody="Be aware {} ! You are creating a hashtag called {}.".format(msg['mucnick'], folder),
| |
| mtype='groupchat')
| |
| message = '<p class="message">{}</p>'.format(msg['body'])
| |
| if not os.path.exists(folder):
| |
| os.mkdir("{}".format(folder))
| |
| stream = 'index.html'
| |
| stream_path = os.path.join(folder, stream)
| |
| f = open(stream_path, 'a+')
| |
| message = message.replace(word, '')
| |
| f.write(message+'\n')
| |
| f.close()
| |
| | |
| | |
| | |
| | |
| | |
| #HOW TO? 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 = self.output
| |
| #
| |
| # #HERE CHANGE TO HASTAHG CREATED
| |
| # if not os.path.exists(output):
| |
| # os.mkdir("{}".format(word))
| |
| # output_path = os.path.join(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 image to stream
| |
| # img = '<img class="image" src="{}">'.format(filename)
| |
| # stream = 'stream.html'
| |
| # stream_path = os.path.join(output, stream)
| |
| # f = open(stream_path, 'a+')
| |
| # f.write(img+'\n')
| |
| # f.close()
| |
| | |
| | |
| #
| |
| # if '#paranodalactivity' in msg['body']:
| |
| #
| |
| # # reply from the bot
| |
| # self.send_message(mto=msg['from'].bare,
| |
| # mbody="I sense some Paranodal Activity, {}.".format(msg['mucnick']),
| |
| # mtype='groupchat')
| |
| #
| |
| # # Add message to stream
| |
| # message = '<p class="message">{}</p>'.format(msg['body'])
| |
| # outputparanodal = self.outputparanodal
| |
| # if not os.path.exists(outputparanodal):
| |
| # os.mkdir(outputparanodal)
| |
| # stream = 'stream.html'
| |
| # stream_path = os.path.join(outputparanodal, stream)
| |
| # f = open(stream_path, 'a+')
| |
| # f.write(message+'\n')
| |
| # f.close()
| |
| #
| |
| # # Include messages in the stream (only when '#paranodalactivity' is used in the message)
| |
| # if '#physical' in msg['body']:
| |
| #
| |
| # # reply from the bot
| |
| # self.send_message(mto=msg['from'].bare,
| |
| # mbody="Let's get physical, {}.".format(msg['mucnick']),
| |
| # mtype='groupchat')
| |
| #
| |
| # # Add message to stream
| |
| # message = '<p class="message">{}</p>'.format(msg['body'])
| |
| # output = self.output
| |
| # if not os.path.exists(output):
| |
| # os.mkdir(output)
| |
| # stream = 'stream.html'
| |
| # stream_path = os.path.join(output, stream)
| |
| # f = open(stream_path, 'a+')
| |
| # f.write(message+'\n')
| |
| # f.close()
| |
| | |
| 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",
| |
| default="./output/", type=str)
| |
| | |
| # output folder for images
| |
| parser.add_argument("-op", "--outputpara", dest="outputparanodal",
| |
| help="outputparanodal folder, this is where the files are stored",
| |
| default="./outputparanodal/", 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("User: ")
| |
| 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, args.outputparanodal)
| |
| 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()</code>
| |
|
| |
|
| ==resources== | | ==resources== |