注册v2也有一年多了, 以前偶尔会上去看看, 现在是重度用户, 每天都会看好几次.
年初看到有讨论v2自动登录领金币帖子, 有很多网友也分享了自动签到脚本, 
我也拷贝了其中一份, 放在服务器上每天自动签到, 一直都挺好的, 金币现在也有一万多了, 
不过前不久v2登录添加了验证, 自动签到脚本失效了, 所以趁着国庆假期, 简单修改了一下脚本, 
现在是半自动签到, 第一次或Cookie失效后, 都需要手动处理一下.
目前已经稳定签到10天了, 所以看看网友有需要的吗.
v2截图

手动登录

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
还没有人评论,抢个沙发吧...