spam process API

This commit is contained in:
BennyThink
2021-12-16 20:04:37 +08:00
parent 2ba6db2564
commit f177eefc23
6 changed files with 110 additions and 9 deletions

View File

@@ -26,7 +26,8 @@ FIX_SEARCH = "http://www.zimuxia.cn/?s={kw}"
ZHUIXINFAN_SEARCH = "http://www.fanxinzhui.com/list?k={}" ZHUIXINFAN_SEARCH = "http://www.fanxinzhui.com/list?k={}"
ZHUIXINFAN_RESOURCE = "http://www.fanxinzhui.com{}" ZHUIXINFAN_RESOURCE = "http://www.fanxinzhui.com{}"
# yyets website # yyets website
WORKERS = "https://yyets.dmesg.app/resource.html?id={id}" DOMAIN = "https://yyets.dmesg.app/"
WORKERS = f"{DOMAIN}resource.html?id={id}"
# new zmz # new zmz
NEWZMZ_SEARCH = "https://newzmz.com/subres/index/getres.html?keyword={}" NEWZMZ_SEARCH = "https://newzmz.com/subres/index/getres.html?keyword={}"

View File

@@ -18,11 +18,11 @@ import pymongo
import redis import redis
import requests import requests
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from bson.objectid import ObjectId
from config import (BD2020_SEARCH, FANSUB_ORDER, FIX_SEARCH, MONGO, from config import (BD2020_SEARCH, FANSUB_ORDER, FIX_SEARCH, MONGO,
NEWZMZ_RESOURCE, NEWZMZ_SEARCH, REDIS, WORKERS, NEWZMZ_RESOURCE, NEWZMZ_SEARCH, REDIS, WORKERS,
XL720_SEARCH, ZHUIXINFAN_RESOURCE, ZHUIXINFAN_SEARCH) XL720_SEARCH, ZHUIXINFAN_RESOURCE, ZHUIXINFAN_SEARCH)
from bson.objectid import ObjectId
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(filename)s [%(levelname)s]: %(message)s') logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(filename)s [%(levelname)s]: %(message)s')

View File

@@ -12,13 +12,14 @@ import tempfile
import time import time
from urllib.parse import quote_plus from urllib.parse import quote_plus
import requests
import telebot import telebot
from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.schedulers.background import BackgroundScheduler
from telebot import apihelper, types from telebot import apihelper, types
from tgbot_ping import get_runtime from tgbot_ping import get_runtime
import fansub import fansub
from config import (FANSUB_ORDER, MAINTAINER, PROXY, REPORT, TOKEN, from config import (DOMAIN, FANSUB_ORDER, MAINTAINER, PROXY, REPORT, TOKEN,
YYETS_SEARCH_URL) YYETS_SEARCH_URL)
from utils import (get_error_dump, redis_announcement, reset_request, from utils import (get_error_dump, redis_announcement, reset_request,
save_error_dump, show_usage, today_request) save_error_dump, show_usage, today_request)
@@ -283,6 +284,29 @@ def choose_link(call):
bot.send_document(call.message.chat.id, f, caption=caption) bot.send_document(call.message.chat.id, f, caption=caption)
@bot.callback_query_handler(func=lambda call: re.findall(r"approve", call.data))
def approve_spam(call):
obj_id = re.findall(r"approve(\S*)", call.data)[0]
data = {
"obj_id": obj_id,
"token": TOKEN
}
requests.post(f"{DOMAIN}api/admin/spam", json=data)
bot.send_chat_action(call.message.chat.id, 'typing')
bot.answer_callback_query(call.id, 'Approved')
@bot.callback_query_handler(func=lambda call: re.findall(r"deny", call.data))
def deny_spam(call):
obj_id = re.findall(r"deny(\S*)", call.data)[0]
data = {
"obj_id": obj_id,
"token": TOKEN
}
requests.delete(f"{DOMAIN}api/admin/spam", json=data)
bot.answer_callback_query(call.id, 'Denied')
@bot.callback_query_handler(func=lambda call: re.findall(r"unwelcome(\d*)", call.data)) @bot.callback_query_handler(func=lambda call: re.findall(r"unwelcome(\d*)", call.data))
def send_unwelcome(call): def send_unwelcome(call):
# this will come from me only # this will come from me only

View File

