虾米签到脚本

2013年10月27日 分类: Python (460 个脚步)

每天做同一件事,有时候会忘记做没做。你明明记得已经做完了啊,最后发现没做时已经晚了。。

就拿虾米和百度贴吧的签到来说,连续了几天签到后,由于忙着工作的事情,每次都是忘记了我今天签到了没,有时候记得是签了,但是过后才发现没签到时已经完蛋了。。

一怒之下,在网上找了下签到脚本,有2种方式,一个是在linux的机器上面定期执行,第二个就是利用Google Appengine来帮完成签到。

后者设置起来非常麻烦,但是他的优点就是不用使用你自己的系统,不受系统限制。你想让他什么时候签到都可以。

前者的话需要一个unix系统,并且需要安装python(好像基本上都是内置的了)。

如果你的系统是windows的话,可以研究下Google Appengine来实现签到。

我使用的是前者。放着vps不用就是浪费。。

我现在用的是在网上的脚本下修改过的,能发送邮件通知当天的签到结果,防止出现异常情况。

详细的代码如下

#!/usr/bin/python3
#coding=utf-8 
import datetime
import re

from urllib.request import urlopen,install_opener,build_opener,Request,HTTPHandler,HTTPCookieProcessor
from http.cookiejar import CookieJar
from urllib.parse import urlencode

import smtplib
from email.mime.text import MIMEText
from email.utils     import formatdate
from email.header import Header 

#发信服务器
smtpHost = 'smtp.qq.com'
#端口
sslPort  = '465'
#发件人
fromMail = 'someone@shiniv.com'
#用户名
username = '123456'
#密码
password = '123456'
 
#在此填写账户名(可多账户)
user_info=[
	{"email":"10000@qq.com","password":"123456"},
]

site_urls={
	"index":r"http://www.xiami.com/web",
	"login":r"http://www.xiami.com/web/login",
	"signin":r"http://www.xiami.com/task/signin",
}

login_form={
	'LoginButton':'登陆',
	'remember': 1,
}

#flags
site_flags={
	"logged-in":r"我的虾米",
	"login-failed":"email或者密码错误",
	"identify-required":"请输入验证码",
	"not-signed-in":"还没有加入虾米网",
	"signed-in":"我的留言",
}

headers = {'Referer':'http://www.xiami.com/web/login', 'User-Agent':'Mozilla/5.0',}
uid_re="/web/friends/id/([0-9]*)\""

#=========================
def login(n):
	cookie_support= HTTPCookieProcessor(CookieJar())
	opener = build_opener(cookie_support, HTTPHandler)
	install_opener(opener)
	lf=login_form
	lf.update(user_info[n])
	
	login_url = 'http://www.xiami.com/web/login'
	login_data = urlencode(lf).encode("utf-8")
	login_headers = {'Referer':'http://www.xiami.com/web/login', 'User-Agent':'Opera/9.60',}
	login_request = Request(login_url, login_data, login_headers)
	content = urlopen(login_request).read().decode("utf-8")
	
	login_flag = None
	if content.find(site_flags["login-failed"])!=-1:
		print("%s %s:邮箱或密码错误.\r\n"%(datetime.datetime.now(),user_info[n]["email"]))
		sendmail(user_info[n]["email"], "账号 %s 登陆失败。\n账号或密码错误,请手动到虾米签到" %(user_info[n]["email"]))
	if content.find(site_flags["identify-required"])!=-1:
		print("%s %s:需要输入验证码.\r\n"%(datetime.datetime.now(),user_info[n]["email"]))
		sendmail(user_info[n]["email"], "账号 %s 登陆失败。\n需要输入验证码,请手动到虾米签到" %(user_info[n]["email"]))
	if content.find(site_flags["logged-in"])!=-1:
		print("%s %s:登陆成功."%(datetime.datetime.now(),user_info[n]["email"]))
		login_flag = 'success'
	if login_flag==None:
		return	
		
	profile_url="http://www.xiami.com/web/profile"
	profile_request = Request(profile_url,headers=login_headers)
	content = urlopen(profile_request).read().decode("utf-8")
	install_opener(opener)
	
	UID=re.findall(uid_re,content)[0]
	checkin_url="http://www.xiami.com/web/checkin/id/"+UID
	checkin_headers = {'Referer':'http://www.xiami.com/web/', 'User-Agent':'Opera/9.99',}
	checkin_request = Request(checkin_url, None, checkin_headers)
	checkin_response = urlopen(checkin_request).read().decode("utf-8")
	checkin_pattern = re.compile(r'<a class="check_in" href="(.*?)">')
	checkin_result = checkin_pattern.search(checkin_response)

	if not checkin_result:
		pattern = re.compile(r'<div class="idh">已连续签到(\d+)天</div>')
		result = pattern.search(checkin_response)
		if result:
			sendmail(user_info[n]["email"], "亲,账号%s今天已经签到过了,当前已经签到了%s天" %(user_info[n]["email"], result.group(1)))
			return None;
		else :
			sendmail(user_info[n]["email"], "账号%s签到失败,请手动到虾米签到" %(user_info[n]["email"]))
			return None
	checkin_url = 'http://www.xiami.com' + checkin_result.group(1)
	checkin_headers = {'Referer':'http://www.xiami.com/web', 'User-Agent':'BH_Toolchain0.5',}
	checkin_request = Request(checkin_url, None, checkin_headers)
	checkin_response = urlopen(checkin_request).read().decode("utf-8")
	pattern = re.compile(r'<div class="idh">已连续签到(\d+)天</div>')
	result = pattern.search(checkin_response)
	if result:
		sendmail(user_info[n]["email"], "亲,你的账号%s签到成功,当前已经签到%s天" %(user_info[n]["email"], result.group(1)))
		return None
	else :
		sendmail(user_info[n]["email"], "账号%s签到失败,请手动到虾米签到" %(user_info[n]["email"]))
		return None

def sendmail(email, message):
	#邮件标题和内容
	subject  = u'[虾米签到]签到结果'
	body     = u'签到结果:\n' + message
	 
	#初始化邮件
	encoding = 'utf-8'
	mail = MIMEText(body.encode(encoding),'plain',encoding)
	mail['Subject'] = Header(subject,encoding)
	mail['From'] = fromMail
	mail['To'] = email
	mail['Date'] = formatdate()
	 
	try:
		smtp = smtplib.SMTP_SSL(smtpHost,sslPort)
		smtp.ehlo()
		smtp.login(username,password)
		smtp.sendmail(fromMail,email,mail.as_string())
		smtp.close()
		print('send mail seccessfully')
	except Exception:
		print ('Error: unable to send email')

#=========================
if __name__=="__main__":
	for i in range(len(user_info)):
		login(i)

保存成为一个.py文件

需要注意的是 这个脚本必须需要python3 

如果不是的话得升级成python3才能正常使用。

再将他加进系统的计划任务中

1 0 * * * python3 /your_python_code_path/xiami_sign.py 

每天0点1分的时候,就会帮你自动签到,而且会发送邮件报告当前签到情况。

虾米签到脚本 【声明】本文 虾米签到脚本 为柠之漠然原创文章,转载请注明出自 枫之落叶
并保留本文有效链接:https://blog.shiniv.com/2013/10/xiami-auto-sign-script-code/ , 转载请保留本声明!

标签: , , , , , ,
目前还没有任何评论.
你必须要启用 Javascript