refactor code
This commit is contained in:
parent
a14a2af628
commit
4ae60c4abf
20
TootHTMLParser.py
Normal file
20
TootHTMLParser.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
from html.parser import HTMLParser
|
||||||
|
|
||||||
|
class TootHTMLParser(HTMLParser):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.txt = ""
|
||||||
|
def handle_data(self, data):
|
||||||
|
self.txt += str(data).lstrip().rstrip().lower() + " "
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# content = ""
|
||||||
|
# with open("input") as f:
|
||||||
|
# content = f.readlines()
|
||||||
|
# content = set(content)
|
||||||
|
# parser = TootHTMLParser()
|
||||||
|
# for word in content:
|
||||||
|
# parser.feed(word)
|
||||||
|
# with open("output", "w+") as f:
|
||||||
|
# f.write(parser.txt)
|
||||||
|
|
BIN
TootHTMLParser.pyc
Normal file
BIN
TootHTMLParser.pyc
Normal file
Binary file not shown.
BIN
__pycache__/Log.cpython-35.pyc
Normal file
BIN
__pycache__/Log.cpython-35.pyc
Normal file
Binary file not shown.
BIN
__pycache__/TootHTMLParser.cpython-35.pyc
Normal file
BIN
__pycache__/TootHTMLParser.cpython-35.pyc
Normal file
Binary file not shown.
23
activity.log
Normal file
23
activity.log
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
|
||||||
|
2018-05-16 13:24:47,830 :: DEBUG :: Starting new HTTPS connection (1): miaou.drycat.fr
|
||||||
|
2018-05-16 13:24:47,875 :: DEBUG :: https://miaou.drycat.fr:443 "GET /api/v1/instance/ HTTP/1.1" 200 None
|
||||||
|
2018-05-16 13:25:56,391 :: DEBUG :: Starting new HTTPS connection (1): miaou.drycat.fr
|
||||||
|
2018-05-16 13:25:56,444 :: DEBUG :: https://miaou.drycat.fr:443 "GET /api/v1/instance/ HTTP/1.1" 200 None
|
||||||
|
2018-05-16 13:27:04,797 :: DEBUG :: Starting new HTTPS connection (1): miaou.drycat.fr
|
||||||
|
2018-05-16 13:27:04,870 :: DEBUG :: https://miaou.drycat.fr:443 "GET /api/v1/instance/ HTTP/1.1" 200 None
|
||||||
|
2018-05-16 13:27:12,527 :: DEBUG :: Starting new HTTPS connection (1): miaou.drycat.fr
|
||||||
|
2018-05-16 13:27:12,584 :: DEBUG :: https://miaou.drycat.fr:443 "GET /api/v1/instance/ HTTP/1.1" 200 None
|
||||||
|
2018-05-16 13:27:18,744 :: DEBUG :: Starting new HTTPS connection (1): miaou.drycat.fr
|
||||||
|
2018-05-16 13:27:18,807 :: DEBUG :: https://miaou.drycat.fr:443 "GET /api/v1/instance/ HTTP/1.1" 200 None
|
||||||
|
2018-05-16 13:28:19,151 :: DEBUG :: Starting new HTTPS connection (1): miaou.drycat.fr
|
||||||
|
2018-05-16 13:28:19,324 :: DEBUG :: https://miaou.drycat.fr:443 "GET /api/v1/instance/ HTTP/1.1" 200 None
|
||||||
|
2018-05-16 13:28:26,505 :: DEBUG :: Starting new HTTPS connection (1): miaou.drycat.fr
|
||||||
|
2018-05-16 13:28:26,565 :: DEBUG :: https://miaou.drycat.fr:443 "GET /api/v1/instance/ HTTP/1.1" 200 None
|
||||||
|
2018-05-16 13:28:30,291 :: DEBUG :: Starting new HTTPS connection (1): miaou.drycat.fr
|
||||||
|
2018-05-16 13:28:30,349 :: DEBUG :: https://miaou.drycat.fr:443 "GET /api/v1/instance/ HTTP/1.1" 200 None
|
||||||
|
2018-05-16 13:28:34,072 :: DEBUG :: Starting new HTTPS connection (1): miaou.drycat.fr
|
||||||
|
2018-05-16 13:28:34,134 :: DEBUG :: https://miaou.drycat.fr:443 "GET /api/v1/instance/ HTTP/1.1" 200 None
|
||||||
|
2018-05-16 13:28:42,157 :: DEBUG :: Starting new HTTPS connection (1): miaou.drycat.fr
|
||||||
|
2018-05-16 13:28:42,224 :: DEBUG :: https://miaou.drycat.fr:443 "GET /api/v1/instance/ HTTP/1.1" 200 None
|
||||||
|
2018-05-16 13:30:44,355 :: DEBUG :: Starting new HTTPS connection (1): miaou.drycat.fr
|
||||||
|
2018-05-16 13:30:44,407 :: DEBUG :: https://miaou.drycat.fr:443 "GET /api/v1/instance/ HTTP/1.1" 200 None
|
152
bot.py
152
bot.py
|
@ -3,12 +3,55 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
from mastodon import Mastodon, StreamListener
|
from mastodon import Mastodon, StreamListener
|
||||||
import requests, os, random, sys, time, json, logging, socket, multiprocessing, tempfile
|
from TootHTMLParser import TootHTMLParser
|
||||||
|
import requests, os, random, sys, time, json, logging, argparse
|
||||||
|
|
||||||
|
from logging.handlers import RotatingFileHandler
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
|
# Mastodon Stream Listener defines functions to react when something happens on Mastodon. We inherit it.
|
||||||
|
class BotListener(StreamListener):
|
||||||
|
def __init__(self, mastodon):
|
||||||
|
print("init")
|
||||||
|
StreamListener.__init__(self)
|
||||||
|
self.mastodon = mastodon
|
||||||
|
pprint(vars(mastodon.stream_user(StreamListener)))
|
||||||
|
|
||||||
|
def handle_mention(self, status):
|
||||||
|
log.debug('Got a mention!')
|
||||||
|
|
||||||
|
def on_notification(self, notification):
|
||||||
|
log.debug("here")
|
||||||
|
for thread in self.threads:
|
||||||
|
if(not thread.is_alive()):
|
||||||
|
logging.info("removing thread" + str(thread))
|
||||||
|
self.threads.remove(thread)
|
||||||
|
|
||||||
|
#We react to mentions only
|
||||||
|
if(notification['type'] != 'mention'):
|
||||||
|
log.info("nevermind, it's not a mention")
|
||||||
|
return
|
||||||
|
|
||||||
|
#So there is a toot !
|
||||||
|
status = notification['status']
|
||||||
|
|
||||||
|
#And there is a text in this toot. But it is mixed with HTML we don't want so we get rid of it.
|
||||||
|
content = str(status["content"])
|
||||||
|
parser = TootHTMLParser()
|
||||||
|
parser.feed(content)
|
||||||
|
content = (parser.txt).lower()
|
||||||
|
|
||||||
|
logging.info(content)
|
||||||
|
atUser = status["account"]["acct"]
|
||||||
|
userInfo = self.associateToUser(atUser)
|
||||||
|
|
||||||
|
#If the toot is not in answer to a drawing
|
||||||
|
answerTo = status["in_reply_to_id"]
|
||||||
|
|
||||||
def get_parameter( parameter, file_path ):
|
def get_parameter( parameter, file_path ):
|
||||||
# Check if secrets file exists
|
# Check if secrets file exists
|
||||||
if not os.path.isfile(file_path):
|
if not os.path.isfile(file_path):
|
||||||
print("File %s not found, exiting."%file_path)
|
log.error("File %s not found, exiting."%file_path)
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
# Find parameter in file
|
# Find parameter in file
|
||||||
|
@ -18,52 +61,75 @@ def get_parameter( parameter, file_path ):
|
||||||
return line.replace(parameter + ":", "").strip()
|
return line.replace(parameter + ":", "").strip()
|
||||||
|
|
||||||
# Cannot find parameter, exit
|
# Cannot find parameter, exit
|
||||||
print(file_path + " Missing parameter %s "%parameter)
|
log.critical(file_path + " Missing parameter %s "%parameter)
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def driver(mastodon, log, heartbeat_filename, pid_filename):
|
def post_img(mastodon, text, visibility, logging):
|
||||||
try:
|
file = random.choice(os.listdir(img_path+"/"))
|
||||||
listener = myListener(mastodon, log, heartbeat_filename, pid_filename)
|
image_byte = open(img_path+"/"+file, "rb").read()
|
||||||
log.info("Driver/listener starts, PID %s" % os.getpid())
|
|
||||||
mastodon.stream_user(listener)
|
|
||||||
except Exception as error:
|
|
||||||
log.critical("Unexpected error in the driver \"%s\"" % error)
|
|
||||||
|
|
||||||
|
if file[-3:] == "jpe":
|
||||||
secrets_filepath = "secrets/secrets.txt"
|
|
||||||
|
|
||||||
uc_client_id = get_parameter("client_id", secrets_filepath)
|
|
||||||
uc_client_secret = get_parameter("client_secret", secrets_filepath)
|
|
||||||
uc_access_token = get_parameter("access_token", secrets_filepath)
|
|
||||||
mastodon_hostname = get_parameter("mastodon_hostname", secrets_filepath)
|
|
||||||
|
|
||||||
config_file = "config.txt"
|
|
||||||
|
|
||||||
img_path = get_parameter("img_path", config_file)
|
|
||||||
|
|
||||||
mastodon = Mastodon(
|
|
||||||
client_id = uc_client_id,
|
|
||||||
client_secret = uc_client_secret,
|
|
||||||
access_token = uc_access_token,
|
|
||||||
api_base_url = 'https://' + mastodon_hostname,
|
|
||||||
)
|
|
||||||
|
|
||||||
file = random.choice(os.listdir(img_path+"/"))
|
|
||||||
image_byte = open(img_path+"/"+file, "rb").read()
|
|
||||||
|
|
||||||
if file[-3:] == "jpe":
|
|
||||||
mime = "image/jpeg"
|
|
||||||
else :
|
|
||||||
if file[-3:] == "jpg":
|
|
||||||
mime = "image/jpeg"
|
mime = "image/jpeg"
|
||||||
else :
|
else :
|
||||||
if file[-3:] == "png":
|
if file[-3:] == "jpg":
|
||||||
mime = "image/png"
|
mime = "image/jpeg"
|
||||||
else :
|
else :
|
||||||
if file[-3:] == "gif":
|
if file[-3:] == "png":
|
||||||
mime = "image/gif"
|
mime = "image/png"
|
||||||
|
else :
|
||||||
|
if file[-3:] == "gif":
|
||||||
|
mime = "image/gif"
|
||||||
|
|
||||||
media_dict = mastodon.media_post(image_byte, mime)
|
media_dict = mastodon.media_post(image_byte, mime)
|
||||||
#text.encode('utf-8').strip()
|
mastodon.status_post("", None, media_ids=[media_dict], sensitive=True, visibility='', spoiler_text="#NSFW")
|
||||||
mastodon.status_post("", None, media_ids=[media_dict], sensitive=True, visibility='', spoiler_text="#NSFW")
|
|
||||||
|
def init(config, secrets):
|
||||||
|
log = logging.getLogger()
|
||||||
|
log.setLevel(logging.DEBUG)
|
||||||
|
formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')
|
||||||
|
|
||||||
|
file_handler = RotatingFileHandler('activity.log', 'a', 1000000, 1)
|
||||||
|
file_handler.setLevel(logging.DEBUG)
|
||||||
|
file_handler.setFormatter(formatter)
|
||||||
|
log.addHandler(file_handler)
|
||||||
|
|
||||||
|
stream_handler = logging.StreamHandler()
|
||||||
|
stream_handler.setLevel(logging.DEBUG)
|
||||||
|
log.addHandler(stream_handler)
|
||||||
|
|
||||||
|
uc_client_id = get_parameter("client_id", secrets)
|
||||||
|
uc_client_secret = get_parameter("client_secret", secrets)
|
||||||
|
uc_access_token = get_parameter("access_token", secrets)
|
||||||
|
mastodon_hostname = get_parameter("mastodon_hostname", secrets)
|
||||||
|
|
||||||
|
img_path = get_parameter("img_path", config)
|
||||||
|
|
||||||
|
mastodon = Mastodon(
|
||||||
|
client_id = uc_client_id,
|
||||||
|
client_secret = uc_client_secret,
|
||||||
|
access_token = uc_access_token,
|
||||||
|
api_base_url = 'https://' + mastodon_hostname,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def run(mastodon, log):
|
||||||
|
log.info("Start streaming")
|
||||||
|
listener = BotListener(mastodon, logging)
|
||||||
|
mastodon.stream_user(listener)
|
||||||
|
#post_img(mastodon, "NSFW", 1)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
config_file = "config.txt"
|
||||||
|
secrets_filepath = "secrets/secrets.txt"
|
||||||
|
init(config_file, secrets_filepath)
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('command', type=str, choices=['img', 'stream'])
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if args.command == 'img':
|
||||||
|
post_img(mastodon, "NSFW", 1, log)
|
||||||
|
elif args.command == 'stream':
|
||||||
|
run(mastodon, log)
|
||||||
|
|
||||||
|
main()
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
client_id: 3c6ae74d9d01b03a808885a4e33a0d93466153d8face26248b8ff7437abda1b7
|
client_id: 53b2525d5723a226f903862cf725bc60d6fb3199a8cd4b85950b53924109a17f
|
||||||
client_secret: 0fbfb8ce41237e40b6dac1ff56eb4e16ad2185753ad4237fc528498551bd3c32
|
client_secret: 9c0c5411adea85147fa35ffbfd20f4dd78af6dd999bec6a8ca9d1d27fc0f2d78
|
||||||
access_token: cf4eb940c80e262a6898cdbd39c180c1af08cac11cf5b85c7613c33ae932749e
|
access_token: 55d80d7d594734393f2a0d845a1700743f531637130e729194dbe7537cb43ad4
|
||||||
mastodon_hostname: miaou.drycat.fr
|
mastodon_hostname: miaou.drycat.fr
|
||||||
|
|
Reference in a new issue