目前很多所谓的互联网公司都要搞GPS定位考勤打卡,目前所在的客户单位也要求所有厂家人员进行GPS软件打卡。除了公司的指纹打卡外,还要再打客户的卡。既然是地理定位,在android平台下之前测试过通过使用Fake GPS软件 ,开启开发者模式,允许模拟地理位置是可以实现地点任意的。不过目前用的iphone手机,又不想越狱掉,就想通过抓包,利用python向服务器定点发送伪造包的方式解决。原理和之前写的手机APP自动签到—python实现一样。
这个不同与这之前写的是,这里使用的是POST方法,相对get方法要安全一些,不过区别也并不是特别大,代码如下(由于不便于泄露一些信息,这里将重要信息隐去或修改了):
#!/usr/bin/env python
#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import string
import pycurl
import StringIO
import json
def initCurl():
c = pycurl.Curl()
c.setopt(pycurl.COOKIEFILE, "cookie_file_name")#把cookie保存在该文件中
c.setopt(pycurl.COOKIEJAR, "cookie_file_name")
c.setopt(pycurl.FOLLOWLOCATION, 1) #允许跟踪来源
c.setopt(pycurl.MAXREDIRS, 5)
c.setopt(pycurl.CONNECTTIMEOUT, 20)
return c
def PostData(curl, url, data):
head = ['Accept:*/*',
'Content-Type:application/json;charset=utf-8',
'render:json',
'clientType:json',
'Connection:close',
'Proxy-Connection:close',
'User-Agent:xx考勤 4.2.30 rv:102030 (iPhone; iPhone OS 8.4; zh_CN)',
'DontTrackMeHere:gzip, deflate',
'Authorization: 9fa1e7e454b486b9842b1aaf9b5559e3']
buf = StringIO.StringIO()
curl.setopt(pycurl.WRITEFUNCTION, buf.write)
curl.setopt(pycurl.POSTFIELDS, data)
curl.setopt(pycurl.URL, url)
curl.setopt(pycurl.HTTPHEADER, head)
curl.perform()
the_page = buf.getvalue()
#print the_page
buf.close()
return the_page
def PostGPS(curl, url, data):
head = ['Accept:*/*',
'Content-Type:application/x-www-form-urlencoded',
'Connection:keep-alive',
'Proxy-Connection:keep-alive',
'User-Agent: %E6%97%BA%E8%B4%A2%E8%80%83%E5%8B%A4/102030 CFNetwork/711.4.6 Darwin/14.0.0',
'DontTrackMeHere:gzip, deflate',
'Accept-Language: zh-cn',]
buf = StringIO.StringIO()
curl.setopt(pycurl.WRITEFUNCTION, buf.write)
curl.setopt(pycurl.POSTFIELDS, data)
curl.setopt(pycurl.URL, url)
curl.setopt(pycurl.HTTPHEADER, head)
curl.perform()
the_page = buf.getvalue()
#print the_page
buf.close()
return the_page
curl = initCurl()
#地理位置数据,在分析安卓版时发现直接调用的高德地图,iphone版发现是通过第三方mob.com的api调用的
GPSdata = 'm=aB0muOxxsXgo20qSkp99jkbLias%2F8BZxj0yOoWccGlqRvWq%2FJMj1QwQKQeHRVJMtOjqFCzTdafiGQdIla75aubgWY1e9LJfn9KnYSA5WnyKriQBkExDuu9mjAtYbeTSDqewpSrLyNO%2Fsu%2FsacPJPraD6xoqIv%2BohXiF8lzcVsBXYXGtgTXJXv5FtSoNhLnPCRlGsf3vnmNoAXR4%2BtEroC6O5o%2BcZXq%2FIRAOedRnV%2F1zP0uqZ6wYF8XvTKsos91zLEf7esG8evqwW5KiRCOaYwg%3D%3D'
GPSurl = 'http://api.share.mob.com:80/data2'
GPSresult = PostGPS(curl, GPSurl, GPSdata)
print GPSresult
#该json数据里会检验token值是否发生变化,发生变化时也是无法正常打卡的,会提示手机与绑定时发生变化,需要管理员重新审核。这点做的相对还是相对牛逼的,变相的限制了通过一部手机打多人卡的问题。
jsondata = '{"id":"xxxxx","list":[{"name":"xxx路(xxx号)","aId":"1293"}],"type":"1","token":"880B2373-2272-46A7-3588-2B6E580268D2"}'
kqurl = 'http://api.iquanqin.com/kaoqin1/104001/phone/gps/clock'
result = PostData(curl, kqurl, jsondata)
print result
暂时还遗留两个问题需要后续解决:
1、是否会有安全码过期的问题,比如之前在做APP自动签到时也遇到过。由于不知道别人用的算法,算不出安全码,这就导致可能安全码在服务器端设置了10天有效,10天后需要重新抓包获取的问题;
2、crontab中配置好该任务调用后,发现/var/log/cron 日志中可以发现有执行的记录,但发现crontab调用的并不能打卡成功,而直接执行的是可以成功的。