搜书吧自动购买(下载)功能实现

之前已经实现了自动登录、评论的功能,已经可以实现低保生活了。但是扪心自问这样真的满足了吗?No 其实银币的获取最快的方式是发帖,每帖的收益最大300银币。但是我相信很多刚入坑的想发帖挣一波银币的新手,和一些发帖了但是下载量却遥遥无几的吧友来说,还是比较难受的。所以我写了这么一个自动购买的脚本。

流程分析:

  1. 进入书籍首页

  1. 点击下载,弹出购买框

  1. 在购买框里点击购买附件

这样我们就能成功的购买这本小说了,流程分析完毕。接下来分析找到api和分析参数了。

真正购买的api : https://www.feb.sbooook.com/forum.php?mod=misc&action=attachpay&tid=862492&paysubmit=yes&infloat=yes&inajax=1

参数分析:

1.购买框的api和参数

直接正则匹配下载按钮,得到链接。

购买框api :https://www.feb.sbooook.com/forum.php?mod=misc&action=attachpay&aid=2683792&tid=862492&infloat=yes&handlekey=attachpay&inajax=1&ajaxtarget=fwin_content_attachpay

分析链接可知,只有tid和aid变化其他的基本固定

2.购买附件api和参数

(1) 购买附件api:https://www.feb.sbooook.com/forum.php?mod=misc&action=attachpay&tid=862492&paysubmit=yes&infloat=yes&inajax=1

可以看到此链接为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()

效果图:

至此购买自动购买附件已完成。从此妈妈再也不用担心我发帖没人购买了【狗头】

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值