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

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();

    }

  }

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值