Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息


Posted in Python onAugust 05, 2019

考虑到女友的安全问题,就做了一个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 相关文章推荐
python发送邮件的实例代码(支持html、图片、附件)
Mar 04 Python
python使用心得之获得github代码库列表
Jun 25 Python
Python中的choice()方法使用详解
May 15 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
利用python如何处理nc数据详解
May 23 Python
Python中staticmethod和classmethod的作用与区别
Oct 11 Python
python使用Plotly绘图工具绘制柱状图
Apr 01 Python
详解使用django-mama-cas快速搭建CAS服务的实现
Oct 30 Python
Python 面向对象之封装、继承、多态操作实例分析
Nov 21 Python
基于numpy中的expand_dims函数用法
Dec 18 Python
使用Pytorch来拟合函数方式
Jan 14 Python
PyTorch 如何自动计算梯度
May 23 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 #Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
Aug 05 #Python
使用coverage统计python web项目代码覆盖率的方法详解
Aug 05 #Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
Aug 05 #Python
selenium2.0中常用的python函数汇总
Aug 05 #Python
Django中使用CORS实现跨域请求过程解析
Aug 05 #Python
Flask使用Pyecharts在单个页面展示多个图表的方法
Aug 05 #Python
You might like
JS判断字符串长度的5个方法(区分中文和英文)
2014/03/18 Javascript
js+html5实现canvas绘制镂空字体文本的方法
2015/06/05 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
gulp教程_从入门到项目中快速上手使用方法
2017/09/14 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
基于js文件加载优化(详解)
2018/01/03 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
[03:55]显微镜下的DOTA2特别篇——430灰烬之灵神级操作
2014/06/24 DOTA
Python实现自动发送邮件功能
2021/03/02 Python
Pandas 对Dataframe结构排序的实现方法
2018/04/10 Python
python2.7实现爬虫网页数据
2018/05/25 Python
Python中asyncio与aiohttp入门教程
2018/10/16 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
使用python实现画AR模型时序图
2019/11/20 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
如何通过python检查文件是否被占用
2020/12/18 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
德国原装品牌香水、化妆品和手表网站:BRASTY.DE
2016/10/16 全球购物
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
优秀求职自荐信怎样写
2013/12/18 职场文书
学生会竞聘书范文
2014/03/31 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
爱心捐款倡议书范文
2014/05/12 职场文书
教代会开幕词
2015/01/28 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
2015年学校消防安全工作总结
2015/10/14 职场文书
2016学习医德医风心得体会
2016/01/25 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
团组织关系介绍信
2019/06/24 职场文书