Python+Launchctl 实现应用自动签到

学长们开发了一款校园app,上面有个起床签到功能,而且重要的是还有排名功能……于是我就产生了写个自动签到脚本这个邪恶的念头……

大致的实现流程也比较简单,就是首先抓包找到发送到服务器的url和对应内容,然后利用python模拟登陆和post来实现签到脚本,最后利用mac自带的launchctl设置成定时任务,这样就好啦~

1、抓包

抓包工具我使用的是Charles,具体配置过程如下。

  • 在Proxy Setting里打开HTTP Proxy选项,端口默认8888,下面的勾选框勾上即可。
  • 在设置->网络里查看电脑端的IP地址。
  • 打开手机,和电脑端连接同一wifi,并长按修改,在高级选项设置里HTTP代理为手动,填上刚才电脑端获取的IP地址和端口。

配置好之后可以随便点开几个应用,看Charles的Structure栏中有没有多出一些文件夹,如果有的话就证明配置成功了。

这时候我们打开要操作的app,就可以在Structure中查看对应的数据了。

2、签到脚本编写

因为需要用python的requests库来模拟登陆,所以我们首先需要在刚才抓到的数据包中找到有关账号的包(就是account啦),在Reuquest中找到我们需要用的身份信息,填入headers。然后再点几下签到按钮,也是顺利的抓到了发送的url和data。


然后post就可以了~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# coding=utf-8
import requests
url="http://api.xxxxx.com/api/rise_rank/"
headers = {
"AUTHORIZATION": "TOKEN 98e6d5277ed0e8769697ebd56f0fxxxxxxxxxxxx",
"Host": "api.xxxxx.com",
"Connection": "Keep-Alive",
"Accept-Encoding": "gzip",
"User-Agent": "okhttp/3. 2.0"
}
def sign():
ret = requests.post(url, data = {"rise_rank":"1"}, headers = headers)
ret.encoding = 'UTF-8'
print ret.text
sign()

3、利用launchctl实现定时执行

Launchctl其实就是写一个plist的文件,它的作用和Linux里的Crontab的作用差不多。

首先我们写一个bash命令,命名为1.sh,内容很简单,就是执行我们写的这个脚本。

1
python /Users/user/Desktop/Python_File/1.py

然后我们就可以写plist文件了,内容大概如下,用来定时运行bash命令。把它放到~/Library/LaunchAgents,然后用launchctl load com.my.test.plist命令加载它就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.my.test.plist</string>
<key>ProgramArguments</key>
<array>
<string>/Users/user/Desktop/Python_File/1.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>0</integer>
<key>Hour</key>
<integer>4</integer>
</dict>
</dict>
</plist>

其中,Label就是给任务命名,一般取plist的文件名就好。ProgramArguments里string填写的就是我们要执行的脚本路径,StartCalendarInterval里边的参数是说每一天的4点整时执行任务。

与launchctl有关的命令还有如下几条,作用分别是列出当前任务清单,加载和取消加载任务,start可以立即运行任务,可以用来测试能否正常执行,而stop可以停止该任务。值得一提的是每次修改plist的内容之后都需要unload之后再重新load一次。

1
2
3
4
5
launchctl list
launchctl load com.my.test.plist
launchctl unload com.my.test.plist
launchctl start com.my.test.plist
launchctl stop com.my.test.plist

嗯,大概就是这样了~



文章目录
  1. 1. 1、抓包
  2. 2. 2、签到脚本编写
  3. 3. 3、利用launchctl实现定时执行