162 lines
7.0 KiB
Python
Executable File
162 lines
7.0 KiB
Python
Executable File
import requests
|
|
import datetime
|
|
import boto3
|
|
import var
|
|
import classes.rating
|
|
from functions.delete_post import delete_post
|
|
from beloved_logger import logger
|
|
|
|
|
|
class Post:
|
|
post_id = None
|
|
post_description = None
|
|
post_name = None
|
|
image = None
|
|
user_id = None
|
|
poster_username = None
|
|
poster_sign_up_time = None
|
|
response = None
|
|
date = None
|
|
infringing_words = []
|
|
ratings = None
|
|
post_will_be_deleted = None
|
|
deletion_status = None
|
|
|
|
def __init__(self, post_id):
|
|
logger.info(f"Post was made with ID {post_id}")
|
|
self.post_id = post_id
|
|
self.infringing_words = []
|
|
|
|
async def get_values(self):
|
|
response = requests.get(f"https://{var.site}/posts/{self.post_id}",
|
|
headers={'User-Agent': 'automod',
|
|
"Accept": "application/json,text/plain, */*"})
|
|
|
|
if response.status_code == 200:
|
|
self.response = response.json()
|
|
if response.json()['post']['resource_url']:
|
|
self.image = requests.get(self.response['post']['resource_url']).content
|
|
|
|
self.post_name = self.response['post']["title"]
|
|
self.user_id = self.response['post']['profile_id']
|
|
self.poster_username = self.response['post']['profile']['username']
|
|
self.poster_sign_up_time = self.response['post']['profile']['created_at']
|
|
self.date = self.response['post']['created_at']
|
|
self.post_description = self.response['post']["description"]
|
|
|
|
logger.debug(f"Got post {self.post_id} with details {self.response}")
|
|
else:
|
|
logger.info(f"An error occurred getting post with ID {self.post_id} for reason {response.status_code}")
|
|
return False
|
|
|
|
async def analyse_text(self):
|
|
logger.info(f"Getting text analysis of post with post ID {self.post_id}")
|
|
|
|
logger.info(self.post_name)
|
|
logger.info(self.post_description)
|
|
logger.info(var.filters_list)
|
|
|
|
if self.post_name:
|
|
for word in var.filters_list:
|
|
if word.lower() in self.post_name.lower() and word not in self.infringing_words:
|
|
logger.info(f"Post {self.post_id}'s name contained infringing word {word}")
|
|
self.infringing_words.append(word)
|
|
|
|
if self.post_description:
|
|
for word in var.filters_list:
|
|
if word.lower() in self.post_description.lower() and word not in self.infringing_words:
|
|
logger.info(f"Post {self.post_id}'s description contained infringing word {word}")
|
|
self.infringing_words.append(word)
|
|
|
|
async def analyse_image(self):
|
|
logger.info(f"Getting image analysis of post with post ID {self.post_id}")
|
|
if self.image:
|
|
logger.info(f"Post {self.post_id} had an image")
|
|
await self.detect_image()
|
|
if self.ratings:
|
|
logger.info(f"Post {self.post_id} has ratings: {await self.get_ratings_string()}")
|
|
await self.check_ratings()
|
|
if self.post_will_be_deleted:
|
|
logger.info(f"Post {self.post_id} will be deleted")
|
|
await self.remove_post()
|
|
logger.info(f"Post {self.post_id} was deleted")
|
|
else:
|
|
logger.info(f"Post {self.post_id} will not be deleted")
|
|
else:
|
|
logger.info(f"Post {self.post_id} did not have any ratings")
|
|
else:
|
|
logger.info(f"Post {self.post_id} was either a text post or deleted before analysis")
|
|
|
|
async def detect_image(self):
|
|
logger.info(f"Sending data to AWS for post {self.post_id}")
|
|
client = boto3.client('rekognition', region_name=var.aws_region)
|
|
self.ratings = classes.rating.create_ratings(client.detect_moderation_labels(Image={'Bytes': self.image}))
|
|
|
|
async def check_ratings(self):
|
|
logger.info(f"Checking ratings for post {self.post_id}")
|
|
one_rating_was_false = False
|
|
|
|
for post_rating in self.ratings:
|
|
if post_rating.confidence > 90 and post_rating.enabled:
|
|
logger.info(f"Post {self.post_id} contained enabled rating more than 90 for {post_rating.name} which "
|
|
f"was type of {post_rating.type}")
|
|
self.post_will_be_deleted = True
|
|
elif not post_rating.enabled:
|
|
logger.info(f"Post {self.post_id} had a rating of {post_rating.name} in the "
|
|
f"{post_rating.type} category at confidence {post_rating.confidence}"
|
|
f"but it was not enabled. Post will not be deleted.")
|
|
one_rating_was_false = True
|
|
|
|
# if one_rating_was_false:
|
|
# self.post_will_be_deleted = False
|
|
# self.ratings = None
|
|
|
|
async def remove_post(self):
|
|
var.most_recently_deleted_post_id = self.post_id
|
|
self.deletion_status = False
|
|
if self.post_will_be_deleted:
|
|
logger.info(f"Attempting to delete a post {self.post_id} for {await self.get_ratings_string()}")
|
|
|
|
self.deletion_status = await delete_post(self.post_id)
|
|
if self.deletion_status == 200:
|
|
logger.info(f"Post {self.post_id} was deleted")
|
|
self.deletion_status = True
|
|
else:
|
|
logger.info(f"An issue occurred deleting {self.post_id} for reason {self.deletion_status}")
|
|
self.deletion_status = f"Problem occurred with deletion: {self.deletion_status}"
|
|
|
|
async def get_readable_date(self):
|
|
return datetime.datetime.utcfromtimestamp(self.date).strftime('%Y-%m-%d %H:%M:%S')
|
|
|
|
async def get_censorship_string(self):
|
|
return '", "'.join(self.infringing_words)
|
|
|
|
async def get_ratings_string(self):
|
|
ratings_string = ""
|
|
for post_rating in self.ratings:
|
|
ratings_string += str(post_rating)
|
|
return ratings_string
|
|
|
|
async def get_as_text_detection_text(self):
|
|
string = (f'‼️ *DETECTED:TEXT:* "{await self.get_censorship_string()}"\n' +
|
|
f'🗒️ *TITLE:* "{self.post_name}"\n' +
|
|
f"🔗 *URL:* https://{var.site}/admin/posts/{self.post_id}\n" +
|
|
f"👤 *POSTER:* https://{var.site}/users/{self.user_id} / @{self.poster_username}\n")
|
|
return string
|
|
|
|
async def get_as_image_deletion_text(self):
|
|
ratings_string = ""
|
|
for post_rating in self.ratings:
|
|
ratings_string += str(post_rating)
|
|
|
|
if self.deletion_status is None:
|
|
self.deletion_status = False
|
|
|
|
string = (f"{ratings_string} \n " +
|
|
f'🗒️ *TITLE:* "{self.post_name}"\n' +
|
|
f"🔗 *URL:* https://{var.site}/admin/posts/{self.post_id}\n" +
|
|
f"👤 *POSTER:* https://{var.site}/users/{self.user_id} / @{self.poster_username}\n" +
|
|
f"❌ *DELETED:* {str(self.deletion_status)}"
|
|
f"The user was also suspended for a day, if the suspension was not warranted you must undo the suspension")
|
|
return string
|