您好,登錄后才能下訂單哦!
這篇文章主要介紹Python如何通過微信控制實現(xiàn)app定位發(fā)送到個人服務(wù)器再轉(zhuǎn)發(fā)微信服務(wù)器接收位置信息,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
效果就是:在微信公眾號中輸入指定字符比如:”我要知道你的位置”,手機(jī)那端的位置就彈出來了.主要是講一下思路:先是app實現(xiàn)定位,當(dāng)微信發(fā)送消息時,消息從微信服務(wù)器轉(zhuǎn)發(fā)到開發(fā)者服務(wù)器然后用socket發(fā)送指定消息來通知app,I need your location,app接收到消息之后再發(fā)送給開發(fā)服務(wù)器(app 開service實現(xiàn)后臺全程運(yùn)行),由于定位信息是經(jīng)緯度,所以用了高德API,但是發(fā)現(xiàn)谷歌地球的定位是準(zhǔn)的,可能和android內(nèi)置的定位有關(guān)系吧,然后就轉(zhuǎn)換了一下不同地圖的經(jīng)緯度,然后轉(zhuǎn)成位置信息發(fā)送給微信服務(wù)器.
import socket import threading import os import requests from flask import Flask from flask import request from bs4 import BeautifulSoup import json global sock #實現(xiàn)通過微信控制手機(jī)app定位發(fā)送給服務(wù)器顯示位置信息 loca = "welcome" app = Flask(__name__) #搭建web服務(wù)器通過socket發(fā)送消息給app索取定位信息,然后轉(zhuǎn)發(fā)給微信服務(wù)器 @app.route("/wx_check",methods=["POST","GET"]) #這里用了一個Web框架 "/wx_check" 是你在微信中填的開發(fā)者服務(wù)器路徑 def application(): openID = request.args['openid'] # 微信發(fā)的,詳見開發(fā)者文檔 soup = BeautifulSoup(request.data,"html.parser") content = soup.find("content") # content 是微信用戶發(fā)的消息,可用來驗證用戶 sock.send(b"getlocation") # 發(fā)送信息通知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進(jìn)行socket連接 接受定位信息 另外用到經(jīng)緯度兼容轉(zhuǎn)換API 和經(jīng)緯度轉(zhuǎn)位置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) # 以下進(jìn)行經(jīng)緯度 地圖信息的轉(zhuǎn)換 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端代碼: # 獲取定位,其實就是獲取經(jīng)緯度 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) { //獲取當(dāng)前位置,這里只用到了經(jīng)緯度 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如何通過微信控制實現(xiàn)app定位發(fā)送到個人服務(wù)器再轉(zhuǎn)發(fā)微信服務(wù)器接收位置信息”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!