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