https://zhiyou.smzdm.com/user/login/ajax_check
[email protected]
password=12345678
rememberme=0
captcha
redirect_to
geetest_challenge
geetest_validate
geetest_seccode
Host: zhiyou.smzdm.com
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?redirect_to=http%3A%2F%2Fzhiyou.smzdm.com%2Fuser
Content-Length: 180
Cookie: ......
Connection: keep-alive
{
"error_code": 111103,
"error_msg": "您输入的账号/密码无效,请重新输入",
"is_use_captcha": false,
"data": [],
"redirect_to": ""
}
{
"error_code": 0,
"error_msg": "",
"is_use_captcha": false,
"data": [],
"redirect_to": ""
}
http://zhiyou.smzdm.com/user/checkin/jsonp_checkin?callback=jQuery11240777783693305457_1475200491609&_=1475200491611
callback=jQuery11240777783693305457_1475200491609
_=1475200491611
GET /user/checkin/jsonp_checkin?callback=jQuery11240777783693305457_1475200491609&_=1475200491611 HTTP/1.1
Host: zhiyou.smzdm.com
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
Referer: http://www.smzdm.com/
Cookie: smzdm_user_source=55351E1AC6C411DEFB0F328D8DCC0AB5; Hm_lvt_9b7ac3d38f30fe89ff0b8a0546904e58=1473209903,1475197790; _ga=GA1.2.855959196.1465873532; wt3_eid=%3B999768690672041%7C2146650085300290438%232147211752000617486; __jsluid=a37d58f891e4d02884c55310302b2689; web_ab=A1; Hm_lpvt_9b7ac3d38f30fe89ff0b8a0546904e58=1475200492; PHPSESSID=446i1m1dti40jcr3lvda9h27l4; smzdm_wordpress_360d4e510beef4fe51293184b8908074=user%3A3741863905%7C1479088482%7C7f425fce8d667e5e4e0927cd18595aec; smzdm_wordpress_logged_in_360d4e510beef4fe51293184b8908074=user%3A3741863905%7C1479088482%7C909993082d4a67b83c09b6461fdfdc09; user-role-smzdm=subscriber; sess=NTRlODl8MTQ3OTA4ODQ4MnwzNzQxODYzOTA1fGU0YWNlMTcwMjAxMWFmMDdmYjE3YTdkYzlhZWNhZDUx; user=user%3A3741863905%7C3741863905; smzdm_user_view=232BEEC3D78379046A383CF25F349B03
Connection: keep-alive
jQuery11240777783693305457_1475200491609({"error_code":0,"error_msg":"","data":{"add_point":10,"checkin_num":1,"point":30,"exp":30,"gold":0,"prestige":"0","rank":0,"slogan":"\u4eca\u65e5\u5df2\u988610<\/span>\u79ef\u5206\uff0c\u518d\u7b7e\u52302<\/span>\u5929\u53ef\u988612<\/span>\u79ef\u5206<\/div>"}})
其中的 json 如下
{
"error_code": 0,
"error_msg": "",
"data": {
"add_point": 10,
"checkin_num": 1,
"point": 30,
"exp": 30,
"gold": 0,
"prestige": "0",
"rank": 0,
"slogan": "今日已领10积分,再签到2天可领12积分"
}
}
使用到的重要模块
time
- epoch 在unix上,epoch 就是 1970-01-01 00:00:00.000
time.time() 返回从 epoch 到现在的秒数
- time.monotonic() 这个是系统启动后到现在为止流逝的时间,以秒为单位的小数。该值无法干预,而 time.time() 则可以通过修改系统时间来干预
- time.sleep(secs) 将当前线程挂起 secs 秒
- time.struct_time 这是一个表示时间的类,其属性既可以用索引来访问,又可以用属性名来访问,即 命名元组
- time.strftime(format[, t]) 将时间格式化,参数 t 必须是个 time.struct_time 类或者元组,示例
time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
'2016-09-29 10:21:01'
APScheduler
4 个概念
- triggers 触发器,包含了调度逻辑,每个作业都有其触发器,以判断作业何时执行
- job stores 作业仓库,安置了被调度的作业,默认的作业仓库在内存里保存作业,其他仓库也可在数据库里保存作业
- executors 执行器,运行作业
- schedulers 调度器,一般情况下,一个应用程序只需要一个调度器
选择调度器
- BlockingScheduler 如果调度器是你的程序里唯一运行的那个冬冬
- BackgroundScheduler 如果你没有用任何的框架,而且想要调度器在后台运行
- AsyncIOScheduler 如果你的程序使用了 asyncio 模块
- GeventScheduler 如果你的程序使用了 gevent
- TornadoScheduler 如果你在创建 Tornado 应用
- TwistedScheduler 如果你在创建 Twisted 应用
- QtScheduler 如果你在创建 Qt 应用
配置调度器
示例,BackgroundScheduler,默认的作业仓库和执行器
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
# Initialize the rest of the application here, or before the scheduler initialization
上面的代码返回了一个 BackgroundScheduler,使用名为 default 的内存作业仓库,一个 名为 default 的 ThreadPoolExecutor,最大线程数为 10
假设上面的调度器不能满足你,你想要 2 个作业仓库,使用 2 个执行器,还想要调整新作业的默认值,设置不同的时区,正如下面的例子,你将得到
- MongoDBJobStore,名为 mongo
- SQLAlchemyJobStore,名为 default,使用 SQLite
- ThreadPoolExecutor,名为 “default”, 工作线程数为 20
- ProcessPoolExecutor,名为 “processpool”, 工作线程数为 5
- 时区为 UTC
- 新的作业,coalescing 默认为 off
- 最多 3 个新作业实例
结尾
以上已经分析了什么值得买的自动签到原理,那么接下来编写代码就很简单了。其实大体可以分为俩部分,一部分是调度的代码,也就是每天运行一次。另外一部分是登录后自动签到的代码。详细的如下。
python自动签到