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 相关文章推荐
requests和lxml实现爬虫的方法
Jun 11 Python
Python绘制3d螺旋曲线图实例代码
Dec 20 Python
使用Python从零开始撸一个区块链
Mar 14 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
Apr 18 Python
Python基于多线程实现ping扫描功能示例
Jul 23 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
Jun 24 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
python selenium循环登陆网站的实现
Nov 04 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
Jan 23 Python
Pytorch上下采样函数--interpolate用法
Jul 07 Python
python实现简单的井字棋
May 26 Python
Python学习之包与模块详解
Mar 19 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
php以fastCGI的方式运行时文件系统权限问题及解决方法
2015/05/11 PHP
PHP安装memcached扩展笔记
2015/05/28 PHP
php+ajax制作无刷新留言板
2015/10/27 PHP
使用PHP如何实现高效安全的ftp服务器(一)
2015/12/20 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
Laravel框架下载,安装及路由操作图文详解
2019/12/04 PHP
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
javascript object array方法使用详解
2012/12/03 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
Vue 莹石摄像头直播视频实例代码
2018/08/31 Javascript
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
Python中SOAP项目的介绍及其在web开发中的应用
2015/04/14 Python
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
python 中如何获取列表的索引
2019/07/02 Python
python关闭占用端口方式
2019/12/17 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
大学四年个人的自我评价
2014/02/26 职场文书
男方婚前保证书
2015/02/28 职场文书
出国留学英文自荐信
2015/03/25 职场文书
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
MySQL学习必备条件查询数据
2022/03/25 MySQL