Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019-08-05 10:29
821 查看
考虑到女友的安全问题,就做了一个app实现定位和服务器实现转发的东西。刚学python,竟没想到用对象编程会更加方便,全程过程式开发,代码有点臃肿,就当学习下python吧.
效果就是:在微信公众号中输入指定字符比如:”我要知道你的位置”,手机那端的位置就弹出来了.主要是讲一下思路:先是app实现定位,当微信发送消息时,消息从微信服务器转发到开发者服务器然后用socket发送指定消息来通知app,I need your location,app接收到消息之后再发送给开发服务器(app 开service实现后台全程运行),由于定位信息是经纬度,所以用了高德API,但是发现谷歌地球的定位是准的,可能和android内置的定位有关系吧,然后就转换了一下不同地图的经纬度,然后转成位置信息发送给微信服务器.
import socket import threading import os import requests from flask import Flask from flask import request from bs4 import BeautifulSoup import json global sock #实现通过微信控制手机app定位发送给服务器显示位置信息 loca = "welcome" app = Flask(__name__) #搭建web服务器通过socket发送消息给app索取定位信息,然后转发给微信服务器 @app.route("/wx_check",methods=["POST","GET"]) #这里用了一个Web框架 "/wx_check" 是你在微信中填的开发者服务器路径 def application(): openID = request.args['openid'] # 微信发的,详见开发者文档 soup = BeautifulSoup(request.data,"html.parser") content = soup.find("content") # content 是微信用户发的消息,可用来验证用户 sock.send(b"getlocation") # 发送信息通知android global loca while True: #手动阻塞 if loca != "welcome": break back = loca loca = "welcome" return """ <xml> <ToUserName>%s</ToUserName> <FromUserName>qqmsssssssss</FromUserName> <CreateTime>12345678</CreateTime> <MsgType>text</MsgType> <Content>%s</Content> </xml>"""%(openID,back) def start(): app.run('0.0.0.0',80) threading.Thread(target=start,args=()).start() # 与app进行socket连接 接受定位信息 另外用到经纬度兼容转换API 和经纬度转位置API def tcplink(sock,addr): try: print('Accept new connection from %s:%s...' % addr) while True: sock.setblocking(True) data = sock.recv(1024) location = data.decode('utf-8') print("client:"+location) # 以下进行经纬度 地图信息的转换 loca为app所在地址接上面的 堵塞 if location != "": global loca 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("socket is close,waiting new accept") sock.close() break except Exception as e: location = "raise error" finally: pass try: s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind(('0.0.0.0',9999)) s.listen(10) print('waiting to connect') while True: sock,addr = s.accept() #等待app来连接 t = threading.Thread(target=tcplink,args=(sock,addr)) t.start() finally: print("ending") 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 以下是android端代码: # 获取定位,其实就是获取经纬度 private Location getLastKnownLocation() { LocationManager mLocationManager = (LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE); List<String> providers = mLocationManager.getProviders(true); Location bestLocation = null; for (String provider : providers) { Location l = mLocationManager.getLastKnownLocation(provider); if (l == null) { continue; } if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) { // Found best last known location: %s", l); bestLocation = l; } } return bestLocation; } String provider; public void GetLocation(){ LocationManager mLocationManager; Location location = getLastKnownLocation(); // Log.d("TAG", provider.toString()); Log.d("TAG", location.toString()); if (location != null) { //获取当前位置,这里只用到了经纬度 String string =location.getLongitude() + ","+ location.getLatitude(); try { OutputStream outputStream = socket.getOutputStream(); PrintWriter writer = new PrintWriter(outputStream); writer.write(string); writer.flush(); // writer.close(); // socket.shutdownOutput(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @SuppressLint("ShowToast") public void Connect(){ try { socket = new Socket(); socket.connect(new InetSocketAddress("xxx.xxx.xxx.xxx",9999)); while (true) { Log.d("TAG", socket.isConnected()+""); InputStream stream = socket.getInputStream(); byte[] b = new byte[11]; stream.read(b); String sb = new String(b); if(sb.equalsIgnoreCase("getlocation")){ GetLocation(); }else { OutputStream outoStream = socket.getOutputStream(); outoStream.write("error code".getBytes()); socket.shutdownOutput(); } } } catch (IOException e) { // TODO Auto-generated catch block Log.d("TAG", "error"); e.printStackTrace(); } }
总结
以上所述是小编给大家介绍的Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
您可能感兴趣的文章:
相关文章推荐
- python简单实现服务器信息自动邮件发送
- 一个嵌入式web服务器项目,实现通过手机Android App实现对嵌入式设备的控制
- 【微信开发】-发送位置通过Timezone API查询时间偏移信息,主要代码在private function receiveLocation($object)
- JAVA实现多用户接收服务器发送相同信息并显示各自屏幕上
- Python实现的查询mysql数据库并通过邮件发送信息功能
- 微信通过openID发送消息/后台post、get提交并接收数据 C# .NET 配置404,500等错误信息 连接字符串
- Python 通过微信发送邮件实现电脑关机
- Python+Django开发微信公众号验证通过但微信推送信息接收不到的问题解答
- 通过Socket实现简单web服务器功能(接收页面请求信息)不使用Tomcat!
- 通过python的paramiko抓取多台服务器信息,并通过html格式发送邮件到群组
- 通过python下的socket实现组播数据的发送和接收
- Android笔记之高德地图定位(通过开启服务发送广播用handle消息机制更新位置信息)
- python通过微信发送邮件实现电脑关机
- 使用js函数实现的通过输入框中数据的长度来控制光标聚焦位置
- python通过get,post方式发送http请求和接收http响应的方法
- 局域网聊天工具(多线程),支持客户端与客户端间通信,服务器负责信息的接收与发送
- iptables实战系列:通过NAT转发实现私网对外发布信息
- python在windows下实现ping操作并接收返回信息的方法
- 通过python模块实现服务器和本地机器之间快速拷贝文件
- 通过NAT转发实现私网对外发布信息