Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
考虑到女友的安全问题,就做了一个app实现定位和服务器实现转发的东西。刚学python,竟没想到用对象编程会更加方便,全程过程式开发,代码有点臃肿,就当学习下python吧.
效果就是:在微信公众号中输入指定字符比如:”我要知道你的位置”,手机那端的位置就弹出来了.主要是讲一下思路:先是app实现定位,当微信发送消息时,消息从微信服务器转发到开发者服务器然后用socket发送指定消息来通知app,Ineedyourlocation,app接收到消息之后再发送给开发服务器(app开service实现后台全程运行),由于定位信息是经纬度,所以用了高德API,但是发现谷歌地球的定位是准的,可能和android内置的定位有关系吧,然后就转换了一下不同地图的经纬度,然后转成位置信息发送给微信服务器.
importsocket
importthreading
importos
importrequests
fromflaskimportFlask
fromflaskimportrequest
frombs4importBeautifulSoup
importjson
globalsock
#实现通过微信控制手机app定位发送给服务器显示位置信息
loca="welcome"
app=Flask(__name__)
#搭建web服务器通过socket发送消息给app索取定位信息,然后转发给微信服务器
@app.route("/wx_check",methods=["POST","GET"])#这里用了一个Web框架"/wx_check"是你在微信中填的开发者服务器路径
defapplication():
openID=request.args['openid']#微信发的,详见开发者文档
soup=BeautifulSoup(request.data,"html.parser")
content=soup.find("content")#content是微信用户发的消息,可用来验证用户
sock.send(b"getlocation")#发送信息通知android
globalloca
whileTrue:#手动阻塞
ifloca!="welcome":
break
back=loca
loca="welcome"
return"""
%s
qqmsssssssss
12345678
text
%s
"""%(openID,back)
defstart():
app.run('0.0.0.0',80)
threading.Thread(target=start,args=()).start()
#与app进行socket连接接受定位信息另外用到经纬度兼容转换API和经纬度转位置API
deftcplink(sock,addr):
try:
print('Acceptnewconnectionfrom%s:%s...'%addr)
whileTrue:
sock.setblocking(True)
data=sock.recv(1024)
location=data.decode('utf-8')
print("client:"+location)
#以下进行经纬度地图信息的转换loca为app所在地址接上面的堵塞
iflocation!="":
globalloca
print(location)
lis=location.split(",")
location="%s,%s"%(lis[1],lis[0])
print(location)
xml=requests.get("http://api.gpsspg.com/convert/coord/?oid=xxxx&key=xxxxxxxxxxxxxxxxxx&from=0&to=3&latlng=%s&output=xml"%location)
soup=BeautifulSoup(xml.text,"html.parser")
print(soup.text)
lat=soup.find("lat").string
lng=soup.find("lng").string
location="%s,%s"%(lng,lat)
print("after"+location)
a=requests.get("http://restapi.amap.com/v3/geocode/regeo?key=xxxxxxxxxxxxxxxxx&location="+location)
loca=a.text
obj=json.loads(loca)
loca=obj["regeocode"]["formatted_address"]
else:
print("socketisclose,waitingnewaccept")
sock.close()
break
exceptExceptionase:
location="raiseerror"
finally:
pass
try:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('0.0.0.0',9999))
s.listen(10)
print('waitingtoconnect')
whileTrue:
sock,addr=s.accept()#等待app来连接
t=threading.Thread(target=tcplink,args=(sock,addr))
t.start()
finally:
print("ending")
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
以下是android端代码:
#获取定位,其实就是获取经纬度
privateLocationgetLastKnownLocation(){
LocationManagermLocationManager=(LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE);
Listproviders=mLocationManager.getProviders(true);
LocationbestLocation=null;
for(Stringprovider:providers){
Locationl=mLocationManager.getLastKnownLocation(provider);
if(l==null){
continue;
}
if(bestLocation==null||l.getAccuracy()
总结
以上所述是小编给大家介绍的Python通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!