考慮到女友的安全問題,就做了一個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 """
%s
qqmsssssssss
12345678
text
%s
"""%(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
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定位發送到個人服務器再轉發微信服務器接收位置信息 ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

