Created
May 26, 2014 04:26
-
-
Save creamidea/e7c782c7bccf2cf85874 to your computer and use it in GitHub Desktop.
虾米签到
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
import os | |
import sys | |
import re | |
import json | |
import urllib | |
import urllib2 | |
import cookielib | |
import getpass | |
from threading import Timer | |
class Xiami(object): | |
""" | |
登录虾米 | |
""" | |
loginurl = "https://login.xiami.com/member/login" | |
taobaologinurl = "https://passport.alipay.com/mini_login.htm?lang=&appName=xiami&appEntrance=taobao&cssLink=&styleType=vertical&bizParams=¬LoadSsoView=¬KeepLogin=&rnd=0.6477347570091512?lang=zh_cn&appName=xiami&appEntrance=taobao&cssLink=https%3A%2F%2Fh.alipayobjects.com%2Fstatic%2Fapplogin%2Fassets%2Flogin%2Fmini-login-form-min.css%3Fv%3D20140402&styleType=vertical&bizParams=¬LoadSsoView=true¬KeepLogin=true" | |
signtaskurl = "http://www.xiami.com/task/signin" | |
headers = { | |
'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0', | |
'Referer': 'http://www.xiami.com/', | |
} | |
cookie = cookielib.CookieJar() | |
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) | |
def taobaologin(self): | |
print 'start...' | |
req = urllib2.Request(url=self.taobaologinurl, headers=self.headers) | |
resp = self.opener.open(req) | |
page = resp.read() | |
inputRgx = r"<input(.*)>" | |
inputs = re.findall(inputRgx, page, re.I) | |
form = self.getInfo(inputs) | |
print form | |
req = urllib2.Request(url=self.taobaologinurl, headers=self.headers) | |
resp = self.opener.open(req) | |
page = resp.read() | |
def login(self, username, password): | |
print 'start...' | |
# 这里获取登陆页面 | |
try: | |
req = urllib2.Request(url=self.loginurl, headers=self.headers) | |
resp = self.opener.open(req) | |
except urllib2.URLError, e: | |
print 'You are lost!' | |
return (False, str(e)) | |
page = resp.read() | |
xiamiFormRgx = r"<input(.*)>" | |
xiamiForm = re.findall(xiamiFormRgx, page, re.I) | |
form = self.getInfo(xiamiForm) | |
form["email"] = username | |
form["password"] = password | |
data = urllib.urlencode(form) | |
# 提交登陆信息 | |
try: | |
req = urllib2.Request(url=self.loginurl, headers=self.headers, data=data) | |
resp = self.opener.open(req) | |
except urllib2.URLError, e: | |
print 'You are lost!' | |
print str(e) | |
return (False, str(e)) | |
page = resp.read() | |
message = json.loads(page) | |
print message["message"] | |
status = message["status"] | |
if status is True: | |
# 登录成功 | |
self.signTask(15) | |
else: | |
print "false" | |
def signTask(self, *args): | |
# TypeError: argument after * must be a sequence, not int | |
# 本来需要外面出入字符串:86400,这里做整形变换 | |
# 但是最终选择了使用元组序列 | |
if len(args) > 0: | |
t = Timer(args[0], self.signTask, (args)) | |
t.start() | |
try: | |
# 先请求这个地址,获取t_sign_auth(其实这个值就是你的签到次数) | |
req = urllib2.Request(url='http://www.xiami.com/index/home', headers=self.headers) | |
resp = self.opener.open(req) | |
# 发送签到post | |
req = urllib2.Request(url=self.signtaskurl, headers=self.headers, data=urllib.urlencode({})) | |
resp = self.opener.open(req) | |
except urllib2.URLError, e: | |
if t: t.cancel() | |
print str(e) | |
return(False, str(e)) | |
else: | |
days = resp.read() | |
if days: | |
print 'You have sign: ', days, ' days.' | |
return (True, days) | |
def getInfo(self, xiamiForm): | |
# 从input中将name和value的值提取出来 | |
form = {} | |
for x in xiamiForm: | |
nameRgx = r'(:?.*?)name=\"(.*?)\"' | |
valueRgx = r'(:?.*?)value=\"(.*?)\"' | |
nameGroup = re.match(nameRgx, x, re.I) | |
valueGroup = re.match(valueRgx, x, re.I) | |
if nameGroup and valueGroup: | |
name = nameGroup.groups()[1] | |
value = valueGroup.groups()[1] | |
form[name] = value | |
return form | |
def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): | |
try: | |
pid = os.fork() | |
if pid > 0: | |
sys.exit(0) | |
except OSError, e: | |
sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errorno, e.strerror)) | |
sys.exit(1) | |
os.chdir('/') | |
os.umask(0) | |
os.setsid() | |
try: | |
pid = os.fork() | |
if pid > 0: | |
sys.exit(0) | |
except OSError, e: | |
sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errorno, e.strerror)) | |
sys.exit(1) | |
for f in sys.stdout, sys.stderr: | |
f.flush() | |
si = file(stdin, 'r') | |
so = file(stdout, 'a+') | |
se = file(stderr, 'a+', 0) | |
os.dup2(si.fileno(), sys.stdin.fileno()) | |
os.dup2(so.fileno(), sys.stdout.fileno()) | |
os.dup2(se.fileno(), sys.stderr.fileno()) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment