V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ucun
V2EX  ›  Python

分享一个 PT 自动签到得魔力值的脚本

  •  
  •   ucun · Nov 26, 2018 · 9073 views
    This topic created in 2713 days ago, the information mentioned may be changed or developed.

    适用于 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()
        
    
    22 replies    2020-02-09 21:15:13 +08:00
    alvin666
        1
    alvin666  
       Nov 26, 2018 via Android
    我自己写了一个用 selenium 的(懒)
    还有个油猴的 autothank 脚本
    我感觉最厉害的应该是 autoseed 吧 emmmm
    ucun
        2
    ucun  
    OP
       Nov 26, 2018
    @alvin666

    不错啊,写这个也是为了方便挂机。
    29EtwXn6t5wgM3fD
        3
    29EtwXn6t5wgM3fD  
       Nov 26, 2018
    看起来不错 然而混的 PT 站签到需要看图识片
    bearqq
        4
    bearqq  
       Nov 26, 2018
    hdhome 直接把 cookies 拿出来,把签到链接做个请求就好了,也没有验证码什么的,别的站不太清楚。
    KickAssTonight
        5
    KickAssTonight  
       Nov 26, 2018   ❤️ 1
    hdhome 直接 curl 就行了。

    ```sh
    #!/bin/sh

    curl -I -H "cookie:'your_cookie'" https://hdhome.org/attendance.php
    ```
    Sylv
        6
    Sylv  
       Nov 26, 2018 via iPhone
    qiandao.today 了解下,建个模板比写这堆代码方便多了。另外,大部分 nexus 站的 cookies 都是不会过期的,所以没必要做验证码识别,直接用 cookies 就好。
    Heavytiger
        7
    Heavytiger  
       Nov 26, 2018
    不如你们邀请我进一个 PT 站,先
    ZhangSanAleph
        8
    ZhangSanAleph  
       Nov 26, 2018
    ourbits 也可以直接用 curl+cookie 签到
    weizhiyao008
        9
    weizhiyao008  
       Nov 26, 2018
    魔力值多到用不完
    Mac
        10
    Mac  
       Nov 26, 2018 via Android
    每年几十万只能买徽章玩
    goodryb
        11
    goodryb  
       Nov 26, 2018
    之前也写了一个,验证码识别用的的百度的 ocr,不过后来想想签到也没啥用,魔力够多了,倒是可以防止忘记登录被 ban
    zst
        12
    zst  
       Nov 26, 2018 via Android
    可惜 byr 不能用签到换魔力值
    ucun
        13
    ucun  
    OP
       Nov 27, 2018
    af435727271
        14
    af435727271  
       Jan 10, 2019 via Android
    @ZhangSanAleph 零基础求指导
    af435727271
        15
    af435727271  
       Jan 10, 2019 via Android
    @KickAssTonight 可以指导下吗 cookies 后面的东西怎么替换成自己的网站的
    af435727271
        16
    af435727271  
       Jan 10, 2019 via Android
    @bearqq 签到请求怎么获取 可以具体说下吗
    KickAssTonight
        17
    KickAssTonight  
       Feb 13, 2019
    @af435727271 用 Chrome 浏览器,打开开发者工具,切到 Network 这个 tab,然后登录网站,在请求里就能拿到 cookie 了。
    af435727271
        18
    af435727271  
       Feb 17, 2019
    @KickAssTonight 已经抓取签到请求,套套哥无法执行签到,用 putty 登录路由器,发现无法粘贴全部命令 同样方法在另外一个 pt 站签到成功了 请问一下,这是什么原因?
    af435727271
        19
    af435727271  
       Feb 17, 2019
    @KickAssTonight 复制种子页面或者 21 点签到请求,在 putty 上执行,发现套套哥跟皇后会出现乱码,最后出现好多大写的 putty 字样,其他 pt 站上则正常
    af435727271
        20
    af435727271  
       Feb 17, 2019 via Android
    @KickAssTonight 我是在 chrome 的开发者模式中,点击签到后找到签到请求,类似 signin.php checkin.php ,然后再右击 copy as curl(bash),不知道这个是不您说的 curl+cookies 签到,如果不是,请您花两分钟指导一下,万分感谢
    af435727271
        21
    af435727271  
       Feb 18, 2019 via Android
    @KickAssTonight cookies 复制的是 signed.php 的 Headers--Request Headers 的 cookies,后面的网址是主网址再加 /signed.php ,但没成功签到 是不是哪里错了
    yuhaaitao
        22
    yuhaaitao  
       Feb 9, 2020
    搭建不容易
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2506 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 133ms · UTC 08:35 · PVG 16:35 · LAX 01:35 · JFK 04:35
    ♥ Do have faith in what you're doing.