Python中如何实现PT自动签到获取魔力值的脚本

适用于 NexusPHP 搭起来的 PT 站,前提是对方没魔改。

依赖 tesseract pytesseract requests BeautifulSoup


#! /usr/bin/env python3
# -*- coding:utf-8 -*-

import re import logging import requests import pytesseract from io import BytesIO from PIL import Image from urllib.parse import urljoin from bs4 import BeautifulSoup

logging.basicConfig(filename=‘ptsign.log’,filemode=‘a’,level=logging.INFO,format=’%(asctime)s - %(message)s’,datefmt=’%d-%b-%y %H:%M:%S’)

class PreImage(object):

def __init__(self,image):
    self.image = Image.open(image).convert('L')

def image_to_bin(self,threshold=120):
    pixdata = self.image.load()
    w, h = self.image.size
    for y in range(h):
        for x in range(w):
            if pixdata[x, y] < threshold:
                pixdata[x, y] = 0
            else:
                pixdata[x, y] = 255
    return self.image

def delete_point(self):
    pixdata = self.image.load()
    w,h = self.image.size
    for y in range(1,h-1):
        for x in range(1,w-1):
            count = 0
            if pixdata[x,y-1] > 245:
                count = count + 1
            if pixdata[x,y+1] > 245:
                count = count + 1
            if pixdata[x-1,y] > 245:
                count = count + 1
            if pixdata[x+1,y] > 245:
                count = count + 1
            if pixdata[x-1,y-1] > 245:
                count = count + 1
            if pixdata[x-1,y+1] > 245:
                count = count + 1
            if pixdata[x+1,y-1] > 245:
                count = count + 1
            if pixdata[x+1,y+1] > 245:
                count = count + 1
            if count > 6:
                pixdata[x,y] = 255
    return self.image

def to_string(self):

    regex = r"[\'\"\*~!@#$%^&\+\\n\\r;:,\ \_\-\)\(’‘“”]"

    image = self.image_to_bin()
    image = self.delete_point()
    imagestring = pytesseract.image_to_string(image)
    imagestring = re.sub(regex,'',imagestring)
    logging.info('imagestring: {}'.format(imagestring))
    return imagestring

