1. 前言
喜欢看4K高清电影的网友,可能都用过4K世界网站。下载电影需要扣除K币,而K币的获取,大部分人是通过每日签到获取,有钱可以直接充值。
最近用python写了个自动登录+签到脚本,下面记录一下分析过程。
2. 网站分析
2.1 登录请求分析
随意输入一个错误的账号密码,点击登录,查看网络抓包
下面就是要找loginhash以及formhash的来源,正常来说,应该是在打开登录页面时拿到的。
2.2 登录页面分析
打开登录页面,不用点击登录,查看抓包
这样,就可以通过python脚本,先打开登录页面,拿到formhash和loginhash之后,再发送登录请求。
下面再看看签到的抓包。
2.3 签到抓包分析
点击签到,查看抓包
下面就是要找sign的来源,和前面一样,先尝试在打开签到页面的抓包中寻找。
所以,可以通过python脚本,先打开签到页面,拿到sign值之后,再发送签到请求。
2.4 整体逻辑总结
python脚本模拟如下动作:
打开登录页面,拿到formhash、loginhash 发送登录请求 打开签到页面,拿到sign值 发送签到请求 也可以在签到前、后把个人中心的K币值都打印出来,方便查看变化。
3. 代码实现
完整源码:CodingSea
注意要使用session, 有一些saltkey之类的cookie,似乎跟加密有关。 经过测试发现,第一次访问页面后,服务器会设置上,如果不使用session,有可能在发送登录或者签到请求时缺少关键cookie导致失败。
import datetime
import sys
import requests
from bs4 import BeautifulSoup
import re
def run():
user_name = sys.argv[1]
user_passwd = sys.argv[2]
session = requests.session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"
})
# 1. 打开登录页面,返回的其实是一个xml,里面有登录需要的关键数据
res = session.get('https://www.4ksj.com/member.php?mod=logging&action=login&infloat=yes&handlekey=login&inajax=1&ajaxtarget=fwin_content_login')
xml_root = BeautifulSoup(res.text, 'lxml')
form = xml_root.find('form', attrs={'name': "login"})
# 2. 解析xml中的关键数据
action = form.attrs['action']
formhash = form.find('input', attrs={'name': "formhash"}).attrs['value']
referer = form.find('input', attrs={'name': "referer"}).attrs['value']
# 3. 发送Post请求登录
login_url = f'https://www.4ksj.com/{action}&inajax=1'
res = session.post(login_url, data={
'formhash': formhash,
'referer': referer,
'username': user_name,
'password': user_passwd,
'questionid': '0',
'answer': ''
})
# 4. 检测是否登录成功
if res.text.find('欢迎您回来') == -1:
print(res.text)
print('登录失败')
return
print(user_name + ' 登录成功 ' + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
# 5. 获取当前K币数量
print('当前K币数量:' + get_KB_num(session))
# 6. 获取签到链接
res = session.get('https://www.4ksj.com/qiandao.php')
qiandao_page = BeautifulSoup(res.text, 'html.parser')
sign_href_tag = qiandao_page.find('a', attrs={'class': 'btna'})
sign_href = sign_href_tag.attrs['href']
sign_url = f'https://www.4ksj.com/{sign_href}'
# 7. 签到
res = session.get(sign_url)
sign_result = BeautifulSoup(res.text, 'html.parser')
sign_msg = sign_result.find('div', id="messagetext").find('p')
print(sign_msg.text)
# 7. 获取当前K币数量
print('签到后K币数量:' + get_KB_num(session))
def get_KB_num(session):
res = session.get('https://www.4ksj.com/home.php?mod=spacecp&ac=credit')
user_page = BeautifulSoup(res.text, 'html.parser')
KB = user_page.find('li', attrs={'class': ['xi1', 'cl']})
ret = re.search(r'K币.*个', KB.text)
return ret.group()
if __name__ == '__main__':
if len(sys.argv) != 3:
print("参数错误")
exit()
run()
4. 定时执行任务
我有一台linux服务器,可以在crontab中可以配置每日定时任务。 示例: 配置每天13点调用一次签到。
0 13 * * * cd /root/python_task/1_4kjs_sign && python ./main.py 账号 密码 >> ./run.log 2>&1
执行结果:
codingsea 登录成功 2024-05-02 13:00:02
当前K币数量:K币: 17 个
您今天已经打过卡了,请勿重复操作!
签到后K币数量:K币: 17 个
5. 待实现功能增强
准备实现签到完成后,通过邮件或者微信通知自己。已实现,文章链接点这里。