@@ -216,14 +216,17 @@ class CommentMongoResource(CommentResource, Mongo):
if reason: if reason:
return {"status_code": HTTPStatus.FORBIDDEN, "message": reason} return {"status_code": HTTPStatus.FORBIDDEN, "message": reason}
if check_spam(ip, browser, username, content) != 0: if check_spam(ip, browser, username, content) != 0:
inserted_id = self.db["spam"].insert_one({ document = {
"username": username, "username": username,
"ip": ip, "ip": ip,
"date": ts_date(), "date": ts_date(),
"browser": browser, "browser": browser,
"content": content, "content": content,
"resource_id": resource_id "resource_id": resource_id
}).inserted_id }
inserted_id = self.db["spam"].insert_one(document).inserted_id
document["_id"] = str(inserted_id)
SpamProcessMongoResource.request_approval(document)
return {"status_code": HTTPStatus.FORBIDDEN, "message": f"possible spam, reference id: {inserted_id}"} return {"status_code": HTTPStatus.FORBIDDEN, "message": f"possible spam, reference id: {inserted_id}"}
user_group = self.db["users"].find_one( user_group = self.db["users"].find_one(
@@ -1062,3 +1065,47 @@ class ResourceLatestMongoResource(ResourceLatestResource, Mongo):
latest = self.query_db() latest = self.query_db()
redis.set("latest-resource", json.dumps(latest, ensure_ascii=False)) redis.set("latest-resource", json.dumps(latest, ensure_ascii=False))
logging.info("latest-resource data refreshed.") logging.info("latest-resource data refreshed.")
class SpamProcessMongoResource(Mongo):
def delete_spam(self, obj_id: "str"):
obj_id = ObjectId(obj_id)
logging.info("Deleting spam %s", obj_id)
self.db["spam"].delete_one({"_id": obj_id})
return {"status": True}
def restore_spam(self, obj_id: "str"):
obj_id = ObjectId(obj_id)
spam = self.db["spam"].find_one({"_id": obj_id}, projection={"_id": False})
logging.info("Restoring spam %s", spam)
self.db["comment"].insert_one(spam)
self.db["spam"].delete_one({"_id": obj_id})
return {"status": True}
@staticmethod
def request_approval(document: "dict"):
token = os.getenv("TOKEN")
owner = os.getenv("OWNER")
obj_id = document["_id"]
data = {
"text": json.dumps(document, ensure_ascii=False, indent=4),
"chat_id": owner,
"reply_markup": {
"inline_keyboard": [
[
{
"text": "approve",
"callback_data": f"approve{obj_id}"
},
{
"text": "deny",
"callback_data": f"deny{obj_id}"
}
]
]
}
}
api = f"https://api.telegram.org/bot{token}/sendMessage"
resp = requests.post(api, json=data).json()
logging.info("Telegram response: %s", resp)

View File

@@ -22,6 +22,7 @@ from hashlib import sha1
from http import HTTPStatus from http import HTTPStatus
import filetype import filetype
import requests
from tornado import escape, gen, web from tornado import escape, gen, web
from tornado.concurrent import run_on_executor from tornado.concurrent import run_on_executor
@@ -902,8 +903,8 @@ class UserEmailHandler(BaseHandler):
class CategoryHandler(BaseHandler): class CategoryHandler(BaseHandler):
class_name = f"Category{adapter}Resource" class_name = f"Category{adapter}Resource"
from Mongo import CategoryResource # from Mongo import CategoryResource
instance = CategoryResource() # instance = CategoryResource()
@run_on_executor() @run_on_executor()
def get_data(self): def get_data(self):
@@ -917,3 +918,30 @@ class CategoryHandler(BaseHandler):
def get(self): def get(self):
resp = yield self.get_data() resp = yield self.get_data()
self.write(resp) self.write(resp)
class SpamProcessHandler(BaseHandler):
class_name = f"SpamProcess{adapter}Resource"
from Mongo import SpamProcessMongoResource
instance = SpamProcessMongoResource()
def process(self, method):
obj_id = self.json.get("obj_id")
token = self.json.get("token")
ua = self.request.headers['user-agent']
ip = AntiCrawler(self).get_real_ip()
logging.info("Authentication %s(%s) for spam API now...", ua, ip)
if token == os.getenv("TOKEN"):
return getattr(self.instance, method)(obj_id)
else:
self.set_status(HTTPStatus.FORBIDDEN)
return {"status": False, "message": "this token is not allowed to access this API"}
@gen.coroutine
def post(self):
self.write(self.process("restore_spam"))
@gen.coroutine
def delete(self):
self.write(self.process("delete_spam"))

View File

@@ -25,8 +25,8 @@ from handler import (AnnouncementHandler, BlacklistHandler, CaptchaHandler,
GrafanaSearchHandler, IndexHandler, LikeHandler, GrafanaSearchHandler, IndexHandler, LikeHandler,
MetricsHandler, NameHandler, NotFoundHandler, MetricsHandler, NameHandler, NotFoundHandler,
NotificationHandler, ResourceHandler, NotificationHandler, ResourceHandler,
ResourceLatestHandler, TopHandler, UserEmailHandler, ResourceLatestHandler, SpamProcessHandler, TopHandler,
UserHandler) UserEmailHandler, UserHandler)
from migration.douban_sync import sync_douban from migration.douban_sync import sync_douban
from Mongo import OtherMongoResource, ResourceLatestMongoResource from Mongo import OtherMongoResource, ResourceLatestMongoResource
@@ -64,6 +64,7 @@ class RunServer:
(r'/api/douban/report', DoubanReportHandler), (r'/api/douban/report', DoubanReportHandler),
(r'/api/notification', NotificationHandler), (r'/api/notification', NotificationHandler),
(r'/api/category', CategoryHandler), (r'/api/category', CategoryHandler),
(r'/api/admin/spam', SpamProcessHandler),
(r'/(.*\.html|.*\.js|.*\.css|.*\.png|.*\.jpg|.*\.ico|.*\.gif|.*\.woff2|.*\.gz|.*\.zip|' (r'/(.*\.html|.*\.js|.*\.css|.*\.png|.*\.jpg|.*\.ico|.*\.gif|.*\.woff2|.*\.gz|.*\.zip|'
r'.*\.svg|.*\.json|.*\.txt)', r'.*\.svg|.*\.json|.*\.txt)',