Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
作者:wzjssssssssss 发布时间:2023-02-15 16:49:10
标签:python,微信,定位
考虑到女友的安全问题,就做了一个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定位发送到个人服务器再转发微信服务器接收位置信息 ,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://blog.csdn.net/wzjssssssssss/article/details/79867072
0
投稿
猜你喜欢
- 本文实例讲述了php7 图形用户界面GUI 开发。分享给大家供大家参考,具体如下:一、下载指定系统扩展http://pecl.php.net
- 在my.cnf中设置了sql_mode='STRICT_TRANS_TABLES';却发现还是有非法数据的写入,比如无符号整
- 笔者最近在学习用OpenCV做人脸识别,用的是python语言,Anaconda里面自带的Spyder编辑器,但是按照人脸识别的教程安装好O
- SVM支持向量机是建立于统计学习理论上的一种分类算法,适合与处理具备高维特征的数据集。SVM算法的数学原理相对比较复杂,好在由于SVM算法的
- 喜欢Gucci的优雅吗?或者痴迷美国普普艺术?谷歌中国最近改版的谷歌个性化首页iGoogle集中了近1500个主题,包括近120多位全球顶级
- 具体代码如下所述:__author__ = 'Yue Qingxuan'# -*- coding: utf-8 -*-#求质
- 为了方便使用分类,我定义了一个分类表category,里面字段是id(自动编号) cat_name(分类名) pare
- python中的集合什么是集合?集合是一个无序的不重复元素序列常用来对两个列表进行交并差的处理集合与列表一样,支持所有数据类型集合与列表的区
- 在对于python中类的使用上,我们分出了子类和父类两种。对于这二者之间的关系,我们可以简单理解为继承。不过python中加入了实例的讨论,
- 一. 认证系统概要create_user 创建用户authenticate 验证登录login 记住用户的登录状态logout 退出登录is
- 本文实例为大家分享了Go实现文件上传和下载的具体代码,供大家参考,具体内容如下一.文件上传文件上传:客户端把上传文件转换为二进制流后发送给服
- 1 将文件保存到服务器本地upload.html<!DOCTYPE html><html lang="en&qu
- 前言当今,随着计算机技术的发展,摄像头已经成为了人们生活中不可或缺的一部分。而Python作为一种流行的编程语言,也可以轻松地控制和操作摄像
- 本文大纲os模块是Python标准库中一个重要的模块,里面提供了对目录和文件的一般常用操作。而Python另外一个标准库——shutil库,
- 概况在开发过程中,我们一般直接用Python命令直接运行Flask程序。这样的运行只适合我们开发,方便我们调试。一旦程序部署到线上,这样运行
- Numpy中repeat函数使用Numpy是Python强大的数学计算库,和Scipy一起构建起Python科学计算生态。在本节下面我们重点
- 本文实例讲述了Python 面向对象部分知识点。分享给大家供大家参考,具体如下:面向对象:世间万物,皆可分类。---------------
- 本文实例讲述了Python回调函数用法。分享给大家供大家参考。具体分析如下:一、百度百科上对回调函数的解释:回调函数就是一个通过函数指针调用
- 我想把本篇作为css基础教程的序曲,从今天开始翻译和整理我从设计网页以来所学到的css基础知识。本教程会分成N个部分,单独发表,其间可能会插
- Python是一种高级编程语言,它在众多编程语言中,拥有极高的人气和使用率。Python中的多进程和进程池是其强大的功能之一,可以让我们更加