class NexusPHP(object): user_agent = “Mozilla/5.0 (Windows10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.36 Safari/537.36”

def __init__(self,url='https://hdhome.org',user_agent=user_agent):
    self.url = url
    self.session = requests.Session()
    self.session.headers.update({'user-agent':user_agent})
    self.session.headers.update({'origin':self.url})
    self.session.headers.update({'referer':urljoin(self.url,'login.php')})

def login(self,username,password):
    url=urljoin(self.url,'takelogin.php')
    imagestring = self._get_login_imagestring()
    imagehash = self._get_login_imagehash()
    playload = {'imagestrig':imagestring,
                'imagehash':imagehash,
                'username':username,
                'passowrd':password}
    r = self.session.post(url,playload,timeout=6)
    logging.info('get {} code {}'.format(url,str(r.status_code)))
    return self.is_logged_in(r)

def _get_login_imagestring(self):
    url = urljoin(self.url,'login.php')
    r = self.session.get(url,timeout=6)
    soup = BeautifulSoup(r.text,"html.parser")
    img = soup.find_all("img")
    for i in img:
        if 'image' in i['src']:
            imgurl = urljoin(self.url,i['src'])
    image = self.session.get(imgurl)
    image = BytesIO(image.content)
    image = PreImage(image)
    return image.to_string()

def _get_login_imagehash(self):
    url = urljoin(self.url,'login.php')
    r = self.session.get(url,timeout=6)
    soup = BeautifulSoup(r.text,"html.parser")
    imagehash = soup.find("input",{"name":"imagehash"})
    assert imagehash and imagehash['value'],"there is no imagehash on this page"
    logging.info('imagehash: {}'.format(imagehash['value']))
    return imagehash['value']

def is_logged_in(self,r):
    url=urljoin(self.url,'index.php')
    if r:
        r = self.session.get(url,timeout=6)
    return 'Pls keep seeding' in r.text

def sign(self):
    url = urljoin(self.url,'attendance.php')
    self.session.headers.update({'referer':urljoin(self.url,'index.php')})
    self.session.headers.update({'upgrade-insecure-requests':'1'})
    r = self.session.get(url,allow_redirects=False,timeout=6)
    logging.info('get {} code {}'.format(url,str(r.status_code)))
    return r

def main(): import time from random import randrange username = ‘hdhome’ #修改成自己的账号 password = ‘hdhome’ #修改成自己的密码 gzt = NexusPHP(‘https://pt.gztown.net’) #修改成正确的 PT 站点名称 for i in range(1,8): time.sleep(randrange(5)) logging.info(’{} times trying’.format(i)) gzt.login(username,password) time.sleep(randrange(5)) r = gzt.sign() if r.status_code == 200: logging.info(‘sign success’) break else: logging.info(‘sign failure’) continue

if name == ‘main’: main()


Python中如何实现PT自动签到获取魔力值的脚本

23 回复

我自己写了一个用 selenium 的(懒)
还有个油猴的 autothank 脚本
我感觉最厉害的应该是 autoseed 吧 emmmm


要写一个PT站点的自动签到脚本,核心就是模拟浏览器行为发送HTTP请求。这里给你一个完整的示例,用requestsBeautifulSoup处理登录和签到。

import requests
from bs4 import BeautifulSoup
import time
import logging

class PTAutoCheckIn:
    def __init__(self, base_url, username, password):
        self.base_url = base_url.rstrip('/')
        self.session = requests.Session()
        self.username = username
        self.password = password
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        }
        
    def login(self):
        """登录PT站点"""
        login_url = f"{self.base_url}/login.php"
        
        # 先获取登录页面,提取必要的token(如果有)
        resp = self.session.get(login_url, headers=self.headers)
        soup = BeautifulSoup(resp.text, 'html.parser')
        
        # 查找可能的CSRF token(不同站点字段名不同)
        token_input = soup.find('input', {'name': 'form_token'}) or \
                     soup.find('input', {'name': 'csrf_token'}) or \
                     soup.find('input', {'type': 'hidden'})
        
        login_data = {
            'username': self.username,
            'password': self.password,
            'submit': '登录'
        }
        
        if token_input:
            login_data[token_input['name']] = token_input['value']
        
        # 提交登录表单
        resp = self.session.post(login_url, data=login_data, headers=self.headers)
        
        # 检查登录是否成功(根据站点实际情况调整)
        if 'logout.php' in resp.text or '欢迎回来' in resp.text:
            print(f"登录成功: {self.username}")
            return True
        else:
            print("登录失败,请检查账号密码")
            return False
    
    def check_in(self):
        """执行签到操作"""
        # 先访问用户详情页,查找签到链接
        user_url = f"{self.base_url}/userdetails.php?id={self.get_user_id()}"
        resp = self.session.get(user_url, headers=self.headers)
        
        # 查找签到按钮或链接(不同站点选择器不同)
        soup = BeautifulSoup(resp.text, 'html.parser')
        
        # 尝试几种常见的签到选择器
        checkin_btn = soup.find('a', href=lambda x: x and 'attendance.php' in x) or \
                     soup.find('input', {'value': '签到'}) or \
                     soup.find('button', string='签到')
        
        if not checkin_btn:
            print("未找到签到按钮,可能已签到或页面结构不同")
            return False
        
        # 获取签到链接
        if checkin_btn.name == 'a':
            checkin_url = checkin_btn['href']
            if not checkin_url.startswith('http'):
                checkin_url = f"{self.base_url}/{checkin_url.lstrip('/')}"
        else:
            # 如果是表单按钮,需要提交表单
            checkin_url = f"{self.base_url}/attendance.php"
        
        # 执行签到请求
        resp = self.session.get(checkin_url, headers=self.headers)
        
        # 检查签到结果
        if '签到成功' in resp.text or '魔力值' in resp.text:
            print("签到成功!")
            return True
        else:
            print("签到可能失败")
            return False
    
    def get_user_id(self):
        """从cookies或页面中获取用户ID(简化示例)"""
        # 实际需要根据站点具体情况解析
        return self.username  # 临时返回用户名
    
    def run(self):
        """主执行流程"""
        if self.login():
            time.sleep(2)  # 等待一下
            self.check_in()

