requests+bs4实现X视频网站自动签到

1. 前言

喜欢看4K高清电影的网友,可能都用过4K世界网站。下载电影需要扣除K币,而K币的获取,大部分人是通过每日签到获取,有钱可以直接充值。

最近用python写了个自动登录+签到脚本,下面记录一下分析过程。

2. 网站分析

2.1 登录请求分析

随意输入一个错误的账号密码,点击登录,查看网络抓包

  • 多试几次,可以看到url基本是固定的,只有这个loginhash每次会变。

  • 再看一下payload数据,有一个formhash值,每次会变。

下面就是要找loginhash以及formhash的来源,正常来说,应该是在打开登录页面时拿到的。

2.2 登录页面分析

打开登录页面,不用点击登录,查看抓包

  • 在返回的html中,就有formhash
  • 另外,loginhash也有

这样,就可以通过python脚本,先打开登录页面,拿到formhash和loginhash之后,再发送登录请求。

下面再看看签到的抓包。

2.3 签到抓包分析

点击签到,查看抓包

  • 从抓包看,访问的签到url中,sign=603e0240是变化的

下面就是要找sign的来源,和前面一样,先尝试在打开签到页面的抓包中寻找。

  • 从签到页面看,html中直接就有sign的值

所以,可以通过python脚本,先打开签到页面,拿到sign值之后,再发送签到请求。

2.4 整体逻辑总结

python脚本模拟如下动作:

  1. 打开登录页面,拿到formhash、loginhash
  2. 发送登录请求
  3. 打开签到页面,拿到sign值
  4. 发送签到请求
  5. 也可以在签到前、后把个人中心的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. 待实现功能增强

准备实现签到完成后,通过邮件或者微信通知自己。已实现,文章链接点这里

建站  ·  开发  ·  读书  ·  教程
↑长按或扫码关注“编程之海”公众号↑
↑长按或扫码关注“编程之海”公众号↑
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论

0

0

443

0
希望看到您的想法,请您发表评论x