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的Zato发送AMQP消息的教程
Apr 16 Python
Python实现简单的语音识别系统
Dec 13 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
Mar 19 Python
对python3中pathlib库的Path类的使用详解
Oct 14 Python
Django 模型类(models.py)的定义详解
Jul 19 Python
Pandas透视表(pivot_table)详解
Jul 22 Python
Flask框架学习笔记之模板操作实例详解
Aug 15 Python
Python下应用opencv 实现人脸检测功能
Oct 24 Python
Python跑循环时内存泄露的解决方法
Jan 13 Python
python日期与时间戳的各种转换示例
Feb 12 Python
python3实现将json对象存入Redis以及数据的导入导出
Jul 16 Python
想学画画?python满足你!
Dec 24 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操作XML作为数据库的类
2010/12/19 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
js静态作用域的功能。
2006/12/25 Javascript
Javascript日期对象的dateAdd与dateDiff方法
2008/11/18 Javascript
javascript DOM编程实例(智播客学习)
2009/11/23 Javascript
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
js学习总结之DOM2兼容处理this问题的解决方法
2017/07/27 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
Django csrf 两种方法设置form的实例
2019/02/03 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
2019/06/11 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
Python中base64与xml取值结合问题
2019/12/22 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
html5 canvas手势解锁源码分享
2020/01/07 HTML / CSS
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
简历上的自我评价怎么写
2014/01/28 职场文书
幼儿园小班植树节活动方案
2014/03/04 职场文书
小学数学课题方案
2014/06/15 职场文书
理财计划书
2014/08/14 职场文书
护士求职自荐信范文
2015/03/04 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
导游词幽默开场白
2019/06/26 职场文书