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中通过预先编译正则表达式提高效率
Sep 25 Python
Python数据结构之顺序表的实现代码示例
Nov 15 Python
python实现Decorator模式实例代码
Feb 09 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
pycharm中成功运行图片的配置教程
Oct 28 Python
Python闭包思想与用法浅析
Dec 27 Python
对Python闭包与延迟绑定的方法详解
Jan 07 Python
python实现两张图片的像素融合
Feb 23 Python
Python求一批字符串的最长公共前缀算法示例
Mar 02 Python
Python 一键获取百度网盘提取码的方法
Aug 01 Python
python包的导入方式总结
Mar 02 Python
Python Pandas 删除列操作
Mar 16 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
WIN98下Apache1.3.14+PHP4.0.4的安装
2006/10/09 PHP
php删除页面记录 同时刷新页面 删除条件用GET方式获得
2012/01/10 PHP
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
PHP判断远程图片是否存在的几种方法
2014/05/04 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
兼容ie和firefox js关闭代码
2008/12/11 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
js实现圆盘记速表
2015/08/03 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
python使用webbrowser浏览指定url的方法
2015/04/04 Python
python实现简单购物商城
2016/05/21 Python
用Python设计一个经典小游戏
2017/05/15 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
简单了解python元组tuple相关原理
2019/12/02 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
Python使用lambda抛出异常实现方法解析
2020/08/20 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
中国跨境电商:Tomtop
2017/03/16 全球购物
应届大学生自荐信
2013/12/05 职场文书
促销活动方案模板
2014/02/24 职场文书
动员大会主持词
2014/03/20 职场文书
质量承诺书格式
2014/05/20 职场文书
2014年幼儿园班级工作总结
2014/12/17 职场文书
贫困证明书范文
2015/06/16 职场文书
golang中的空接口使用详解
2021/03/30 Python
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
MyBatis 动态SQL全面详解
2021/10/05 MySQL
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js