目前很多所谓的互联网公司都要搞GPS定位考勤打卡,目前所在的客户单位也要求所有厂家人员进行GPS软件打卡。除了公司的指纹打卡外,还要再打客户的卡。既然是地理定位,在android平台下之前测试过通过使用Fake GPS软件 ,开启开发者模式,允许模拟地理位置是可以实现地点任意的。不过目前用的iphone手机,又不想越狱掉,就想通过抓包,利用python向服务器定点发送伪造包的方式解决。原理和之前写的手机APP自动签到—python实现一样。

这个不同与这之前写的是,这里使用的是POST方法,相对get方法要安全一些,不过区别也并不是特别大,代码如下(由于不便于泄露一些信息,这里将重要信息隐去或修改了):

 1#!/usr/bin/env python
 2#coding=utf-8
 3import sys
 4reload(sys)
 5sys.setdefaultencoding('utf-8')
 6import string
 7import pycurl
 8import StringIO
 9import json
10def initCurl():
11        c = pycurl.Curl()
12        c.setopt(pycurl.COOKIEFILE, "cookie_file_name")#把cookie保存在该文件中
13        c.setopt(pycurl.COOKIEJAR, "cookie_file_name")
14        c.setopt(pycurl.FOLLOWLOCATION, 1) #允许跟踪来源
15        c.setopt(pycurl.MAXREDIRS, 5)
16        c.setopt(pycurl.CONNECTTIMEOUT, 20)
17        return c
18def PostData(curl, url, data):
19        head = ['Accept:*/*',
20                'Content-Type:application/json;charset=utf-8',
21                'render:json',
22                'clientType:json',
23                'Connection:close',
24                'Proxy-Connection:close',
25                'User-Agent:xx考勤 4.2.30 rv:102030 (iPhone; iPhone OS 8.4; zh_CN)',
26                'Accept-Encoding:gzip, deflate',
27                'Authorization: 9fa1e7e454b486b9842b1aaf9b5559e3']
28        buf = StringIO.StringIO()
29        curl.setopt(pycurl.WRITEFUNCTION, buf.write)
30        curl.setopt(pycurl.POSTFIELDS, data)
31        curl.setopt(pycurl.URL, url)
32        curl.setopt(pycurl.HTTPHEADER, head)
33        curl.perform()
34        the_page = buf.getvalue()
35        #print the_page
36        buf.close()
37        return the_page
38def PostGPS(curl, url, data):
39        head = ['Accept:*/*',
40                'Content-Type:application/x-www-form-urlencoded',
41                'Connection:keep-alive',
42                'Proxy-Connection:keep-alive',
43                'User-Agent: %E6%97%BA%E8%B4%A2%E8%80%83%E5%8B%A4/102030 CFNetwork/711.4.6 Darwin/14.0.0',
44                'Accept-Encoding:gzip, deflate',
45                'Accept-Language: zh-cn',]
46        buf = StringIO.StringIO()
47        curl.setopt(pycurl.WRITEFUNCTION, buf.write)
48        curl.setopt(pycurl.POSTFIELDS, data)
49        curl.setopt(pycurl.URL, url)
50        curl.setopt(pycurl.HTTPHEADER, head)
51        curl.perform()
52        the_page = buf.getvalue()
53        #print the_page
54        buf.close()
55        return the_page
56curl = initCurl()
57#地理位置数据,在分析安卓版时发现直接调用的高德地图,iphone版发现是通过第三方mob.com的api调用的
58GPSdata = 'm=aB0muOxxsXgo20qSkp99jkbLias%2F8BZxj0yOoWccGlqRvWq%2FJMj1QwQKQeHRVJMtOjqFCzTdafiGQdIla75aubgWY1e9LJfn9KnYSA5WnyKriQBkExDuu9mjAtYbeTSDqewpSrLyNO%2Fsu%2FsacPJPraD6xoqIv%2BohXiF8lzcVsBXYXGtgTXJXv5FtSoNhLnPCRlGsf3vnmNoAXR4%2BtEroC6O5o%2BcZXq%2FIRAOedRnV%2F1zP0uqZ6wYF8XvTKsos91zLEf7esG8evqwW5KiRCOaYwg%3D%3D'
59GPSurl = 'http://api.share.mob.com:80/data2'
60GPSresult = PostGPS(curl, GPSurl, GPSdata)
61print GPSresult
62#该json数据里会检验token值是否发生变化,发生变化时也是无法正常打卡的,会提示手机与绑定时发生变化,需要管理员重新审核。这点做的相对还是相对牛逼的,变相的限制了通过一部手机打多人卡的问题。
63jsondata = '{"id":"xxxxx","list":[{"name":"xxx路(xxx号)","aId":"1293"}],"type":"1","token":"880B2373-2272-46A7-3588-2B6E580268D2"}'
64kqurl = 'http://api.iquanqin.com/kaoqin1/104001/phone/gps/clock'
65result = PostData(curl, kqurl, jsondata)
66print result

暂时还遗留两个问题需要后续解决:

1、是否会有安全码过期的问题,比如之前在做APP自动签到时也遇到过。由于不知道别人用的算法,算不出安全码,这就导致可能安全码在服务器端设置了10天有效,10天后需要重新抓包获取的问题;

2、crontab中配置好该任务调用后,发现/var/log/cron 日志中可以发现有执行的记录,但发现crontab调用的并不能打卡成功,而直接执行的是可以成功的。