侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   237

考虑到女友的安全问题,就做了一个app实现定位和服务器实现转发的东西。刚学python,竟没想到用对象编程会更加方便,全程过程式开发,代码有点臃肿,就当学习下python吧.

效果就是:在微信公众号中输入指定字符比如:”我要知道你的位置”,手机那端的位置就弹出来了.主要是讲一下思路:先是app实现定位,当微信发送消息时,消息从微信服务器转发到开发者服务器然后用socket发送指定消息来通知app,I need your location,app接收到消息之后再发送给开发服务器(app 开service实现后台全程运行),由于定位信息是经纬度,所以用了高德API,但是发现谷歌地球的定位是准的,可能和android内置的定位有关系吧,然后就转换了一下不同地图的经纬度,然后转成位置信息发送给微信服务器.

import socketimport threadingimport osimport requestsfrom flask import Flaskfrom flask import requestfrom bs4 import BeautifulSoupimport jsonglobal 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 和经纬度转位置APIdef 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:    passtry:  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队列RabbitMQ 使用方法实例记录
    下一条:
    基于python框架Scrapy爬取自己的博客内容过程详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客