# 使用示例
if __name__ == "__main__":
    # 配置你的站点信息
    SITE_URL = "https://your-pt-site.com"
    USERNAME = "your_username"
    PASSWORD = "your_password"
    
    bot = PTAutoCheckIn(SITE_URL, USERNAME, PASSWORD)
    bot.run()

关键点说明:

  1. 会话保持:用requests.Session()保持cookies,这样登录后的状态能带到签到请求。

  2. 页面解析:用BeautifulSoup分析HTML结构,找登录表单的隐藏字段和签到按钮。

  3. 站点适配:不同PT站点的页面结构差异很大,你需要:

    • 用浏览器开发者工具查看实际的登录表单字段名
    • 查看签到按钮的HTML结构,调整选择器
    • 可能需要处理JavaScript加载的内容(这种情况要用Selenium)
  4. 定时执行:写完脚本后,在Linux上用cron定时运行,比如每天上午10点:

    0 10 * * * /usr/bin/python3 /path/to/your_script.py
    

注意:实际使用时一定要遵守站点的规则,有些站点明确禁止自动化脚本。建议先手动分析清楚站点的请求流程,再逐步实现自动化。

总结:核心是模拟HTTP请求,关键是分析清楚目标站点的具体流程。



不错啊,写这个也是为了方便挂机。

看起来不错 然而混的 PT 站签到需要看图识片

hdhome 直接把 cookies 拿出来,把签到链接做个请求就好了,也没有验证码什么的,别的站不太清楚。

hdhome 直接 curl 就行了。

sh<br>#!/bin/sh<br><br>curl -I -H "cookie:'your_cookie'" <a target="_blank" href="https://hdhome.org/attendance.php" rel="nofollow noopener">https://hdhome.org/attendance.php</a><br>

qiandao.today 了解下,建个模板比写这堆代码方便多了。另外,大部分 nexus 站的 cookies 都是不会过期的,所以没必要做验证码识别,直接用 cookies 就好。

不如你们邀请我进一个 PT 站,先

ourbits 也可以直接用 curl+cookie 签到

魔力值多到用不完

每年几十万只能买徽章玩

之前也写了一个,验证码识别用的的百度的 ocr,不过后来想想签到也没啥用,魔力够多了,倒是可以防止忘记登录被 ban

可惜 byr 不能用签到换魔力值

零基础求指导

可以指导下吗 cookies 后面的东西怎么替换成自己的网站的

签到请求怎么获取 可以具体说下吗

用 Chrome 浏览器,打开开发者工具,切到 Network 这个 tab,然后登录网站,在请求里就能拿到 cookie 了。

已经抓取签到请求,套套哥无法执行签到,用 putty 登录路由器,发现无法粘贴全部命令 同样方法在另外一个 pt 站签到成功了 请问一下,这是什么原因?

复制种子页面或者 21 点签到请求,在 putty 上执行,发现套套哥跟皇后会出现乱码,最后出现好多大写的 putty 字样,其他 pt 站上则正常

我是在 chrome 的开发者模式中,点击签到后找到签到请求,类似 signin.php checkin.php ,然后再右击 copy as curl(bash),不知道这个是不您说的 curl+cookies 签到,如果不是,请您花两分钟指导一下,万分感谢

cookies 复制的是 signed.php 的 Headers–Request Headers 的 cookies,后面的网址是主网址再加 /signed.php ,但没成功签到 是不是哪里错了

搭建不容易

回到顶部