本文只做微信公眾號(hào)測(cè)試用
一、功能
關(guān)注微信公眾號(hào) 西安氣象愛(ài)好者,發(fā)送通過(guò)高德地圖分享的鏈接地址,格式為 http://surl.amap.com/xxxxxxxxxxxxx ,公眾號(hào)將自動(dòng)回復(fù)對(duì)應(yīng)地點(diǎn)的經(jīng)度和緯度,可獲取自己定位位置的經(jīng)緯度,也可搜索地圖任意位置獲取經(jīng)緯度。
二、操作方法:
1、在高德地圖APP上定位或者搜索地址,選擇分享,按住下圖紅圈即可復(fù)制鏈接。

獲取鏈接地址
2、將復(fù)制的鏈接發(fā)送給微信公眾號(hào)“西安氣象愛(ài)好者”,獲取地址數(shù)據(jù)。

三、python代碼:
1、高德地圖鏈接解析:原理就是這個(gè)鏈接地址會(huì)經(jīng)過(guò)302跳轉(zhuǎn),跳轉(zhuǎn)的中間地址包括了經(jīng)度和緯度,只要通過(guò)requests庫(kù)獲取到,再由正則表達(dá)式提取就可以。
(實(shí)際上,如果用瀏覽器打開鏈接,經(jīng)緯度也會(huì)直接出現(xiàn)在最終的200狀態(tài)的地址中,但瀏覽器地址欄的地址最終會(huì)被js代碼替換掉,禁用js就不會(huì)被替換)

禁用js后瀏覽器打開鏈接地址

不禁用js打開同一個(gè)鏈接地址
import re
import requests
def dd2dms(deg):
d = int(float(deg))
md = abs(float(deg) - d) * 60
m = int(md)
sd = (md - m) * 60
return '{:d}° {:d}′ {:.7f}″'.format(d, m, sd)
headers = {
"User-Agent": "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
"Referer": "https://www.amap.com"
}
def Locate(url_string):
amapUrl = r'^http://surl.amap.com/\w{13}$'
if re.match(amapUrl, url_string) is None:
return 'NOT FOUND'
try:
url_string = 'https://' + url_string[7:]
r = requests.head(url_string, stream=True, headers=headers)
realUrl = r.headers['Location']
posPattern = r'(\d{1,3}\.\d{6,20}),(\d{1,3}\.\d{6,20})'
jingdu = re.search(posPattern, realUrl).group(2)
# print(jingdu)
weidu = re.search(posPattern, realUrl).group(1)
# print(weidu)
result = '({0},{1})\r\n({2},{3})'.format(weidu, jingdu, dd2dms(weidu), dd2dms(jingdu))
return result
except BaseException as e:
print(e)
return 'NOT FOUND'
if __name__ == '__main__':
url_string = 'http://surl.amap.com/3U9wY_0957DEP'
print(Locate(url_string))
2、微信公眾號(hào)自動(dòng)回復(fù)
也是用python來(lái)做微信公眾號(hào)的后臺(tái)接入,web.py模塊比較簡(jiǎn)單,寫兩個(gè)方法,一個(gè)接收一個(gè)回復(fù)。
GET:
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "hello, this is handle view"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "xxxxxxxxxxx"
list1 = [token,timestamp,nonce]
list1.sort()
str_list1 = ''.join(list1)
print(str_list1)
sha1 = hashlib.sha1()
sha1.update(str_list1.encode('utf-8'))
hashcode = sha1.hexdigest()
print("handle/GET func: hashcode, signature: ", hashcode, signature)
if hashcode == signature:
return echostr
else:
return ""
except Exception as Argument:
return Argument
POST:
def POST(self):
str_xml = web.data()
xml = etree.fromstring(str_xml)
msgType = xml.find("MsgType").text
fromUser = xml.find("FromUserName").text
toUser = xml.find("ToUserName").text
#如果符合高德鏈接格式則返回經(jīng)緯度,否則返回test+原字符串
if msgType == 'text':
getMsg=xml.find("Content").text.strip()
amapUrl = r'^http://surl.amap.com/\w{13}$'
if re.match(amapUrl, getMsg) is None:
content = "test"+ getMsg
else:
content=getLocate.Locate(getText)
render = web.template.render('templates/')
return render.reply_text(fromUser, toUser, int(time.time()), content)
elif msgType == 'image':
pass
else:
pass