新增u2签到,用户信息获取

This commit is contained in:
sftang
2022-09-16 09:41:03 +08:00
parent e97ebcf011
commit 5e3e8769dc
14 changed files with 636 additions and 66 deletions

View File

@@ -12,6 +12,7 @@ from .utils import getSiteUrl
from paddleocr import PaddleOCR
from thefuzz import fuzz
from thefuzz import process
import random
logger = logging.getLogger('sign')
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
@@ -75,7 +76,9 @@ def signIngress(site_name, site_name_cn, site_url, site_cookie, sign_type):
elif sign_type == 'ptsbao':
flag, data = ptsbao(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'ssd':
flag, data = ssd(site_name, site_name_cn, site_url, site_cookie)
flag, data = ssd(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'u2':
flag, data = u2(site_name, site_name_cn, site_url, site_cookie)
else:
flag, data = (False,'%s 未匹配站点' % site_name)
@@ -1564,6 +1567,90 @@ def ssd(site_name, site_name_cn, site_url, site_cookie):
return False, msg
except Exception as e:
msg = "%s(%s) %s" % (site_name, site_name_cn, msg_err_url)
logger.error('--------------%s----------------' % site_name)
logger.error(str(e))
return False, msg
def u2(site_name, site_name_cn, site_url, site_cookie):
"""
签到 动漫花园
"""
headers = {
'user-agent': user_agent,
'cookie': site_cookie
}
#获取网站url,不带/结尾
sign_url = getSiteUrl(site_url) + '/showup.php'
logger.info('--------------%s开始签到----------------' % site_name)
try:
session = requests.session()
response = session.get(sign_url, headers=headers, timeout=10)
if response.status_code == 200:
#需要安装pip install lxml
soup = BeautifulSoup(response.text, "lxml")
tables = soup.findAll('table', {'class':'captcha'})
#print(tables)
data = {}
captcha = []
data['message'] = '我就是来签到看看:)!!!'
if len(tables) != 0:
#获取所有input
info = tables[0].findAll('input')
for i in info:
#print(i)
#获取input的名称,用于post使用
name = i.attrs['name']
if name == 'req':
data['req'] = i.attrs['value']
elif name == 'hash':
data['hash'] = i.attrs['value']
elif name == 'form':
data['form'] = i.attrs['value']
elif 'captcha' in name:
captcha.append(i.attrs['value'])
#随机选择一个作为答案
data['captcha'] = random.choice(captcha)
#不返回任何消息
response = session.post("https://u2.dmhy.org/showup.php?action=show", headers=headers, data=data, timeout=10)
logger.info(data)
#确认是否签到成功
response = session.get(sign_url, headers=headers, timeout=10)
soup = BeautifulSoup(response.text, "lxml")
h3 = soup.findAll('h3', {'align':'center'})
if '今天已签到' in h3[0].get_text():
msg = "%s(%s) %s" % (site_name,site_name_cn, msg_ok)
return True, msg
else:
msg = "%s(%s) %s" % (site_name,site_name_cn, msg_unknow)
return False, msg
else:
h3 = soup.findAll('h3', {'align':'center'})
if '今天已签到' in h3[0].get_text():
msg = "%s(%s) %s" % (site_name, site_name_cn, msg_reok)
return True, msg
else:
msg = "%s(%s) %s" % (site_name, site_name_cn, msg_err_cookie)
return False, msg
else:
msg = "%s(%s) %s" % (site_name, site_name_cn, msg_err_url)
logger.error('--------------%s----------------' % site_name)
logger.error(msg)
return False, msg
except Exception as e:
msg = "%s(%s) %s" % (site_name, site_name_cn, msg_err_url)
logger.error('--------------%s----------------' % site_name)

280
apps/common/sites_user.py Normal file
View File

@@ -0,0 +1,280 @@
# -*- coding:utf-8 -*-
from django.conf import settings
import logging
import os
from bs4 import BeautifulSoup
import requests
import simplejson as json
import re
import time
from .utils import getSiteUrl, parseUrl
logger = logging.getLogger('user')
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27'
def userIngress(site_name, site_name_cn, site_url, site_cookie, sign_type):
"""
站点用户匹配入口
"""
if sign_type in ['general','opencd','nosign']:
flag, data = general(site_name, site_name_cn, site_url, site_cookie)
else:
flag, data = (False,'%s 未匹配站点' % site_name)
return flag, data
if sign_type == 'hdchina':
flag, data = hdchina(site_name, site_name_cn, site_url, site_cookie)
elif sign_type in ['general','opencd','nosign']:
flag, data = general(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'pterclub':
flag, data = pterclub(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'hdarea':
flag, data = hdarea(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'hdcity':
flag, data = hdcity(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'btschool':
flag, data = btschool(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'hares':
flag, data = hares(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'ttg':
flag, data = ttg(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'pt52':
flag, data = pt52(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'keepfrds':
flag, data = keepfrds(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'tjupt':
flag, data = tjupt(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'hd':
flag, data = hd(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'greatposterwall':
flag, data = greatposterwall(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'hdsky':
try:
flag, data = hdsky(site_name, site_name_cn, site_url, site_cookie)
except Exception as e:
logger.error(str(e))
return False,'%s 数据异常' % site_name
elif sign_type == 'haidan':
flag, data = haidan(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'ptsbao':
flag, data = ptsbao(site_name, site_name_cn, site_url, site_cookie)
elif sign_type == 'ssd':
flag, data = ssd(site_name, site_name_cn, site_url, site_cookie)
else:
flag, data = (False,'%s 未匹配站点' % site_name)
return flag, data
def RepresentsInt(s):
"""
判断是否整形
"""
try:
int(s)
return True
except ValueError:
return False
def general(site_name, site_name_cn, site_url, site_cookie):
"""
通用获取
"""
headers = {
'user-agent': user_agent,
'cookie': site_cookie
}
logger.info('--------------%s开始获取用户信息----------------' % site_name)
#获取网站url,不带/结尾
url = getSiteUrl(site_url) + '/index.php'
session = requests.session()
data = {}
#初始0,有些站点可能没有积分
data['score'] = 0
try:
response = session.get(url, headers=headers, timeout=10)
if response.status_code == 200:
#需要安装pip install lxml
soup = BeautifulSoup(response.text, "lxml")
tables = soup.findAll('table', {'id':'info_block'})
#print(tables)
if len(tables) != 0:
#span获取有2个一个为用户信息一个为信箱信息
info = tables[0].findAll('span', {'class':'medium'})
if info == []:
#获取只有1个
info = tables[0].findAll('span', {'class':'nowrap'})
user_info = info[0]
else:
user_info = info[0]
#print(user_info)
#print("-------------")
#用户详情链接
user_info_link = user_info.a.attrs['href']
#获取用户ID
user_id = parseUrl(user_info_link)['query'].get('id',[])[0]
#用户名
user_name = user_info.a.get_text()
#个人页无分享率的情况
try:
#分享率
ratio = user_info.find('font',{'class':'color_ratio'}).nextSibling.get_text()
data['ratio'] = ratio
except:
data['ratio'] = '0'
#print("user_info_link--->",user_info_link)
#print("user_id--->",user_id)
#print("user_name--->",user_name)
data['user_id'] = user_id
data['user_name'] = user_name
if user_id == []:
data['msg'] = "格式错误"
return False, data
userdetails_url = site_url + "/userdetails.php?id=%s" % user_id
response = session.get(userdetails_url, headers=headers, timeout=10)
soup = BeautifulSoup(response.text, "lxml")
tables = soup.findAll('table', {'class':'main'}, limit=2)
if len(tables) == 2:
user_table = tables[1]#.find('table')
else:
user_table = []
if user_table != []:
#print(user_table)
for index, tr in enumerate(user_table.find_all('tr')):
if index == 0:
continue
#由于获取td后 标题内存在一个table,实际完整的一个是15个td标题后面2个td废弃
tds = tr.find_all('td')
#print(tds)
#if '用户ID' in tds[0].get_text():
#data['user_id'] = tds[1].get_text()
data_key = tds[0].get_text().strip()
data_value = tds[1].get_text().strip()
#if ('邀请' in tds[0].get_text() and '邀请人' not in tds[0].get_text()) or ('邀請' in tds[0].get_text() and '邀請人' not in tds[0].get_text()):
#if RepresentsInt(tds[1].get_text()):
#data['invite'] = tds[1].get_text()
#else:
#data['invite'] = 0
if '邀请' == data_key or '邀請' == data_key or '剩余邀请量' == data_key :
#print(data_value)
#删除非数字字符(获取字符串的整数) \D表示非数字
num = re.sub(r'\D+', '', data_value)
if RepresentsInt(num):
data['invite'] = num
else:
data['invite'] = 0
#data['invite'] = data_value
#if '加入日期' in tds[0].get_text():
##替换括号和括号的内容为空
#data['create_time'] = re.sub("\(.*\)",'',tds[1].get_text())
if '加入日期' == data_key:
data['create_time'] = re.sub("\(.*\)",'', data_value)
if '分享率' in tds[0].get_text():
data['ratio'] = tds[0].font.get_text()
if ('上传量' in tds[0].get_text() and '实际' not in tds[0].get_text()) or ('上傳量' in tds[0].get_text() and '實際' not in tds[0].get_text()):
data['upload'] = re.sub("\(.*\)",'',tds[0].get_text().split(':')[-1])
data['download'] = re.sub("\(.*\)",'',tds[1].get_text().split(':')[-1])
#pttime
if '核心数据' == data_key:
data['ratio'] = tds[1].font.get_text()
#分隔4个连续空格['', '上传量: 21.367TB\n ', '下载量: 5.072TB', '魔力值: 6469.8']
d =tds[1].font.nextSibling.get_text().split(u'\xa0\xa0\xa0\xa0')
data['upload'] = d[1].split(':')[-1].replace('\\n','').strip()
data['download'] = d[2].split(':')[-1].strip()
data['bonus'] = d[3].split(':')[-1].strip()
if '等级' in tds[0].get_text() or '等級' in tds[0].get_text():
data['level'] = re.sub("\(.*\)",'',tds[1].img.attrs['title'])
#if '魔力值' in tds[0].get_text():
#data['bonus'] = tds[1].get_text()
if '魔力值' == data_key:
data['bonus'] = data_value
if '做种积分' in tds[0].get_text():
data['score'] = tds[1].get_text()
if '发布种子' in tds[0].get_text() or '發布種子' in tds[0].get_text():
if '个种子' in tds[1].get_text():
#页面直接包含数据
data['published_seed_num'] = tds[1].a.nextSibling.get_text().split('')[0].replace('(','').replace('个种子','')
else:
url = getSiteUrl(site_url) + "/getusertorrentlistajax.php?userid=%s&type=uploaded" % data['user_id']
response = session.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(response.text, "lxml")
published_seed_num= soup.find('b')
if published_seed_num != None:
data['published_seed_num'] = published_seed_num.get_text()
else:
data['published_seed_num'] = 0
if '当前做种' in tds[0].get_text() or '目前做種' in tds[0].get_text():
if '个种子' in tds[1].get_text():
data['seed_num'] = tds[1].a.nextSibling.get_text().split('')[0].replace('(','').replace('个种子','')
data['totle_seed_size'] = tds[1].a.nextSibling.get_text().split('')[-1].replace('(','').replace('共计','')
else:
url = getSiteUrl(site_url) + "/getusertorrentlistajax.php?userid=%s&type=seeding" % data['user_id']
response = session.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(response.text, "lxml")
seed_num= soup.find('b')
if seed_num != None:
data['seed_num'] = seed_num.get_text()
data['totle_seed_size'] = seed_num.nextSibling.get_text().split('')[-1]
#pttime
if '记录' in data['totle_seed_size']:
url = site_url + "/getusertorrentlist.php?userid=%s&type=seeding" % data['user_id']
response = session.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(response.text, "lxml")
tds = soup.findAll('td',{'id':'outer'}, limit=2)
#print(tds)
span = tds[1].find_all('span')
#print(span[1].get_text())
data['totle_seed_size'] = span[2].get_text().split('')[-1].replace(u'\xa0','')
else:
data['seed_num'] = 0
data['totle_seed_size'] = 0
return True, data
else:
data['msg'] = "格式错误"
return False, data
else:
data['msg'] = "格式错误"
return False, data
else:
data['msg'] = "cookie过期"
return False, data
except:
data['msg'] = "无法登录"
return False, data

View File

@@ -28,6 +28,7 @@ from urllib import parse
from wechatpy.enterprise import WeChatClient
from PIL import Image, ImageDraw, ImageFont
import re
import random
logger = logging.getLogger('django')
@@ -664,6 +665,7 @@ def parseUrl(url):
"""
拆解url
#scheme='https', netloc='127.0.0.1:8080', path='/', params='', query='', fragment=''
#{'protocol': '', 'url': '', 'host': '', 'port': None, 'path': 'userdetails.php', 'params': '', 'query': {'id': ['16465']}}
"""
data = {}
u = urlparse(url)
@@ -675,7 +677,8 @@ def parseUrl(url):
data['port'] = u.port
data['path'] = u.path
data['params'] = u.params
data['query'] = u.query
#将查询字符串字典话
data['query'] = parse.parse_qs(u.query)
return data
@@ -855,4 +858,21 @@ class EnWechat:
else:
msg = reponse['errmsg']
return False, msg
return False, msg
def Unicode():
"""
随机产生汉字
"""
val = random.randint(0x4e00, 0x9fbf)
return chr(val)
def GBK2312():
"""
随机产生汉字
"""
head = random.randint(0xb0, 0xf7)
body = random.randint(0xa1, 0xfe)
val = f'{head:x} {body:x}'
str = bytes.fromhex(val).decode('gb2312')
return str

View File

@@ -67,7 +67,7 @@ def backupImport(request):
backup_file = os.path.join(settings.BACKUP_DIR,'pthelper.json')
logger.info("Starting load process.")
call_command('loaddata', 'test_dump.json')
call_command('loaddata', backup_file)
#==================

View File

@@ -13,7 +13,8 @@ import qbittorrentapi
from common.utils import send_email,send_telegram,send_iyuu, send_enwechat, parseUrl
from common.sites_sign import signIngress
from sites.models import SiteConfig, SiteInfo
from common.sites_user import userIngress
from sites.models import SiteConfig, SiteInfo, SiteUser
from .models import Job, Log
from notify.models import NotifyConfig
from rss.models import Rule, SeedInfo
@@ -104,7 +105,10 @@ def my_scheduler(crontab_id=None, crontab_status=None, hour="*", minute="*", job
scheduler.add_job(re_fail_sign, 'cron', hour=hour, minute=minute, id=crontab_id, args=[crontab_id])
elif jobtype_id == 1002:
#RSS订阅
scheduler.add_job(rss, 'cron', hour=hour, minute=minute, id=crontab_id, args=[crontab_id])
scheduler.add_job(rss, 'cron', hour=hour, minute=minute, id=crontab_id, args=[crontab_id])
elif jobtype_id == 1001:
#更新用户信息
scheduler.add_job(getUserInfo, 'cron', hour=hour, minute=minute, id=crontab_id, args=[crontab_id])
else:
#禁用状态,直接删除任务
@@ -127,7 +131,9 @@ def my_scheduler(crontab_id=None, crontab_status=None, hour="*", minute="*", job
elif jobtype_id == 1003:
scheduler.add_job(re_fail_sign, 'cron', hour=hour, minute=minute, id=crontab_id, args=[crontab_id])
elif jobtype_id == 1002:
scheduler.add_job(rss, 'cron', hour=hour, minute=minute, id=crontab_id, args=[crontab_id])
scheduler.add_job(rss, 'cron', hour=hour, minute=minute, id=crontab_id, args=[crontab_id])
elif jobtype_id == 1001:
scheduler.add_job(getUserInfo, 'cron', hour=hour, minute=minute, id=crontab_id, args=[crontab_id])
return True
@@ -574,4 +580,69 @@ def seed_download(seedinfo_id):
except Exception as e:
print(e)
return
return
def getUserInfo(crontab_id):
"""
更新用户信息
"""
#保存最后发送的结果
send_data = []
count_siteinfo = SiteInfo.objects.count()
#未配置任何站点直接返回
if count_siteinfo == 0:
return
_TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
ormdata_siteinfo = SiteInfo.objects.all()
for i in ormdata_siteinfo:
#记录ID值
site_id = i.id
site_name = i.siteconfig_name
site_cookie = i.cookie
site_name_cn = i.siteconfig_name_cn
#获取站点配置信息
site_config = SiteConfig.objects.get(name=site_name)
site_url = site_config.index_url
site_sign_type = site_config.sign_type
flag, data = userIngress(site_name, site_name_cn, site_url, site_cookie, site_sign_type)
if flag:
count_userinfo = SiteUser.objects.filter(siteinfo_id = site_id).count()
if count_userinfo == 0:
#无记录
SiteUser.objects.create(siteinfo_id=i,
username = data['user_name'],
uid = int(data['user_id']),
invite = int(data['invite']),
create_time = datetime.datetime.strptime(data['create_time'].strip(), _TIME_FORMAT).strftime('%Y-%m-%d %H:%M:%S'),
ratio = data['ratio'].strip(),
upload = data['upload'].strip(),
download = data['download'].strip(),
bonus = data['bonus'],
score = data['score'],
level = data['level'],
published_seed_num = int(data['published_seed_num']),
seed_num = int(data['seed_num']),
totle_seed_size = data['totle_seed_size']
)
else:
#已经存在
SiteUser.objects.filter(siteinfo_id=site_id).update(username = data['user_name'],
uid = int(data['user_id']),
invite = int(data['invite']),
ratio = data['ratio'].strip(),
upload = data['upload'].strip(),
download = data['download'].strip(),
bonus = data['bonus'],
score = data['score'],
level = data['level'],
published_seed_num = int(data['published_seed_num']),
seed_num = int(data['seed_num']),
totle_seed_size = data['totle_seed_size']
)
return

View File

@@ -122,62 +122,47 @@
</div>
</div>
<!--
<div class="layui-col-xs12 layui-col-sm6 layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">
今日签到成功<span class="layui-badge layui-badge-blue pull-right">个</span>
</div>
<div class="layui-card-body">
<p class="lay-big-font">1</p>
</div>
</div>
</div>
<div class="layui-col-xs12 layui-col-sm6 layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">
今日签到失败<span class="layui-badge layui-badge-red pull-right">个</span>
</div>
<div class="layui-card-body">
<p class="lay-big-font">1</p>
</div>
</div>
</div>
<div class="layui-col-xs12 layui-col-sm6 layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">
总做种下载量<span class="layui-badge layui-badge-red pull-right">GB</span>
</div>
<div class="layui-card-body">
<p>做种<span class="pull-right">1G</span></p>
<p>下载<span class="pull-right">1G</span></p>
</div>
</div>
</div>
-->
</div>
<div class="layui-row layui-col-space15">
<div>
<div class="layui-card">
<div class="layui-card-header">用户信息</div>
<div class="layui-card-body dynamic-card-body mini-bar" style="height: 100%;">
<ul class="layui-timeline layui-timeline-dynamic">
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<div class="layui-timeline-title">编辑中
</div>
</li>
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis active"></i>
<div class="layui-timeline-content layui-text">
<div class="layui-timeline-title">编辑中
</div>
</li>
</ul>
<div class="layui-card-header">用户信息&emsp;&emsp;&emsp;
<button class="layui-btn layui-btn-sm" lay-filter="updateuser-submit" lay-submit>更新数据</button>
</div>
<div class="layui-card-body">
<table class="layui-table" lay-skin="line">
<colgroup>
<col/>
<col/>
<col/>
<col/>
<col/>
<col/>
<col/>
<col/>
<col/>
<col/>
</colgroup>
<thead>
<tr>
<td>站点</td>
<td>用户名</td>
<td>用户ID</td>
<td>等级</td>
<td align="center">分享率</td>
<td>做种数</td>
<td>做种体积</td>
<td>魔力值</td>
<td>积分</td>
<td>入站时间</td>
</tr>
</thead>
<tbody>
{{ siteusers|safe }}
</tbody>
</table>
</div>
</div>
</div>

View File

@@ -1,7 +1,7 @@
from django.shortcuts import render
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import TemplateView
from sites.models import SiteInfo
from sites.models import SiteInfo,SiteUser
# Create your views here.
class DashboardListView(LoginRequiredMixin, TemplateView):
@@ -13,11 +13,41 @@ class DashboardListView(LoginRequiredMixin, TemplateView):
def get_context_data(self, **kwargs):
#配置站点总数
sites_count = SiteInfo.objects.count()
count_sites = SiteInfo.objects.count()
html_data = []
count_siteuser = SiteUser.objects.count()
if count_siteuser == 0:
html_data.append("<td><span class=\"layui-text\">请等待数据更新或手动点击更新</span></td>")
else:
ormdata_siteuser = SiteUser.objects.all()
for i in ormdata_siteuser:
d = "<tr><td><span class=\"layui-text\"><a>%s(%s)</a></span></td> \
<td>%s</td> \
<td>%s</td> \
<td>%s</td> \
<td align=\"center\">%s</td> \
<td>%s</td> \
<td>%s</td> \
<td>%s</td> \
<td>%s</td> \
<td>%s</td> \
</tr>" % (i.siteinfo_id.siteconfig_name,i.siteinfo_id.siteconfig_name_cn,
i.username,
i.uid,
i.level,
i.ratio,
i.seed_num,
i.totle_seed_size,
i.bonus,
i.score,
i.create_time
)
html_data.append(d)
context = {
'sites_num': sites_count,
# 'action': 'Asset list',
'sites_num': count_sites,
'siteusers': "".join(html_data),
}
kwargs.update(context)
return super(DashboardListView, self).get_context_data(**kwargs)

View File

@@ -78,6 +78,7 @@ def init_datas():
{'name':'piggo','name_cn':'猪猪网','index_url':'https://piggo.me','sign_type':'general'},
{'name':'wintersakura','name_cn':'冬樱','index_url':'https://wintersakura.net','sign_type':'general'},
{'name':'hdpt','name_cn':'明教','index_url':'https://hdpt.xyz','sign_type':'general'},
{'name':'u2','name_cn':'动漫花园','index_url':'https://u2.dmhy.org','sign_type':'u2'},
]
for site in sites_data:
@@ -106,7 +107,7 @@ def init_datas():
print('开始初始化任务类型...')
jobtypes_data = [{'name':'签到','type_id':1000},
{'name':'辅种','type_id':1001},
{'name':'用户信息','type_id':1001},
{'name':'RSS订阅','type_id':1002},
{'name':'签到重试','type_id':1003},
]
@@ -121,6 +122,8 @@ def init_datas():
else:
#将原刷流更新为RSS订阅
JobType.objects.filter(type_id=1002).update(name = 'RSS订阅')
#将原铺种更新为用户信息
JobType.objects.filter(type_id=1001).update(name = '用户信息')
print('任务类型 [%s] 已经存在,忽略...' % jobtype['name'])
print('开始初始化通知邮箱类型...')

View File

@@ -312,7 +312,9 @@ def seed_download(request):
)
#获取种子id
torrent_id = torrent.id
c.start_torrent(torrent_id)
ormdata_seedinfo.seed_torrent_id = torrent_id
ormdata_seedinfo.seed_status = True
ormdata_seedinfo.save()

View File

@@ -0,0 +1,32 @@
# Generated by Django 4.1 on 2022-09-15 11:39
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('sites', '0014_alter_siteinfo_siteconfig_name_cn'),
]
operations = [
migrations.CreateModel(
name='SiteUser',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('username', models.CharField(max_length=50, verbose_name='用户名')),
('uid', models.IntegerField(verbose_name='用户ID号')),
('create_time', models.DateTimeField(verbose_name='账号创建时间')),
('ratio', models.CharField(max_length=20, verbose_name='分享率')),
('upload', models.CharField(max_length=50, verbose_name='上传量')),
('download', models.CharField(max_length=50, verbose_name='下载量')),
('bonus', models.CharField(max_length=50, verbose_name='魔力值')),
('score', models.CharField(max_length=50, verbose_name='积分')),
('level', models.CharField(max_length=20, verbose_name='等级')),
('published_seed_num', models.IntegerField(verbose_name='发种数量')),
('seed_num', models.IntegerField(verbose_name='做种数量')),
('siteinfo_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sites.siteinfo')),
],
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.1 on 2022-09-15 14:59
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sites', '0015_siteuser'),
]
operations = [
migrations.AddField(
model_name='siteuser',
name='invite',
field=models.IntegerField(default=0, verbose_name='邀请数量'),
),
migrations.AddField(
model_name='siteuser',
name='totle_seed_size',
field=models.CharField(default=0, max_length=20, verbose_name='做种体积'),
),
]

View File

@@ -39,4 +39,23 @@ class SiteInfo(models.Model):
siteconfig_name = models.CharField('网站名简称,英文', max_length=50, unique=True)
siteconfig_name_cn = models.CharField('网站名简称,中文', max_length=50, null=True)
cookie = models.CharField("网站cookie信息", max_length=800)
passkey = models.CharField("网站秘钥", max_length=200)
passkey = models.CharField("网站秘钥", max_length=200)
class SiteUser(models.Model):
"""
站点用户信息
"""
siteinfo_id = models.ForeignKey(SiteInfo, on_delete=models.CASCADE)
username= models.CharField('用户名', max_length=50)
uid = models.IntegerField('用户ID号')
invite = models.IntegerField('邀请数量',default=0)
create_time = models.DateTimeField('账号创建时间')
ratio = models.CharField('分享率', max_length=20)
upload = models.CharField('上传量', max_length=50)
download = models.CharField('下载量', max_length=50)
bonus = models.CharField('魔力值', max_length=50)
score = models.CharField('积分', max_length=50)
level = models.CharField('等级', max_length=20)
published_seed_num = models.IntegerField('发种数量')
seed_num = models.IntegerField('做种数量')
totle_seed_size = models.CharField('做种体积', max_length=20,default=0)

View File

@@ -333,6 +333,7 @@ def siteinfoExport(request):
for i in ormdata:
data.append({"name":i.siteconfig_name,
"name_cn":i.siteconfig_name_cn,
"cookie":i.cookie,
"passkey":i.passkey,
})
@@ -374,17 +375,20 @@ def siteinfoImport(request):
siteconfig_name = i['name']
cookie = i['cookie']
passkey = i['passkey']
siteconfig_name_cn = i['name_cn']
get_site = SiteInfo.objects.filter(siteconfig_name=siteconfig_name).count()
if get_site == 0:
SiteInfo.objects.create(siteconfig_name = siteconfig_name,
cookie = cookie,
passkey = passkey,
siteconfig_name_cn = siteconfig_name_cn
)
else:
#更新站点配置
SiteInfo.objects.filter(siteconfig_name=siteconfig_name).update(cookie = cookie,
passkey=passkey,
siteconfig_name_cn=siteconfig_name_cn
)
response_data={"code":1,"msg":"更新成功"}