Python实战一:什么值得买自动签到

登录

登录地址

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
  • callback 的格式应该是 jQueryKaTeX parse error: Expected group after '_' at position 10: {20位神秘数字}_̲{时间戳},现在问题是神秘数字是啥?没有什么线索,姑且认为是个 20 位的随机数吧
  • _ 时间戳,并且比 callback 里的时间要晚 2 毫秒

请求头

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自动签到

你可能感兴趣的:(python,学习,开发语言)