python解决GPS打卡问题
目前很多所谓的互联网公司都要搞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调用的并不能打卡成功,而直接执行的是可以成功的。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/python-gps-sign/5112.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.