V2EX 半自动签到

前提

注册v2也有一年多了, 以前偶尔会上去看看, 现在是重度用户, 每天都会看好几次.

年初看到有讨论v2自动登录领金币帖子, 有很多网友也分享了自动签到脚本,

我也拷贝了其中一份, 放在服务器上每天自动签到, 一直都挺好的, 金币现在也有一万多了,

不过前不久v2登录添加了验证, 自动签到脚本失效了, 所以趁着国庆假期, 简单修改了一下脚本,

现在是半自动签到, 第一次或Cookie失效后, 都需要手动处理一下.

目前已经稳定签到10天了, 所以看看网友有需要的吗.

贴图

v2截图

https://i.loli.net/2017/10/18/59e6e4a871388.png

手动登录

https://i.loli.net/2017/10/18/59e6e4f5e3711.png

修改内容

v2虽然在登录时添加了验证, 浏览器里并不是每天都会重新登录, 那么它一定是保存了登录状态,

以前的自动签到脚本都是每天重新输入用户,密码登录, 没有保存任何登录状态,

所以我们要做的修改就在脚本里也保存登录状态, 第二次请求之前也加上cookie,就可以了,

代码片断

保存Cookie方法

def set_cookie(cookies):
    '''
    store cookie info
    '''
    if os.path.exists(cookie_file):
        os.remove(cookie_file)

    try:
        with open(cookie_file, 'w') as f:
            #pickle.dump(requests.utils.dict_from_cookiejar(cookies), f)
            json.dump(requests.utils.dict_from_cookiejar(cookies), f)
    except:
        pass

读取Cookie方法

def get_cookie():
    '''
    get cookie info from file
    '''
    if os.path.exists(cookie_file):
        try:
            with open(cookie_file, 'r') as f:
                #cookies = requests.utils.cookiejar_from_dict(pickle.load(f))
                cookies = requests.utils.cookiejar_from_dict(json.load(f))
                return cookies
        except:
            pass
    return None

保存captcha方法

def get_captcha(session, once):
    '''
    get captcha pic
    '''

    res = session.get(captcha.format(once));
    #captcha_name = time.time()
    file_name = '{}/captcha/{}.png'.format(path, int(time.time()))
    with open(file_name, 'wb') as f:
        f.write(res.content)
    return file_name

登录方法

def sign(username,passwd):
    cookies = get_cookie()
    session= requests.Session() 
    if not cookies:
        session.headers=headers 
        res = session.get(signin,verify=False)
        html = res.text
        once = re.search(r'value="(\d{5})"', html).group(1) 
        inputs = re.findall(r'type="text" class="sl" name="(.*?)"', html)
        passwordform = re.search(r'type="password" class="sl" name="(.*?)"', html).group(1)
        #print(usernameform)
        #print(passwordform)
        #print(inputs)
        data[inputs[0]]=username 
        data[passwordform]=passwd 
        data['once']=once 
        data['next']='/'         
        file_name = get_captcha(session, once)
        #print(captcha.format(once))
        captcha_code = input('captcha file: {}, please input captcha: '.format(file_name))
        data[inputs[1]] = captcha_code
        #print(data)
        loginp=session.post(signin,data=data,verify=False) 

        #failed = re.search(r'class="problem"', loginp.text)
        #if failed:
        #    logging.info('login failed...')

    else:
        #session = requests.Session(cookies = cookies)
        #print(cookies)
        session.cookies = cookies

    sign=session.get(url).content.decode('UTF-8')
    login_failed = re.search(r'form method="post" action="/signin"', sign)
    if login_failed:
        logging.info('login failed...')
        #rm cookie file
        if os.path.exists(cookie_file):
            os.remove(cookie_file)

        #send telegram message            
        bot = telegram.Bot(token)
        bot.send_message(chat_id=group["id"], text= 'v2ex login failed, need you manual handler.')
        return 
    qiandao=re.findall("location.href = '(.*?)'",sign)[0]
    logging.info(qiandao)
    if (qiandao == '/balance'): 
        logging.info("signed...") 
    else: 
        session.get(home+qiandao,verify=False) 
        logging.info('sign success...') 
    #store cookie
    set_cookie(session.cookies)

在登录前先检测cookie是否存在, 如果不存在可能是第一次登录或者cookie失效已经被删除.

如果cookie存在,则直接使用. 然后就去请求每日任务页面https://www.v2ex.com/mission/daily.

再次检测是否包含signin关键字,如果有signin可能是直接使用cookie登录, 但cookie失效了.

删除cookie文件, 使用telegram bot给特定组发一条消息, 说明v2ex自动签到失效了, 这时就需要手动处理,就像第一次登录一样.

如果没有telegram bot或不需要直接把代码注释就行了.

不足

现在有一个问题是, 手动处理登录时, 是把验证码下载到脚本所在文件夹, 然后使用scp命令下载到本地, 才能看到.

也尝试了直接把验证码连接显示在命令窗口里https://www.v2ex.com/_captcha?once=38624,

v2也添加了认证没有cookie信息, 连接验证码也不显示,

所以目前想到的是在服务上搭一个web服务应该会比较方便.

验证码自动识别

还没有去尝试验证码自动识别, 好像也有很多开源框架, 也有一些收费的接口, 有时间会去了解一下.

如果v友已经做过, 且识别率还可以的话, 也可以分享出来, 大家一起学习.

完整代码

https://gist.github.com/i-sync/02f08e0df3363a64c6ee0d82445f4a6f

评论

还没有人评论,抢个沙发吧...

Viagle Blog

欢迎来到我的个人博客网站