mirror of
https://github.com/ClovertaTheTrilobita/SanYeCao-Nonebot.git
synced 2026-04-01 22:04:51 +00:00
feat(lightnovel): 添加轻小说推荐功能
This commit is contained in:
parent
1d1634bb22
commit
77e052a175
12 changed files with 951 additions and 5 deletions
|
|
@ -17,7 +17,7 @@ pycryptodome
|
|||
PyExecJS
|
||||
gradio_client
|
||||
tortoise-orm
|
||||
urllib3==1.26.5
|
||||
urllib3
|
||||
zhdate
|
||||
chinese_calendar
|
||||
lunardate
|
||||
|
|
@ -34,3 +34,4 @@ lazy_object_proxy
|
|||
openai
|
||||
typing_extensions
|
||||
psutil
|
||||
Beautifulsoup4
|
||||
51
src/clover_lightnovel/html_to_img.py
Normal file
51
src/clover_lightnovel/html_to_img.py
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
import os
|
||||
from datetime import datetime
|
||||
from os import getcwd
|
||||
from pathlib import Path
|
||||
|
||||
from nonebot_plugin_htmlrender import template_to_pic
|
||||
from playwright.async_api import async_playwright
|
||||
|
||||
from src.configs.path_config import light_novel_path
|
||||
import src.clover_lightnovel.wenku8 as Wenku8
|
||||
|
||||
|
||||
async def save_img(data: bytes):
|
||||
|
||||
"""
|
||||
保存日报图片
|
||||
:param data:
|
||||
:return:
|
||||
"""
|
||||
file_path = light_novel_path + f"{datetime.now().date()}.png"
|
||||
with open(file_path, "wb") as file:
|
||||
file.write(data)
|
||||
|
||||
async def get_ln_image():
|
||||
now = datetime.now()
|
||||
file = Path() / light_novel_path / f"{now.date()}.png"
|
||||
if os.path.exists(file):
|
||||
with file.open("rb") as image_file:
|
||||
return image_file.read()
|
||||
|
||||
await Wenku8.login()
|
||||
await Wenku8.get_books()
|
||||
|
||||
async with async_playwright() as p:
|
||||
browser = await p.chromium.launch()
|
||||
|
||||
image_bytes = await template_to_pic(
|
||||
template_path=getcwd() + "/src/clover_lightnovel/",
|
||||
template_name="output1.html",
|
||||
templates={"data": None},
|
||||
pages={
|
||||
"viewport": {"width": 578, "height": 578},
|
||||
"base_url": f"file://{getcwd()}",
|
||||
},
|
||||
wait=2,
|
||||
)
|
||||
await save_img(image_bytes)
|
||||
await browser.close()
|
||||
return image_bytes
|
||||
|
||||
|
||||
BIN
src/clover_lightnovel/res/font/NotoSansSC-Bold.otf
Normal file
BIN
src/clover_lightnovel/res/font/NotoSansSC-Bold.otf
Normal file
Binary file not shown.
BIN
src/clover_lightnovel/res/font/NotoSansSC-Regular.otf
Normal file
BIN
src/clover_lightnovel/res/font/NotoSansSC-Regular.otf
Normal file
Binary file not shown.
BIN
src/clover_lightnovel/res/font/SSFangTangTi.ttf
Normal file
BIN
src/clover_lightnovel/res/font/SSFangTangTi.ttf
Normal file
Binary file not shown.
759
src/clover_lightnovel/style.css
Normal file
759
src/clover_lightnovel/style.css
Normal file
|
|
@ -0,0 +1,759 @@
|
|||
@font-face {
|
||||
font-family: "Noto Sans SC B";
|
||||
src: url("./res/font/NotoSansSC-Bold.otf") format("opentype");
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Noto Sans SC";
|
||||
src: url("./res/font/NotoSansSC-Regular.otf") format("opentype");
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "SSFangTangTi";
|
||||
src: url("./res/font/SSFangTangTi.ttf");
|
||||
}
|
||||
|
||||
/* basic */
|
||||
*{
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
body{
|
||||
background: transparent;
|
||||
text-align: center;
|
||||
font: 12px/120% 宋体,Verdana,Arial,sans-serif;
|
||||
}
|
||||
|
||||
a{
|
||||
color: #4a4a4a;
|
||||
text-decoration: none;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
a:hover{
|
||||
color: #0033ff;
|
||||
}
|
||||
|
||||
span{
|
||||
line-height: 120%;
|
||||
}
|
||||
|
||||
p{
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6{
|
||||
font-size: 16px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
img{
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
div{
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
hr{
|
||||
height: 1px;
|
||||
border: 1px solid #a4cded;
|
||||
clear: both;
|
||||
margin: 5px 0px;
|
||||
}
|
||||
|
||||
ul{
|
||||
list-style: none;
|
||||
clear: both;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
li{
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
/* table */
|
||||
table{
|
||||
text-align: left;
|
||||
font: 12px/120% 宋体,Verdana,Arial,sans-serif;
|
||||
}
|
||||
|
||||
table td{
|
||||
}
|
||||
|
||||
table.fix{
|
||||
table-layout: fixed;
|
||||
}
|
||||
|
||||
table.fix td{
|
||||
white-space:nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow:ellipsis;
|
||||
-o-text-overflow:ellipsis;
|
||||
}
|
||||
|
||||
table.grid{
|
||||
border-collapse: collapse;
|
||||
border: 1px solid #a4cded;
|
||||
padding: 3px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
table.grid caption, .gridtop{
|
||||
border: 1px solid #a4cded;
|
||||
background: #e9f1f8;
|
||||
background-image: url("image/caption_bg.gif");
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
color:#054e86;
|
||||
font-weight: bold;
|
||||
font-size: 14px;
|
||||
margin: auto;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
table.grid th, .head{
|
||||
border: 1px solid #a4cded;
|
||||
background: #f0f7ff;
|
||||
color:#054e86;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
font-size: 12px;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
table.grid td{
|
||||
border: 1px solid #a4cded;
|
||||
background-color: #ffffff !important;
|
||||
padding-top: 4px;
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
|
||||
table.hide, table.hide th, table.hide td{
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/* table add-ons */
|
||||
|
||||
.title{
|
||||
background: #e9f1f8;
|
||||
text-align: center;
|
||||
padding: 3px;
|
||||
color:#054e86;
|
||||
font-weight: bold;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.even{
|
||||
background: #ffffff;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.odd{
|
||||
background: #ffffff;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.foot{
|
||||
background: #f0f7ff;
|
||||
padding: 3px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.bottom{
|
||||
height: 9px;
|
||||
background: #b7b785;
|
||||
}
|
||||
|
||||
|
||||
/* form */
|
||||
|
||||
form{}
|
||||
|
||||
input{}
|
||||
|
||||
.text{
|
||||
border: 1px solid #a4cded;
|
||||
background: #ffffff;
|
||||
color: #054e86;
|
||||
height: 18px;
|
||||
}
|
||||
|
||||
.textarea{
|
||||
border: 1px solid #a4cded;
|
||||
background: #ffffff;
|
||||
color: #054e86;
|
||||
}
|
||||
|
||||
.button{
|
||||
background: #ddf2ff;
|
||||
border: 1px solid #a4cded;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.checkbox, .radio{border-width: 0px;}
|
||||
|
||||
.select{height: 20px;}
|
||||
/* structure */
|
||||
|
||||
#wrapper{
|
||||
background:url(image/tabbg1_1.gif)}
|
||||
|
||||
#left{
|
||||
float: left;
|
||||
width: 185px;
|
||||
margin-right:6px;
|
||||
}
|
||||
|
||||
#right{
|
||||
float: right;
|
||||
width: 185px;
|
||||
}
|
||||
|
||||
#centers{
|
||||
float: left;
|
||||
width: 578px;
|
||||
}
|
||||
|
||||
#centerm{
|
||||
float: left;
|
||||
width: 768px;
|
||||
}
|
||||
|
||||
#centerl{
|
||||
float: left;
|
||||
width: 960px;
|
||||
}
|
||||
|
||||
#content{
|
||||
|
||||
}
|
||||
|
||||
.main{
|
||||
width: 960px;
|
||||
clear: both;
|
||||
text-align: center;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
margin-top:3px;
|
||||
}
|
||||
|
||||
.m_top{
|
||||
line-height: 27px;
|
||||
height: 27px;
|
||||
background-image: url("image/m_top_bg.gif");
|
||||
background-repeat: repeat-x;
|
||||
margin-top:0px;
|
||||
}
|
||||
|
||||
.m_head{
|
||||
height: 90px;
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.h_logo{
|
||||
float:left;
|
||||
width:230px;
|
||||
}
|
||||
|
||||
.h_banner{
|
||||
float:left;
|
||||
}
|
||||
|
||||
.h_link{
|
||||
float:right;
|
||||
width:90px;
|
||||
padding-top:6px;
|
||||
}
|
||||
|
||||
.m_menu{
|
||||
background:#55a0ff;
|
||||
height:22px;
|
||||
border-top:1px solid #e4e4e4;
|
||||
border-bottom:1px solid #e4e4e4;
|
||||
padding-top:3px;
|
||||
margin-bottom:3px;
|
||||
}
|
||||
|
||||
.m_foot{
|
||||
text-align:center;
|
||||
padding: 20px 0px;
|
||||
margin-top:3px;
|
||||
margin-bottom:10px;
|
||||
border-top: 1px dashed #A4CDED;
|
||||
border-bottom: 1px dashed #A4CDED;
|
||||
}
|
||||
|
||||
.blocktop{
|
||||
border: 1px solid #a4cded;
|
||||
margin: 8px;
|
||||
width: 222px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.blockcaption{
|
||||
background: #e9f1f8;
|
||||
background-image: url("image/caption_bg.gif");
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
color:#054e86;
|
||||
font-weight: bold;
|
||||
font-size: 14px;
|
||||
margin: auto;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.block{
|
||||
// border: 1px solid #a4cded;
|
||||
// margin-bottom: 5px;
|
||||
width: 600px;
|
||||
}
|
||||
|
||||
.blocktitle{
|
||||
border-top: 2px solid #ffffff;
|
||||
border-bottom: 1px solid #ffffff;
|
||||
border-left: 2px solid #ffffff;
|
||||
border-right: 1px solid #ffffff;
|
||||
font-weight: bold;
|
||||
font-size: 14px;
|
||||
background: #45667d;
|
||||
color: #FFFAFA;
|
||||
height: 26px;
|
||||
line-height: 26px;
|
||||
padding-left: 10px;
|
||||
font-family: "Noto Sans SC B";
|
||||
}
|
||||
|
||||
.blockcontent{
|
||||
border-top: 1px solid #a3bee8;
|
||||
padding: 3px;
|
||||
background-color: #edf8ff;
|
||||
border-radius: 0px;
|
||||
padding: 10px;
|
||||
font-family: "Noto Sans SC B";
|
||||
}
|
||||
.blockcontenttop{
|
||||
border-top: 1px solid #a3bee8;
|
||||
border-bottom: 1px solid #a3bee8;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.blocknote{
|
||||
border-top: 1px solid #a4cded;
|
||||
padding: 3px;
|
||||
text-align: center;
|
||||
background: #f0f7ff;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.blocktitle span0{
|
||||
position: relative;
|
||||
bottom: -5px;
|
||||
border-top: 1px solid #a4cded;
|
||||
border-left: 1px solid #a4cded;
|
||||
border-right: 1px solid #a4cded;
|
||||
background: #ffffff;
|
||||
padding: 3px 6px 3px 6px;
|
||||
color: #c42205;
|
||||
height: 22px;
|
||||
line-height: 22px;
|
||||
}
|
||||
|
||||
.blocktitle .txt{
|
||||
background-image: url("image/title_l.gif");
|
||||
background-repeat: no-repeat;
|
||||
color: #0049A0;
|
||||
float: left;
|
||||
font-size: 13px;
|
||||
font-weight: bold;
|
||||
line-height: 20px;
|
||||
padding-bottom: 0px;
|
||||
padding-left: 16px;
|
||||
padding-right: 8px;
|
||||
padding-top: 7px;
|
||||
}
|
||||
|
||||
.blocktitle .txtr{
|
||||
background-image: url("image/title_r.gif");
|
||||
background-repeat: no-repeat;
|
||||
float: left;
|
||||
height: 27px;
|
||||
width: 7px;
|
||||
}
|
||||
|
||||
.gameblocktop{
|
||||
border: 1px solid #a4cded;
|
||||
margin: 10px;
|
||||
width: 216px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.gameblockcontent{
|
||||
border-top: 1px solid #a3bee8;
|
||||
padding: 3px 8px;
|
||||
}
|
||||
|
||||
.appblocktop{
|
||||
border: 1px solid #a4cded;
|
||||
margin: 10px;
|
||||
width: 938px;
|
||||
float: left;
|
||||
}
|
||||
.appblockcaption{
|
||||
background: #e9f1f8;
|
||||
background-image: url("image/caption_bg.gif");
|
||||
vertical-align: middle;
|
||||
text-align: left;
|
||||
color:#054e86;
|
||||
font-weight: bold;
|
||||
font-size: 14px;
|
||||
margin: auto;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.appblockcontent{
|
||||
border-top: 1px solid #a3bee8;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
#left .blocktitle, #right .blocktitle{
|
||||
border: 0px;
|
||||
background-image: url("image/title_bg.gif");
|
||||
background-repeat: repeat-x;
|
||||
height: 27px;
|
||||
}
|
||||
|
||||
#left .blockcontent, #right .blockcontent{
|
||||
border: 0px;
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
/* custom */
|
||||
|
||||
.ultop li{list-style: decimal inside; margin: 3px 4px; border-bottom: 1px dashed #d8e4ef; color: #1b74bc;white-space:nowrap;}
|
||||
.ultop li a{color: #c42205;}
|
||||
.ultops li{ margin: 3px 4px; border-bottom: 1px dashed #d8e4ef; color: #1b74bc;white-space:nowrap;}
|
||||
.ultops li a{color: #c42205;}
|
||||
.ulitem li{list-style: circle inside; margin-left: 3px;}
|
||||
.ulrow li{padding:3px;}
|
||||
.ulrowlink li{padding:0px 1px;}
|
||||
.ulcenter li{text-align: center;}
|
||||
.ulmul{overflow: hidden;}
|
||||
|
||||
.fix, .lm{white-space:nowrap; text-overflow:ellipsis; -o-text-overflow:ellipsis; overflow: hidden;}
|
||||
.fl{float:left;}
|
||||
.fr{float:right;}
|
||||
.cl{clear:left;}
|
||||
.cr{clear:right;}
|
||||
.cb{clear:both;}
|
||||
.tl{text-align:left;}
|
||||
.tc{text-align:center;}
|
||||
.tr{text-align:right;white-space:nowrap;overflow: hidden;}
|
||||
.more{text-align: right;}
|
||||
|
||||
.c_title{
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
font-size: 16px;
|
||||
line-height: 200%;
|
||||
}
|
||||
|
||||
.c_head{
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.c_content{
|
||||
font-size: 14px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.c_foot{
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.c_label{
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.c_value{
|
||||
}
|
||||
|
||||
/* attention */
|
||||
|
||||
.hottext, a.hottext{color: #ff0000;}
|
||||
.poptext, a.poptext{color: #c42205;}
|
||||
.notetext, a.notetext{color: #1979cc;}
|
||||
.errortext, a.errortext{color: #ff0000;}
|
||||
|
||||
a.btnlink{color: #535353; background: #ffffff; border:0px solid #a4cded; height:16px; padding: 2px 10px 0px 10px;}
|
||||
a.btnlink:hover{background: #fffff;}
|
||||
|
||||
a.btnlink1{color: #535353; background: #fffff; border:0px solid #a4cded; height:16px; padding: 2px 10px 0px 10px;}
|
||||
a.btnlink1:hover{background: #fffff;}
|
||||
|
||||
a.btnlink2{color: #535353; background: #DDF2FF; border:1px solid #a4cded; height:16px; padding: 2px 10px 0px 10px;}
|
||||
a.btnlink2:hover{background: #CCCCCC;}
|
||||
|
||||
/* interface */
|
||||
|
||||
.jieqiQuote, .jieqiCode, .jieqiNote{
|
||||
border: #000000 1px solid;
|
||||
padding: 2px;
|
||||
font-size: 12px;
|
||||
color: #000000;
|
||||
background-color: #a4cded;
|
||||
}
|
||||
|
||||
.divbox{
|
||||
border: 1px solid #a4cded;
|
||||
margin-bottom: 3px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.textbox{
|
||||
border: 1px solid #a4cded;
|
||||
padding: 5px;
|
||||
margin: 3px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.popbox{
|
||||
position:absolute;
|
||||
width:190px !important;
|
||||
height:110px !important;
|
||||
width:200px;
|
||||
height:120px;
|
||||
border: 1px solid #a4cded;
|
||||
background: #f0f7ff;
|
||||
color: #ff0000;
|
||||
font-size: 12px;
|
||||
line-height:120%;
|
||||
padding: 3px;
|
||||
display:none;
|
||||
z-index:9999;
|
||||
}
|
||||
|
||||
#tips {
|
||||
border: 1px solid #a4cded;
|
||||
padding: 3px;
|
||||
display: none;
|
||||
background: #f0f7ff;
|
||||
position: absolute;
|
||||
z-index: 2000;
|
||||
}
|
||||
|
||||
.tablist ul{height:25px; margin:0px 0px 0px 10px; padding:0px;}
|
||||
.tablist li{float:left; height:24px; list-style:none; margin-right:3px;}
|
||||
.tablist li a{float:left; height:24px; line-height:24px; padding:0px 10px; display:block; background:#f0f7ff; text-decoration:none; color:#000000; border:1px solid #a4cded; border-bottom:none; }
|
||||
.tablist li a.selected{ background:#ffffff; height:25px; position:relative; margin-bottom:-1px;}
|
||||
.tabcontent{clear:both; border:1px solid #a4cded; padding:10px;}
|
||||
|
||||
.pages{
|
||||
padding: 5px 0px;
|
||||
}
|
||||
.pagelink{
|
||||
border: 1px solid #a4cded;
|
||||
float: right;
|
||||
background: #f0f7ff;
|
||||
line-height:24px;
|
||||
padding:0;
|
||||
}
|
||||
.pagelink a, .pagelink strong, .pagelink em, .pagelink kbd, .pagelink a.first, .pagelink a.last, .pagelink a.prev, .pagelink a.next, .pagelink a.pgroup, .pagelink a.ngroup{
|
||||
float: left;
|
||||
padding: 0 6px;
|
||||
}
|
||||
.pagelink a:hover{background-color: #ffffff; }
|
||||
.pagelink strong{font-weight: bold; color: #ff6600; background: #e9f1f8;}
|
||||
.pagelink kbd{height:24px; border-left: 1px solid #a4cded;}
|
||||
.pagelink em{height:24px; border-right: 1px solid #a4cded; font-style:normal;}
|
||||
.pagelink input{border: 1px solid #a4cded; color: #054e86; margin-top:1px; height: 18px;}
|
||||
|
||||
/* menu */
|
||||
|
||||
.nav {
|
||||
position: relative;
|
||||
background: url("image/nav_bg.png") no-repeat 0 -36px;
|
||||
margin-bottom:3px;
|
||||
}
|
||||
.navinner {
|
||||
background: url("image/nav_bg.png") no-repeat 100% -72px;
|
||||
}
|
||||
.navlist {
|
||||
height: 36px;
|
||||
overflow: hidden;
|
||||
margin: 0px;
|
||||
background: url("image/nav_bg.png") repeat-x 0 0;
|
||||
}
|
||||
.nav li {
|
||||
height: 36px;
|
||||
line-height: 36px;
|
||||
float: left;
|
||||
display: inline;
|
||||
margin: 0 0 0 -2px;
|
||||
padding: 0 4px 0 6px;
|
||||
background: url("image/nav_bg.png") no-repeat 0 -108px;
|
||||
}
|
||||
.nav a {
|
||||
display: block;
|
||||
width: 85px;
|
||||
text-align: center;
|
||||
font-size: 120%;
|
||||
}
|
||||
.nav a:link, .nav a:visited {
|
||||
color: #fff;text-decoration:none;
|
||||
}
|
||||
.nav a.current, .nav a:hover, .nav a:active {
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
background: url("image/nav_bg.png") no-repeat 50% -144px;
|
||||
}
|
||||
.subnav {
|
||||
position: absolute;
|
||||
top: 40px;
|
||||
left: 0;
|
||||
float: left;
|
||||
height: 27px;
|
||||
white-space: nowrap;
|
||||
line-height: 27px;
|
||||
background: url("image/nav_bg.png") no-repeat 0 -180px;
|
||||
}
|
||||
* html .subnav {
|
||||
margin: 0 10px 0 -10px; /* IE 6 and below */
|
||||
}
|
||||
.subnav p {
|
||||
padding: 0px 10px;
|
||||
background: url("image/nav_bg.png") no-repeat 100% -234px;
|
||||
}
|
||||
.subnav p span {
|
||||
display: block;
|
||||
height: 27px;
|
||||
line-height: 27px;
|
||||
background: url("image/nav_bg.png") repeat-x 0 -207px;
|
||||
}
|
||||
.subnav p.pointer {
|
||||
position: absolute;
|
||||
top: -4px;
|
||||
left: 0;
|
||||
height: 5px;
|
||||
width: 11px;
|
||||
padding: 0;
|
||||
margin-left: 20px;
|
||||
text-indent: -999em;
|
||||
background: url("image/nav_bg.png") repeat-x 0 -261px;
|
||||
}
|
||||
.subnav a {
|
||||
display: inline;
|
||||
padding: 0;
|
||||
font-size: 100%;
|
||||
}
|
||||
[class~="subnav"] a {
|
||||
padding: 0 3px;
|
||||
}
|
||||
.subnav, .subnav a:link, .subnav a:visited {
|
||||
color: #235e99;
|
||||
}
|
||||
.subnav a:hover, .subnav a:active {
|
||||
color: #235e99;
|
||||
}
|
||||
.subnav a:hover, .subnav a:active {
|
||||
font-weight: normal;
|
||||
background: none;
|
||||
border-bottom: 1px solid;
|
||||
}
|
||||
/* subnav position and pointer position */
|
||||
#subnav1 { left: 80px; }
|
||||
#subnav2 { left: 170px; }
|
||||
#subnav3 { left: 260px; }
|
||||
#subnav4 { left: 350px; }
|
||||
#subnav0, #subnav5, #subnav6, #subnav7, #subnav8, #subnav9 {
|
||||
left: auto;
|
||||
right: 0px;
|
||||
}
|
||||
|
||||
#subnav0 .pointer { left: 100px; }
|
||||
#subnav1 .pointer,
|
||||
#subnav2 .pointer { left: 38px; }
|
||||
#subnav3 .pointer,
|
||||
#subnav4 .pointer { left: 30px; }
|
||||
#subnav5 .pointer { left: auto; right: 450px; }
|
||||
#subnav6 .pointer { left: auto; right: 350px; }
|
||||
#subnav7 .pointer { left: auto; right: 260px; }
|
||||
#subnav8 .pointer { left: auto; right: 160px; }
|
||||
#subnav9 .pointer { left: auto; right: 70px; }
|
||||
|
||||
#subnav1, #subnav2, #subnav3, #subnav4 {
|
||||
min-width: 110px;
|
||||
}
|
||||
#subnav5 { min-width: 340px; }
|
||||
#subnav6 { min-width: 240px; }
|
||||
#subnav7 { min-width: 130px; }
|
||||
.disable { display: none; }
|
||||
|
||||
|
||||
/*ajax框*/
|
||||
.ajaxtip{
|
||||
position:absolute;
|
||||
border: 1px solid #a3bee8;
|
||||
background: #f0f7ff;
|
||||
color: #ff0000;
|
||||
font-size: 12px;
|
||||
line-height:120%;
|
||||
padding: 3px;
|
||||
z-index:1000;
|
||||
}
|
||||
#tips {
|
||||
border: 1px solid #a3bee8;
|
||||
padding: 3px;
|
||||
display: none;
|
||||
background: #f0f7ff;
|
||||
position: absolute;
|
||||
z-index: 2000;
|
||||
}
|
||||
#dialog{
|
||||
position:absolute;
|
||||
top:0px;
|
||||
left:0px;
|
||||
border: 5px solid #8bcee4;
|
||||
background: #f1f5fa;
|
||||
font-size: 12px;
|
||||
line-height:120%;
|
||||
padding: 20px 10px 10px 10px;
|
||||
visibility: hidden;
|
||||
}
|
||||
#mask{
|
||||
position:absolute;
|
||||
top:0px;
|
||||
left:0px;
|
||||
background: #777777;
|
||||
filter: Alpha(opacity=30);
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.userinfo_001{background:url(image/userinfo.gif) 0px 0px no-repeat; padding-left:16px;}
|
||||
.userinfo_002{background:url(image/userinfo.gif) 0px -16px no-repeat; padding-left:16px;}
|
||||
.userinfo_003{background:url(image/userinfo.gif) 0px -34px no-repeat; padding-left:16px;}
|
||||
.userinfo_004{background:url(image/userinfo.gif) 0px -54px no-repeat; padding-left:16px;}
|
||||
.userinfo_005{background:url(image/userinfo.gif) 0px -73px no-repeat; padding-left:16px;}
|
||||
.userinfo_006{background:url(image/userinfo.gif) 0px -94px no-repeat; padding-left:16px;}
|
||||
.userinfo_007{background:url(image/userinfo.gif) 0px -113px no-repeat; padding-left:16px;}
|
||||
.userinfo_008{background:url(image/userinfo.gif) 0px -133px no-repeat; padding-left:16px;}
|
||||
img.avatar{
|
||||
border: 0px;
|
||||
}
|
||||
img.avatars{
|
||||
border: 1px solid #dddddd;
|
||||
}
|
||||
92
src/clover_lightnovel/wenku8.py
Normal file
92
src/clover_lightnovel/wenku8.py
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
from os import getcwd
|
||||
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
from src.configs.api_config import wenku8_username, wenku8_password
|
||||
|
||||
# 登录页面的URL
|
||||
login_url = 'https://www.wenku8.net/login.php?jumpurl=http%3A%2F%2Fwww.wenku8.net%2Findex.php'
|
||||
index_url = 'https://www.wenku8.net/index.php'
|
||||
|
||||
headers = {
|
||||
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
|
||||
'Connection': 'keep-alive',
|
||||
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0',
|
||||
'Upgrade-Insecure-Requests': '1'
|
||||
}
|
||||
|
||||
# 登录表单数据
|
||||
login_data = {
|
||||
'username': wenku8_username,
|
||||
'password': wenku8_password,
|
||||
'usecookie': '0',
|
||||
'action': 'login'
|
||||
}
|
||||
|
||||
|
||||
async def login():
|
||||
# 发送登录请求
|
||||
with requests.Session() as session:
|
||||
# 注意:这里使用了Session对象来保持会话状态
|
||||
login_response = session.post(login_url, data=login_data, headers=headers)
|
||||
|
||||
# 检查登录是否成功(根据实际需求调整)
|
||||
if login_response.status_code == 200:
|
||||
# 登录成功后,Session对象已经自动保存了Cookie
|
||||
# 可以直接使用该Session对象访问受保护的页面
|
||||
print("登录成功!")
|
||||
# 获取 Cookie
|
||||
cookies = session.cookies
|
||||
|
||||
# 保存 Cookie 到文件
|
||||
with open('wenku8.cookie', 'w') as f:
|
||||
for cookie in cookies:
|
||||
f.write(f"{cookie.name}={cookie.value}; ")
|
||||
print("Cookie 保存成功!")
|
||||
else:
|
||||
print("登录失败,状态码:", login_response.status_code)
|
||||
|
||||
|
||||
async def get_books():
|
||||
with open('wenku8.cookie', 'r') as f:
|
||||
cookie = f.read()
|
||||
headers1 = {
|
||||
'Connection': 'keep-alive',
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36",
|
||||
'Upgrade-Insecure-Requests': '1',
|
||||
'Cookie': cookie
|
||||
}
|
||||
|
||||
response = requests.get(index_url, headers=headers1)
|
||||
print(response)
|
||||
html = response.content.decode('gbk')
|
||||
soup = BeautifulSoup(html, 'html.parser')
|
||||
orders = soup.find_all(name='div', class_='block')
|
||||
head = """
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
|
||||
<title>轻小说文库 - 最新最全的日本动漫轻小说在线阅读与下载基地</title>
|
||||
<meta content="IE=EmulateIE7" http-equiv="X-UA-Compatible"/>
|
||||
<meta content="ie-comp" name="renderer"/>
|
||||
<meta content="轻小说,sf轻小说,dmzj轻小说,日本轻小说,动漫小说,轻小说电子书,轻小说TXT下载" name="keywords"/>
|
||||
<meta content="轻小说文库(www.wenku8.com)是收录最全更新最快的动漫sf轻小说网站,提供轻小说在线阅读,TXT与电子书下载,支持手机WAP访问."
|
||||
name="description"/>
|
||||
<meta content="no-cache" http-equiv="Cache-Control"/>
|
||||
<link href="style.css" media="all" rel="stylesheet" rev="stylesheet" type="text/css"/>
|
||||
<script language="javascript" src="/scripts/common.js" type="text/javascript"></script>
|
||||
<script language="javascript" src="/themes/wenku8/theme.js" type="text/javascript"></script>
|
||||
<!-- <link rel="stylesheet" href="main.css">-->
|
||||
</head>
|
||||
"""
|
||||
with open(getcwd() + "/src/clover_lightnovel/output1.html", 'w', encoding='utf-8') as file:
|
||||
file.write(head + str(orders[7]).replace('(<a href="https://www.wenku8.net/zt/sugoi/2025.php"', '').replace(
|
||||
'target="_blank">查看 这本轻小说真厉害!2025 TOP榜单</a>)', '') + str(orders[8]) + str(orders[9]))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
login()
|
||||
get_books()
|
||||
|
|
@ -12,16 +12,35 @@ from src.configs.path_config import video_path
|
|||
chrome_options = Options()
|
||||
chrome_options.add_argument("--headless")
|
||||
|
||||
headers0 = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36",
|
||||
}
|
||||
|
||||
if not os.path.exists('bili.cookie'):
|
||||
# 使用Selenium模拟浏览器获取Cookie
|
||||
# # 使用Selenium模拟浏览器获取Cookie
|
||||
driver = webdriver.Chrome(options=chrome_options)
|
||||
driver.get("https://www.bilibili.com")
|
||||
# cookies = driver.get_cookies()
|
||||
with open('bili.cookie', 'wb') as f:
|
||||
pickle.dump(driver.get_cookies(), f)
|
||||
driver.quit()
|
||||
# with requests.Session() as session:
|
||||
#
|
||||
# login_response = session.post("https://www.bilibili.com/")
|
||||
#
|
||||
# cookies = session.cookies
|
||||
#
|
||||
# # 保存 Cookie 到文件
|
||||
# with open('bili.cookie', 'w') as f:
|
||||
# for cookie in cookies:
|
||||
# f.write(f"{cookie.name}={cookie.value}; ")
|
||||
|
||||
cookies = pickle.load(open('bili.cookie', 'rb'))
|
||||
print("bilicookie")
|
||||
print(cookies)
|
||||
print("---end---")
|
||||
# with open('bili.cookie', 'r') as f:
|
||||
# cookies = f.read()
|
||||
|
||||
headers = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36",
|
||||
|
|
|
|||
|
|
@ -22,3 +22,9 @@ v3key= "<KEY>"
|
|||
# DeepSeek相关配置
|
||||
deepseek_url= "https://api.deepseek.com"
|
||||
deepseek_key= "<KEY>"
|
||||
|
||||
"""
|
||||
Wenku8账号
|
||||
"""
|
||||
wenku8_username = "<user_name>"
|
||||
wenku8_password = "<passwd>"
|
||||
|
|
@ -21,6 +21,9 @@ who_say_path = path+'/image/who_say/'
|
|||
# 日报
|
||||
daily_news_path = path+'/image/report/'
|
||||
|
||||
# 轻小说
|
||||
light_novel_path = path + '/image/lightnovel/'
|
||||
|
||||
# 字体路径
|
||||
font_path = path + '/font/'
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ from src.clover_sqlite.models.user import UserList
|
|||
|
||||
menu = ['/重启','/今日运势','/今日塔罗','/图','/日报','/点歌','/摸摸头','/群老婆','/今日老婆', "/开启ai","/关闭ai","/角色列表","/添加人设", "/更新人设", "/删除人设", "/切换人设", "/管理员注册",
|
||||
'/待办', '/test','/天气','我喜欢你', "❤", "/待办查询", "/新建待办", "/删除待办" ,"/cf","/B站搜索", "/BV搜索", "/喜报", "/悲报", "/luxun","/鲁迅说",
|
||||
"/奶龙", "/repo", "/info", "/menu"]
|
||||
"/奶龙", "/repo", "/info", "/menu", "/轻小说"]
|
||||
|
||||
send_menu = ["/开启ai","/关闭ai","/角色列表","/添加人设", "/更新人设", "/删除人设", "/切换人设", "/管理员注册", '/待办', '/test', '我喜欢你', "❤", "/menu"]
|
||||
|
||||
|
|
|
|||
15
src/plugins/light_novel.py
Normal file
15
src/plugins/light_novel.py
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from nonebot.rule import to_me
|
||||
from nonebot.plugin import on_command
|
||||
from nonebot.adapters.qq import MessageSegment
|
||||
from src.clover_lightnovel.html_to_img import get_ln_image
|
||||
from src.configs.path_config import light_novel_path
|
||||
|
||||
|
||||
light_novel = on_command("轻小说", rule=to_me(), priority=10, block=True)
|
||||
@light_novel.handle()
|
||||
async def get_ln():
|
||||
await get_ln_image()
|
||||
now = datetime.now().date()
|
||||
await light_novel.finish(MessageSegment.file_image(Path(light_novel_path+f"{now}.png")))
|
||||
Loading…
Reference in a new issue