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

考虑到女友的安全问题,就做了一个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")

以下是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();
        }
    }

猜你喜欢

转载自blog.csdn.net/wzjssssssssss/article/details/79867072