之前已经实现了自动登录、评论的功能,已经可以实现低保生活了。但是扪心自问这样真的满足了吗?No 其实银币的获取最快的方式是发帖,每帖的收益最大300银币。但是我相信很多刚入坑的想发帖挣一波银币的新手,和一些发帖了但是下载量却遥遥无几的吧友来说,还是比较难受的。所以我写了这么一个自动购买的脚本。
流程分析:
进入书籍首页
点击下载,弹出购买框
在购买框里点击购买附件
这样我们就能成功的购买这本小说了,流程分析完毕。接下来分析找到api和分析参数了。
参数分析:
1.购买框的api和参数
直接正则匹配下载按钮,得到链接。
分析链接可知,只有tid和aid变化其他的基本固定
2.购买附件api和参数
可以看到此链接为post请求,参数tid变化。
(2) 表单数据:
这些数据其实都是从购买框里的,直接拿它返回过来的参数使用就行。
流程和参数分析完毕,接下来就是代码实现了。
代码实现(登录、评论、购买):
# -*- coding:utf-8 -*-
import re
import requests
import random
class Comment:
def __init__(self, r_user_name, r_user_password, c_url, d_url):
"""
自动登录账号
:param r_user_name: 用户名
:param r_user_password: 用户密码
:param c_url: 评论书籍url
"""
self.user_name = r_user_name
self.user_pwd = r_user_password
self.c_url = c_url
self.d_url = d_url
self.base_url = "https://www.feb.sbooook.com/"
self.session = requests.session()
self.user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76"
self.logging_api = f"{self.base_url}member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1 " # 登录接口
self.headers = {
"Cache-Control": "no-cache",
"Content-Type": "application/x-www-form-urlencoded",
"Pragma": "no-cache",
"Referer": self.base_url,
"User-Agent": self.user_agent
}
self.book_page = self.session.get(url=self.c_url, headers=self.headers).text
# 匹配fromhash
self.formhash = re.findall('<input type="hidden" name="formhash" value="(.*)" />', self.book_page)[0]
# 表单参数
data = {
'username': self.user_name,
'password': self.user_pwd,
'formhash': self.formhash,
'quickforward': "yes",
'handlekey': "ls"}
# 登录账号
res = self.session.post(url=self.logging_api, headers=self.headers, data=data).text
if f"window.location.href='{self.base_url}';" in res:
print(f'账号:{self.user_name} 登录成功!!!')
else:
print('登录失败,请重试!!!')
def comment(self):
"""
自动回复功能
:return:
"""
# 匹配回复按钮
url = self.c_url
comment_text = ["啥也不说了,楼主就是给力!", "看了LZ的帖子,我只想说一句很好很强大!", "谢谢楼主分享,祝搜书吧越办越好!"] # 回复信息
book_page = self.session.get(url=url, headers=self.headers).text # 小说首页
book_name = re.findall('<title>(.*?)</title>', book_page)[0]
comment_btn_url = re.findall('''onclick="showWindow.'reply', '(.*?)'."''', book_page)[0] # 匹配回复按钮url
tid = re.findall("tid=(.*)", comment_btn_url)[0] # 匹配tid
fid = re.findall("fid=(.*?)&", comment_btn_url)[0] # 匹配fid
comment_headers = {
"Cache-Control": "no-cache",
"Content-Type": "application/x-www-form-urlencoded",
"Pragma": "no-cache",
"upgrade-insecure-requests": "1",
"Referer": f"{self.base_url}forum.php?mod=viewthread&tid={tid}&extra=",
"User-Agent": self.user_agent
}
comment_box_url = f"{self.base_url}{comment_btn_url}&infloat=yes&handlekey=reply&inajax=1&ajaxtarget=fwin_content_reply" # 回复框api
comment_box = self.session.get(url=comment_box_url, headers=comment_headers).text # 回复框
comment_data = {"formhash":
re.findall('<input type="hidden" name="formhash" id="formhash" value="(.*)" />',
comment_box)[0],
"handlekey": "register",
"noticeauthor":
re.findall('<input type="hidden" name="noticeauthor" value="(.*)" />',
comment_box)[0],
"noticetrimstr":
re.findall('<input type="hidden" name="noticetrimstr" value="(.*)" />',
comment_box)[0],
"noticeauthormsg":
re.findall('<input type="hidden" name="noticeauthormsg" value="(.*)" />',
comment_box)[0],
"usesig":
re.findall('<input type="hidden" name="usesig" value="(.*)"/>', comment_box)[0],
"subject": re.findall(
'<input name="subject" id="subject" class="px" value="(.*)" tabindex="21" style="width: 25em" />',
comment_box)[0],
"message": random.choice(comment_text).encode('gbk')
}
comment_api = f"{self.base_url}forum.php?mod=post&infloat=yes&action=reply&fid={fid}&extra=&tid={tid}&replysubmit=yes&inajax=1" # 回复api
res_text = self.session.post(url=comment_api, headers=comment_headers, data=comment_data).text
if "errorhandle_register" in res_text:
print(self.user_name + re.findall("errorhandle_register.'(.*?)'", res_text)[0])
elif "succeedhandle_register" in res_text:
print(f"{self.user_name} 回复 {book_name} 成功!")
def pay_coin(self):
try:
pay_box_headers = {
"Cache-Control": "no-store, private, post-check=0, pre-check=0, max-age=0",
"Content-Type": "text/xml; charset=gbk",
"Pragma": "no-cache",
"Referer": self.d_url,
"User-Agent": self.user_agent,
"x-requested-with": "XMLHttpRequest"
}
get_coin_headers = {
"Cache-Control": "max-age=0",
"Content-Type": "application/x-www-form-urlencoded",
"Pragma": "no-cache",
"Referer": self.d_url,
"User-Agent": self.user_agent,
}
pay_coin_book_info = self.session.get(url=self.d_url, headers=self.headers).text # 下载小说首页
book_name = re.findall('<title>(.*?)</title>', pay_coin_book_info)[0] # 下载小说名
aid = re.findall('aid=(.*?)&', pay_coin_book_info)[0]
tid = re.findall('tid=(.*?)"', pay_coin_book_info)[0]
# 请求购买框
pay_box_url = f"https://www.feb.sbooook.com/forum.php?mod=misc&action=attachpay&aid={aid}&tid={tid}&infloat=yes&handlekey=attachpay&inajax=1&ajaxtarget=fwin_content_attachpay" # 购买框api
pay_box_info = self.session.get(url=pay_box_url, headers=pay_box_headers).text # 购买框信息
# 购买附件
pay_coin_url = f"https://www.feb.sbooook.com/forum.php?mod=misc&action=attachpay&tid={tid}&paysubmit=yes&infloat=yes&inajax=1"
data = {
'formhash': re.findall('<input type="hidden" name="formhash" value="(.*)" />', pay_box_info),
'referer': re.findall('<input type="hidden" name="referer" value="(.*)" />', pay_box_info),
'aid': aid,
'handlekey': "register"
}
res = self.session.post(url=pay_coin_url, headers=get_coin_headers, data=data).text # 购买附件
if 'succeedhandle_register' in res:
print(f'{self.user_name} 购买{book_name}成功 !!!')
else:
print(f'f{self.user_name} 银币数量不够!!! ')
except IndexError:
print(f'{self.user_name} 已下载过该附件!!! ')
if __name__ == '__main__':
user_name = '' # 搜书吧用户名
password = '' # 搜书吧密码
comment_url = "" # 评论书籍url
download_url = "" # 下载书籍url
Comment(user_name, password, comment_url, download_url).pay_coin()
效果图:
至此购买自动购买附件已完成。从此妈妈再也不用担心我发帖没人购买了【狗头】