Skip to content

Instantly share code, notes, and snippets.

@creamidea
Created May 26, 2014 04:26
Show Gist options
  • Save creamidea/e7c782c7bccf2cf85874 to your computer and use it in GitHub Desktop.
Save creamidea/e7c782c7bccf2cf85874 to your computer and use it in GitHub Desktop.
虾米签到
# -*- 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=&notLoadSsoView=&notKeepLogin=&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=&notLoadSsoView=true&notKeepLogin=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