Files
ptools/pt_site/views.py
2022-10-13 09:37:56 +08:00

210 lines
8.7 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.
# Create your views here.
import datetime
import logging
import socket
import time
from concurrent.futures.thread import ThreadPoolExecutor
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore
from pt_site.UtilityTool import PtSpider, MessageTemplate, FileSizeConvert
from pt_site.models import MySite, TorrentInfo
from ptools.base import StatusCodeEnum
job_defaults = {
'coalesce': True,
'misfire_grace_time': None
}
executors = {
'default': ThreadPoolExecutor(2)
}
scheduler = BackgroundScheduler(timezone='Asia/Shanghai')
scheduler.add_jobstore(DjangoJobStore(), 'default')
pool = ThreadPoolExecutor(2)
pt_spider = PtSpider()
logger = logging.getLogger('ptools')
# Create your views here.
def auto_sign_in():
"""自动签到"""
start = time.time()
# 获取本人所有站点
queryset = MySite.objects.all()
message_list = pt_spider.do_sign_in(pool, queryset)
end = time.time()
consuming = '> <font color="blue">{} 任务运行成功!耗时:{}完成时间:{} </font>\n'.format(
'自动签到', end - start,
time.strftime("%Y-%m-%d %H:%M:%S")
)
if message_list == 0:
logger.info('已经全部签到咯!!')
else:
logger.info(message_list + consuming)
pt_spider.send_text(message_list + consuming)
logger.info('{} 任务运行成功!完成时间:{}'.format('自动签到', time.strftime("%Y-%m-%d %H:%M:%S")))
def auto_get_status():
"""
更新个人数据
"""
start = time.time()
message_list = '# 更新个人数据 \n\n'
queryset = MySite.objects.all()
site_list = [my_site for my_site in queryset if my_site.site.get_userinfo_support]
results = pool.map(pt_spider.send_status_request, site_list)
message_template = MessageTemplate.status_message_template
for my_site, result in zip(site_list, results):
if result.code == StatusCodeEnum.OK.code:
res = pt_spider.parse_status_html(my_site, result.data)
logger.info('自动更新个人数据: {}, {}'.format(my_site.site, res))
if res.code == StatusCodeEnum.OK.code:
status = res.data[0]
message = message_template.format(
my_site.my_level,
status.my_sp,
my_site.sp_hour,
status.my_bonus,
status.ratio,
FileSizeConvert.parse_2_file_size(status.downloaded),
FileSizeConvert.parse_2_file_size(status.uploaded),
my_site.seed,
my_site.leech,
my_site.invitation,
my_site.my_hr
)
logger.info('组装Message{}'.format(message))
message_list += (
'> <font color="orange">' + my_site.site.name + '</font> 信息更新成功!' + message + ' \n\n')
# pt_spider.send_text(my_site.site.name + ' 信息更新成功!' + message)
logger.info(my_site.site.name + '信息更新成功!' + message)
else:
print(res)
message = '> <font color="red">' + my_site.site.name + ' 信息更新失败!原因:' + res.msg + '</font> \n\n'
message_list = message + message_list
# pt_spider.send_text(my_site.site.name + ' 信息更新失败!原因:' + str(res[0]))
logger.warning(my_site.site.name + '信息更新失败!原因:' + res.msg)
else:
# pt_spider.send_text(my_site.site.name + ' 信息更新失败!原因:' + str(result[1]))
message = '> <font color="red">' + my_site.site.name + ' 信息更新失败!原因:' + result.msg + '</font> \n\n'
message_list = message + message_list
logger.warning(my_site.site.name + '信息更新失败!原因:' + result.msg)
end = time.time()
consuming = '> <font color="blue">{} 任务运行成功!耗时:{} 完成时间:{} </font> \n'.format(
'自动更新个人数据', end - start,
time.strftime("%Y-%m-%d %H:%M:%S")
)
logger.info(message_list + consuming)
pt_spider.send_text(text=message_list + consuming)
def auto_update_torrents():
"""
拉取最新种子
"""
start = time.time()
message_list = '# 拉取免费种子 \n\n'
queryset = MySite.objects.all()
site_list = [my_site for my_site in queryset if my_site.site.get_torrent_support]
results = pool.map(pt_spider.send_torrent_info_request, site_list)
for my_site, result in zip(site_list, results):
logger.info('获取种子:{}{}'.format(my_site.site.name, result))
# print(result is tuple[int])
if result.code == StatusCodeEnum.OK.code:
res = pt_spider.get_torrent_info_list(my_site, result.data)
# 通知推送
if res.code == StatusCodeEnum.OK.code:
message = '> <font color="orange">{}</font> 种子抓取成功!新增种子{}条,更新种子{}条! \n\n'.format(
my_site.site.name,
res.data[0],
res.data[1])
message_list += message
else:
message = '> <font color="red">' + my_site.site.name + '抓取种子信息失败!原因:' + res.msg + '</font> \n'
message_list = message + message_list
# 日志
logger.info(
'{} 种子抓取成功!新增种子{}条,更新种子{}条! '.format(my_site.site.name, res.data[0], res.data[
1]) if res.code == StatusCodeEnum.OK.code else my_site.site.name + '抓取种子信息失败!原因:' + res.msg)
else:
# pt_spider.send_text(my_site.site.name + ' 抓取种子信息失败!原因:' + result[0])
message = '> <font color="red">' + my_site.site.name + ' 抓取种子信息失败!原因:' + result.msg + '</font> \n'
message_list = message + message_list
logger.info(my_site.site.name + '抓取种子信息失败!原因:' + result.msg)
end = time.time()
consuming = '> {} 任务运行成功!耗时:{} 当前时间:{} \n'.format(
'拉取最新种子',
end - start,
time.strftime("%Y-%m-%d %H:%M:%S"))
logger.info(message_list + consuming)
pt_spider.send_text(message_list + consuming)
def auto_remove_expire_torrents():
"""
删除过期种子
"""
start = time.time()
torrent_info_list = TorrentInfo.objects.all().filter(downloader__isnull=False)
for torrent_info in torrent_info_list:
expire_time = torrent_info.sale_expire
if '无限期' in expire_time:
# ToDo 先更新种子信息,然后再判断
continue
if expire_time.endswith(':'):
expire_time += '00'
time_now = datetime.datetime.now()
expire_time_parse = datetime.datetime.strptime(expire_time, '%Y-%m-%d %H:%M:%S')
if time_now >= expire_time_parse:
if not torrent_info.downloader:
# 未推送到下载器,跳过或删除?
continue
if pt_spider.get_torrent_info_from_downloader(torrent_info).code == StatusCodeEnum.OK.code:
# todo 设定任务规则:
# 免费到期后,下载完毕的种子是删除还是保留?
# 未下载完成的,是暂停还是删除?
torrent_info.delete()
end = time.time()
pt_spider.send_text(
'> {} 任务运行成功!耗时:{}{} \n'.format('签到', end - start, time.strftime("%Y-%m-%d %H:%M:%S")))
def auto_push_to_downloader():
"""推送到下载器"""
start = time.time()
print('推送到下载器')
end = time.time()
pt_spider.send_text(
'> {} 任务运行成功!耗时:{}{} \n'.format('签到', end - start, time.strftime("%Y-%m-%d %H:%M:%S")))
def auto_get_torrent_hash():
"""自动获取种子HASH"""
start = time.time()
print('自动获取种子HASH')
time.sleep(5)
end = time.time()
pt_spider.send_text(
'> {} 任务运行成功!耗时:{}{} \n'.format('获取种子HASH', end - start, time.strftime("%Y-%m-%d %H:%M:%S")))
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("127.0.0.1", 44444))
logger.info('启动Django主线程')
except socket.error:
logger.info('启动后台任务')
scheduler.start()
except Exception as e:
logger.info('启动后台任务启动任务失败!{}'.format(e))
# 有错误就停止定时器
pt_spider.send_text(text='启动后台任务启动任务失败!')
scheduler.shutdown()