2025-04-01 22:53:32 +08:00

151 lines
5.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import base64
import json
import os.path
import random
import time
import requests
from loguru import logger
from sqlmodel import Session, select
from .base import BaseReporter
from ...config.config import AppCtx
from ...models.report_urls import ReportUrlModel
from ...utils.common import get_proxies, get_all_cookies, md5
from ...utils.gen_cookie import GenCookie
from ...utils.ua import random_ua
class WapReporter(BaseReporter):
def __init__(self):
self.engine_name = "WAP_REPORTER"
self.report_url = "https://ufosdk.baidu.com/api?m=Client&a=postMsg"
self.request = requests.session()
self.proxies = get_proxies()
self.headers = {
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': random_ua(is_wap=True),
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-US;q=0.7,zh-TW;q=0.6',
'sec-ch-ua_wap': '"Not(A:Brand";v="99", "Google Chrome";v="133", "Chromium";v="133"',
'sec-ch-ua_wap-mobile': '?0',
'sec-ch-ua_wap-platform': '"Windows"',
"Cookie": "",
}
self.database = AppCtx.g_db_engine
self.all_cookies = get_all_cookies()
def run(self):
"""实现 WAP 端的举报逻辑"""
with Session(self.database) as session:
stmt = select(ReportUrlModel).where(ReportUrlModel.is_report_by_wap == False)
rows: list[ReportUrlModel] = session.exec(stmt).all()
logger.debug(f"[{self.engine_name}] 共找到 {len(rows)} 条待举报记录")
for row in rows:
# 选个 cookie
report_cookie = random.choice(get_all_cookies())
report_site_cookie = GenCookie.run(report_cookie)
self.headers["Cookie"] = report_site_cookie
self.headers["User-Agent"] = random_ua()
logger.debug(f"{report_cookie=}")
# 获取用户信息
userinfo = self.get_user_info()
if not userinfo:
logger.warning(f"[{self.engine_name}] 跳过 {row.surl} 的举报userinfo 获取失败")
continue
# 举报
img_path = f"./imgs/{row.domain}/{md5(row.surl)}.png"
if not os.path.exists(img_path):
logger.error(f"截图文件 {img_path} 不存在")
continue
result = self.do_report(userinfo, img_path, row.surl, row.q)
if result:
row.is_report_by_wap = True
session.add(row)
session.commit()
time.sleep(5)
def get_user_info(self):
try:
userinfo = {}
# wapUserAgent = random.choice(self.wapUserAgent)
response = self.request.get(
"https://ufosdk.baidu.com/api?m=Web&a=getUserInfo&appid=293852",
headers=self.headers, proxies=self.proxies, allow_redirects=False, timeout=10, verify=False
)
json_data = response.json()
uid = json_data['result']['uid']
un = json_data['result']['un']
userinfo["uid"] = uid
userinfo["un"] = un
logger.debug(f"{userinfo=}")
return userinfo
except Exception as e:
logger.error(f"[{self.engine_name}]获取用户信息错误: {e}")
return None
def do_report(self, userinfo: dict, img_path: str, fb_url: str, extend_query: str):
# 组装 extra 数据
with open(img_path, "rb") as fp:
img_data = fp.read()
img_data = base64.b64encode(img_data).decode("utf-8")
extra_string_data = {
"ufo_app_version": "3.0",
"feedback_position": "0",
"extend_query": extend_query,
"resource_id": "1599",
"feedback_source": "其他",
"feedback_source_text": "其他",
"extend_url": f"https://wap.baidu.com/s?word=url:{fb_url}",
"fb_url": fb_url,
"extend_feedback_channel": "36923",
"relation_words": "",
"industry_one": "30",
"industry_two": "197",
"user": userinfo["un"],
"baiducuid": ""
}
post_data = {
"appid": "293852",
"content": f"{fb_url} 存在大量色情淫秽信息",
"uid": userinfo["uid"],
"uname": userinfo["un"],
"ajax": "1",
"submit_type": "1",
"extend_feedback_channel": "0",
"baiducuid": "",
"extend_url": "",
"extrastring": json.dumps(extra_string_data, ensure_ascii=False),
"screenshot[]": f"data:image/png;base64,{img_data}"
}
response = self.request.post(
self.report_url,
data=post_data,
headers=self.headers,
proxies=self.proxies,
allow_redirects=False,
timeout=10,
verify=False
)
# logger.debug(req.json())
logger.debug(response.json())
if response.json()['errno'] == 0:
logger.success(f"[{self.engine_name}] {fb_url} 举报成功")
return True
return False