代码
sche.py
from apscheduler.schedulers.blocking import BlockingScheduler
from robot import SmzdmRobot
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s [%(filename)s] [%(levelname)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename='sche.log',
filemode='a')
scheduler = BlockingScheduler()
@scheduler.scheduled_job('cron', day='*', hour='0', minute='30', second='0')
def smzdm_sign():
logging.info('smzdm sign...')
smzdm = SmzdmRobot('[email protected]', '******')
smzdm.sign()
if __name__ == '__main__':
logging.info('scheduler start...')
scheduler.start()
robot.py
"""
签到机器人
"""
import gzip
import http.cookiejar
import logging
import json
import random
import time
import urllib.parse
import urllib.request
def enable_cookie():
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar()))
urllib.request.install_opener(opener)
class SmzdmRobot(object):
magic_num_min = 10000000000000000000 + 1
magic_num_max = 20000000000000000000 - 1
username = ''
password = ''
def __init__(self, username, password):
self.username = username
self.password = password
def login(self):
login_url = 'https://zhiyou.smzdm.com/user/login/ajax_check'
data = {
'username': self.username,
'password': self.password,
'rememberme': 0,
'captcha': '',
'redirect_to': '',
'geetest_challenge': '',
'geetest_validate': '',
'geetest_seccode': ''
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Referer': 'https://zhiyou.smzdm.com/user/login',
}
req = urllib.request.Request(login_url, data=urllib.parse.urlencode(data).encode('ascii'),
headers=headers, method='POST')
with urllib.request.urlopen(req) as rsp:
html = rsp.read()
try:
json_str = html.decode('utf8')
except UnicodeDecodeError:
json_str = gzip.decompress(html).decode("utf8")
logging.info(json_str)
json_obj = json.loads(json_str, 'utf8')
return json_obj['error_code'] == 0
def checkin(self):
t = str(int(time.time() * 1000))
m = random.randint(self.magic_num_min, self.magic_num_max)
callback = 'jQuery' + str(m) + '_' + t
sign_url = 'http://zhiyou.smzdm.com/user/checkin/jsonp_checkin'
data = {
'callback': callback,
'_': t
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0',
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate, br',
'Referer': 'https://www.smzdm.com/',
}
req = urllib.request.Request(url=sign_url + '?' + urllib.parse.urlencode(data), headers=headers, method='GET')
with urllib.request.urlopen(req) as rsp:
html = rsp.read()
try:
json_str = html.decode('utf8')
except UnicodeDecodeError:
json_str = gzip.decompress(html).decode('raw_unicode_escape')
offset = len(callback) + 1
json_str = json_str[offset:-1]
logging.info(json_str)
json_obj = json.loads(json_str, 'raw_unicode_escape')
return json_obj['error_code'] == 0
def sign(self):
enable_cookie()
if self.login():
if self.checkin():
logging.info('smzdm sign success')
else:
logging.info('smzdm sign fail')
else:
logging.info('smzdm login fail')