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 的描述符 descriptor详解
Feb 27 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
基于pandas将类别属性转化为数值属性的方法
Jul 25 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
May 29 Python
PyQt5 加载图片和文本文件的实例
Jun 14 Python
python urllib爬虫模块使用解析
Sep 05 Python
python实现扫雷游戏
Mar 03 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
Python如何设置指定窗口为前台活动窗口
Aug 12 Python
Python创建简单的神经网络实例讲解
Jan 04 Python
python 爬取天气网卫星图片
Jun 07 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
同时提取多条新闻中的文本一例
2006/10/09 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
php利用新浪接口查询ip获取地理位置示例
2014/01/20 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
在ASP.NET中使用JavaScript脚本的方法
2013/11/12 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
2015/05/26 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
微信小程序 require机制详解及实例代码
2016/12/14 Javascript
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
怎样使用Python脚本日志功能
2016/08/14 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
基于python神经卷积网络的人脸识别
2018/05/24 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
浅谈Python 敏感词过滤的实现
2019/08/15 Python
Django发送邮件功能实例详解
2019/09/02 Python
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
如何写一个自定义标签
2012/12/28 面试题
平民服装店创业计划书
2014/01/17 职场文书
个人党性剖析材料
2014/02/03 职场文书
借款协议书
2014/04/12 职场文书
学雷锋宣传标语
2014/06/25 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
面试自我评价范文
2014/09/17 职场文书
党员作风建设自查报告
2014/10/23 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
学会感恩主题班会
2015/08/12 职场文书
研究生学习计划书应该怎么写?
2019/09/10 职场文书
Python趣味挑战之教你用pygame画进度条
2021/05/31 Python
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers