前段时间一直痴迷小说,但是苦于ta建立用硬币下载小说的功能,每每看到想看的小说,却被银币余额劝退。所以我简单写了一个自动登录的脚本,从此妈妈再也不用担心我是个没有银币的孩子了。
总而言之,就是刚好学了一点逆向,同时我又不想每天费劲登录水银币,于是就写了这么一个脚本。
登录分析:
(1) 找到登录api
可以看到是一个post请求,我们只需模拟请求就可以完成登录。
(2) 分析参数
如果你多请求几次可以发现, 这里的表单数据基本上都是不变的,除了fromhash这个参数,而formhash又可以从html页面直接匹配。
到这里登录就分析完毕了,接下来就是代码实现了
# -*- coding:utf-8 -*-
import re
import requests
class Comment:
def __init__(self, user_name, user_password, c_url):
"""
自动登录账号
:param user_name: 用户名
:param user_password: 用户密码
:param c_url: 评论书籍url
"""
self.user_name = user_name
self.user_pwd = user_password
self.c_url = c_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('出现错误,请重试!!!')
if __name__ == '__main__':
comment_url = "https://www.feb.sbooook.com/forum.php?mod=viewthread&tid=342446&extra=" # 评论书籍
Comment('your_name', 'your_pwd', comment_url)
至此登录已经完毕,不要问我光登录有什么用,登录都已经那其他的评论、下载等功能是不是就可以。。。
顺带提一下,它的服务器很容易崩溃,也就是说在现实其他功能的时候,尽量不用使用线程或多进程,用的话也最好控制一下最大进程/线程数,不要给人家服务器搞崩了。