mirror of
https://github.com/tgbot-collection/YYeTsBot.git
synced 2025-11-25 19:37:34 +08:00
spam process API
This commit is contained in:
@@ -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={}"
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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"))
|
||||||
|
|||||||
@@ -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)',
|
||||||
|
|||||||
Reference in New Issue
Block a user