瀏覽代碼

refactor code

tags/v1.2
Dryusdan 2 年之前
父節點
當前提交
4ae60c4abf
共有 7 個檔案被更改,包括 151 行新增42 行删除
  1. +20
    -0
      TootHTMLParser.py
  2. 二進制
      TootHTMLParser.pyc
  3. 二進制
      __pycache__/Log.cpython-35.pyc
  4. 二進制
      __pycache__/TootHTMLParser.cpython-35.pyc
  5. +23
    -0
      activity.log
  6. +105
    -39
      bot.py
  7. +3
    -3
      secrets/secrets.txt

+ 20
- 0
TootHTMLParser.py 查看文件

@@ -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)


二進制
TootHTMLParser.pyc 查看文件


二進制
__pycache__/Log.cpython-35.pyc 查看文件


二進制
__pycache__/TootHTMLParser.cpython-35.pyc 查看文件


+ 23
- 0
activity.log 查看文件

@@ -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

+ 105
- 39
bot.py 查看文件

@@ -3,12 +3,55 @@
# -*- coding: utf-8 -*-

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 ):
# Check if secrets file exists
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)

# Find parameter in file
@@ -18,52 +61,75 @@ def get_parameter( parameter, file_path ):
return line.replace(parameter + ":", "").strip()

# Cannot find parameter, exit
print(file_path + " Missing parameter %s "%parameter)
log.critical(file_path + " Missing parameter %s "%parameter)
sys.exit(0)

def driver(mastodon, log, heartbeat_filename, pid_filename):
try:
listener = myListener(mastodon, log, heartbeat_filename, pid_filename)
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)
def post_img(mastodon, text, visibility, logging):
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"
else :
if file[-3:] == "png":
mime = "image/png"
else :
if file[-3:] == "gif":
mime = "image/gif"

media_dict = mastodon.media_post(image_byte, mime)
mastodon.status_post("", None, media_ids=[media_dict], sensitive=True, visibility='', spoiler_text="#NSFW")

secrets_filepath = "secrets/secrets.txt"
def init(config, secrets):
log = logging.getLogger()
log.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')

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)
file_handler = RotatingFileHandler('activity.log', 'a', 1000000, 1)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
log.addHandler(file_handler)

config_file = "config.txt"
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)
log.addHandler(stream_handler)

img_path = get_parameter("img_path", config_file)
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)

mastodon = Mastodon(
client_id = uc_client_id,
client_secret = uc_client_secret,
access_token = uc_access_token,
api_base_url = 'https://' + mastodon_hostname,
)
img_path = get_parameter("img_path", config)

file = random.choice(os.listdir(img_path+"/"))
image_byte = open(img_path+"/"+file, "rb").read()
mastodon = Mastodon(
client_id = uc_client_id,
client_secret = uc_client_secret,
access_token = uc_access_token,
api_base_url = 'https://' + mastodon_hostname,
)

if file[-3:] == "jpe":
mime = "image/jpeg"
else :
if file[-3:] == "jpg":
mime = "image/jpeg"
else :
if file[-3:] == "png":
mime = "image/png"
else :
if file[-3:] == "gif":
mime = "image/gif"

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")
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()


+ 3
- 3
secrets/secrets.txt 查看文件

@@ -1,4 +1,4 @@
client_id: 3c6ae74d9d01b03a808885a4e33a0d93466153d8face26248b8ff7437abda1b7
client_secret: 0fbfb8ce41237e40b6dac1ff56eb4e16ad2185753ad4237fc528498551bd3c32
access_token: cf4eb940c80e262a6898cdbd39c180c1af08cac11cf5b85c7613c33ae932749e
client_id: 53b2525d5723a226f903862cf725bc60d6fb3199a8cd4b85950b53924109a17f
client_secret: 9c0c5411adea85147fa35ffbfd20f4dd78af6dd999bec6a8ca9d1d27fc0f2d78
access_token: 55d80d7d594734393f2a0d845a1700743f531637130e729194dbe7537cb43ad4
mastodon_hostname: miaou.drycat.fr

Loading…
取消
儲存