Python 通過(guò)微信控制實(shí)現(xiàn)app定位發(fā)送到個(gè)人服務(wù)器再轉(zhuǎn)發(fā)微信服務(wù)器接收位置信息
考慮到女友的安全問(wèn)題,就做了一個(gè)app實(shí)現(xiàn)定位和服務(wù)器實(shí)現(xiàn)轉(zhuǎn)發(fā)的東西。剛學(xué)python,竟沒(méi)想到用對(duì)象編程會(huì)更加方便,全程過(guò)程式開(kāi)發(fā),代碼有點(diǎn)臃腫,就當(dāng)學(xué)習(xí)下python吧.
效果就是:在微信公眾號(hào)中輸入指定字符比如:”我要知道你的位置”,手機(jī)那端的位置就彈出來(lái)了.主要是講一下思路:先是app實(shí)現(xiàn)定位,當(dāng)微信發(fā)送消息時(shí),消息從微信服務(wù)器轉(zhuǎn)發(fā)到開(kāi)發(fā)者服務(wù)器然后用socket發(fā)送指定消息來(lái)通知app,I need your location,app接收到消息之后再發(fā)送給開(kāi)發(fā)服務(wù)器(app 開(kāi)service實(shí)現(xiàn)后臺(tái)全程運(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
#實(shí)現(xiàn)通過(guò)微信控制手機(jī)app定位發(fā)送給服務(wù)器顯示位置信息
loca = "welcome"
app = Flask(__name__)
#搭建web服務(wù)器通過(guò)socket發(fā)送消息給app索取定位信息,然后轉(zhuǎn)發(fā)給微信服務(wù)器
@app.route("/wx_check",methods=["POST","GET"]) #這里用了一個(gè)Web框架 "/wx_check" 是你在微信中填的開(kāi)發(fā)者服務(wù)器路徑
def application():
openID = request.args['openid'] # 微信發(fā)的,詳見(jiàn)開(kāi)發(fā)者文檔
soup = BeautifulSoup(request.data,"html.parser")
content = soup.find("content") # content 是微信用戶發(fā)的消息,可用來(lái)驗(yàn)證用戶
sock.send(b"getlocation") # 發(fā)送信息通知android
global loca
while True: #手動(dòng)阻塞
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來(lái)連接
t = threading.Thread(target=tcplink,args=(sock,addr))
t.start()
finally:
print("ending")
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
以下是android端代碼:
# 獲取定位,其實(shí)就是獲取經(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();
}
}
總結(jié)
以上所述是小編給大家介紹的Python 通過(guò)微信控制實(shí)現(xiàn)app定位發(fā)送到個(gè)人服務(wù)器再轉(zhuǎn)發(fā)微信服務(wù)器接收位置信息 ,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
- python制作定時(shí)發(fā)送信息腳本的實(shí)現(xiàn)思路
- python實(shí)現(xiàn)企業(yè)微信定時(shí)發(fā)送文本消息的示例代碼
- python向企業(yè)微信發(fā)送文字和圖片消息的示例
- python3.8 微信發(fā)送服務(wù)器監(jiān)控報(bào)警消息代碼實(shí)現(xiàn)
- Python3 itchat實(shí)現(xiàn)微信定時(shí)發(fā)送群消息的實(shí)例代碼
- python實(shí)現(xiàn)給微信指定好友定時(shí)發(fā)送消息
- python實(shí)現(xiàn)微信定時(shí)每天和女友發(fā)送消息
- 詳解用python自制微信機(jī)器人,定時(shí)發(fā)送天氣預(yù)報(bào)
- python3操作微信itchat實(shí)現(xiàn)發(fā)送圖片
- python模仿網(wǎng)頁(yè)版微信發(fā)送消息功能
- 用python發(fā)送微信消息
相關(guān)文章
詳解python3 + Scrapy爬蟲(chóng)學(xué)習(xí)之創(chuàng)建項(xiàng)目
這篇文章主要介紹了python3 Scrapy爬蟲(chóng)創(chuàng)建項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
如何用Python?實(shí)現(xiàn)景區(qū)安防系統(tǒng)
本設(shè)計(jì)中,利用YOLO目標(biāo)檢測(cè)算法、Openpose姿態(tài)識(shí)別算法、deepsort跟蹤算法、MSCNN人群密度估計(jì)算法實(shí)現(xiàn)了火災(zāi)監(jiān)測(cè)、吸煙監(jiān)測(cè)、行為安全監(jiān)測(cè)、人群密度監(jiān)測(cè)、口罩率監(jiān)測(cè)、人員定位監(jiān)測(cè)六大功能,對(duì)Python?實(shí)現(xiàn)景區(qū)安防系統(tǒng)感興趣的朋友一起看看吧2022-07-07
Python使用Matplotlib實(shí)現(xiàn)雨點(diǎn)圖動(dòng)畫(huà)效果的方法
這篇文章主要介紹了Python使用Matplotlib實(shí)現(xiàn)雨點(diǎn)圖動(dòng)畫(huà)效果的方法,結(jié)合實(shí)例形式分析了win10安裝ffmpeg及animation函數(shù)的使用相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
Django自定義分頁(yè)與bootstrap分頁(yè)結(jié)合
這篇文章主要為大家詳細(xì)介紹了Django自定義分頁(yè)與bootstrap分頁(yè)結(jié)合使用的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Python實(shí)現(xiàn)把utf-8格式的文件轉(zhuǎn)換成gbk格式的文件
這篇文章主要介紹了Python實(shí)現(xiàn)把utf-8格式的文件轉(zhuǎn)換成gbk格式的文件,本文給出了實(shí)現(xiàn)代碼并同時(shí)剖析了代碼的作用,需要的朋友可以參考下2015-01-01
一文帶你解密Python迭代器的實(shí)現(xiàn)原理
這篇文章主要為大家詳細(xì)介紹了Python中迭代器的實(shí)現(xiàn)原理,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,需要的可以參考一下2022-12-12
Python文本統(tǒng)計(jì)功能之西游記用字統(tǒng)計(jì)操作示例
這篇文章主要介紹了Python文本統(tǒng)計(jì)功能之西游記用字統(tǒng)計(jì)操作,結(jié)合實(shí)例形式分析了Python文本讀取、遍歷、統(tǒng)計(jì)等相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
Python中日期和時(shí)間的用法超強(qiáng)總結(jié)
時(shí)間無(wú)疑是生活各個(gè)方面中最關(guān)鍵的因素之一,因此,記錄和跟蹤時(shí)間變得非常重要。在?Python?中,可以通過(guò)其內(nèi)置庫(kù)跟蹤日期和時(shí)間。今天我們來(lái)介紹關(guān)于?Python?中的日期和時(shí)間,一起來(lái)了解如何使用time和datetime模塊查找和修改日期和時(shí)間2022-10-10

