轮询:
在前端,设置时间内,一直向后端发送请求。
例如:使用setInterval方法设置定时器,一秒向后端发送一次请求,去主动获取数据,进行更新
由于前端一直请求,后端压力太大。而且当没有数据更新,前端一直去请求,太浪费了,没必要。
代码简单
长轮询:
在轮询的基础上,加以改造。Http请求到来,若是不主动close或者return,则连接会一直存在。但是不要让这个时间太长,会占用太多资源
例如:当前端发送请求,后端拿到后,不去关闭,而是等待一段时间,在这段时间内若是有数据到达,立刻返回,否则直到等待时间结束。
然后返回给前端,前端马上又发起一次请求......
消息是实时获取。
WebSocket:
http是单向请求,客户端去服务端获取数据。服务端不能主动推送消息。
而websocket类似于socket,可以实现双向发送,
实现当数据更新,可以主动推送
二:web微信流程介绍


三:微信登录开发
from django.shortcuts import render,HttpResponse
from bs4 import BeautifulSoup
import requests
import time,re,json
CTIME = None #用于保存全局时间戳
QCODE = None #当我们访问二维码时,会产生一个UUID,我们将其存放为全局
TIP = 1 #url中的一个参数tip,当其为1:代表我们还没有扫描二维码,当其为0:扫描了二维码
登录视图login,用于显示二维码
def login(request):
global CTIME
global QCODE
CTIME = int(time.time())
data = {
'appid':'wx782c26e4c19acffb',
'fun':'new',
'lang':'zh_CN',
'_':CTIME
}
response = requests.get(
url="https://login.wx.qq.com/jslogin",
params=data
)
pat_res = re.findall('uuid = "(.*)";',response.text) #正则匹配UUID
QCODE = pat_res[0]
return render(request,"login.html",{'qcode':QCODE})
check_login用于检测登录状态:408未扫描,201扫描二维码但是未登录,200点击登录
def check_login(request):
global TIP
ret = {'code':408,'data':None}
data = {
'loginicon':"true",
'uuid':QCODE,
'tip':TIP,
'r':'-577317906',
'_':int(time.time())
}
r1 = requests.get(
url='https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login',
params=data
)
if 'window.code=408' in r1.text:
print("无人扫描")
return HttpResponse(json.dumps(ret))
elif 'window.code=201' in r1.text:
ret['code'] = 201
pat_ret = re.findall("window.userAvatar = '(.*)';",r1.text)[0]
ret['data'] = pat_ret
TIP = 0
return HttpResponse(json.dumps(ret))
elif 'window.code=200;' in r1.text:
ret['code'] = 200
redirect_url = re.findall('window.redirect_uri="(.*)";',r1.text)[0]
reponse = requests.get(
url=redirect_url+"&fun=new&version=v2" #url不够完整,需要我们完善
)
# print(reponse.text) #<error><ret>0</ret><message></message><skey>@crypt_7358fe11_af06754907ad9c216768337d80cf0ce7</skey><wxsid>icUySQoySDi2OZFK</wxsid><wxuin>2821071261</wxuin><pass_ticket>IWScm1SE%2BGQ%2BNEaghUBCxbF3xPJSzqXUGTO6BYh3TBEGlw8Wa7qETkA9EEAUudYU</pass_ticket><isgrayscale>1</isgrayscale></error>
soup = BeautifulSoup(reponse.text,"lxml")
info_dict = {}
for tag in soup.find("error").children:
info_dict[tag.name]=tag.get_text()
get_user_info_url = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=-613135321&pass_ticket='+info_dict['pass_ticket']
get_user_info_form = {
'BaseRequest':
{
'DeviceID':"e055319847811019",
'Sid':info_dict['wxsid'],
'Skey':info_dict['skey'],
'Uin':info_dict['wxuin']
}
}
reponse2 = requests.post( #获取的是用户信息,最近联系人,公众号,自己信息
url=get_user_info_url,
json=get_user_info_form, #注意这里使用的是json,post不允许传送字典
)
reponse2.encoding = "utf-8"
print(reponse2.text)
return HttpResponse("OK")
![]()
'''
新请求 GET 获取跳转地址redirect_uri
https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?
loginicon=true
&uuid=QfsKELYXow==
&tip=0
&r=-613406501
&_=1529621492415
---------------------------------------------------------
window.code=200;
window.redirect_uri="
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?
ticket=ASWg1dxC1oWVbJtZH8V-HhlB@qrticket_0
&uuid=QfsKELYXow==
&lang=zh_CN
&scan=1529621533";
新请求 GET 获取凭证pass_ticket 服务端开始设置了cookie,说明在后面的请求中需要携带cookie
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?
ticket=ASWg1dxC1oWVbJtZH8V-HhlB@qrticket_0
&uuid=QfsKELYXow==
&lang=zh_CN
&scan=1529621533
&fun=new
&version=v2
-----------------------------------------------------------------
<error>
<ret>0</ret>
<message></message>
<skey>@crypt_7358fe11_ea821d506c39f7d75a3e83b4233caab4</skey>
<wxsid>qUJZlkBIWQ0130QI</wxsid>
<wxuin>2821071261</wxuin>
<pass_ticket>xNiKeCBgFkMBfEK8oOK3Gp9qj%2F1HfLpcfPrDwGv3A4nltKskVqoxkECrVYEN9eJJ</pass_ticket>
<isgrayscale>1</isgrayscale>
</error>
新请求:获取用户所有信息,最近联系人和公众号 POST 需要携带数据,数据来自于上面凭证中
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?
r=-613135321
&pass_ticket=xNiKeCBgFkMBfEK8oOK3Gp9qj%252F1HfLpcfPrDwGv3A4nltKskVqoxkECrVYEN9eJJ
数据
{
BaseRequest:
{
DeviceID:"e055319847811019"
Sid:"pY7nfHplUAsBOINz"
Skey:"@crypt_7358fe11_e0ae163bd19650bea336df66837e9f7a"
Uin:"2821071261"
}
}
--------------------------------------------------------------------
{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
}
,
"Count": 9,
"ContactList": [{
"Uin": 0,
"UserName": "filehelper",
"NickName": "æ–‡ä»¶ä¼ è¾“åŠ©æ‰‹",
"HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=660872310&username=filehelper&skey=@crypt_7358fe11_ea821d506c39f7d75a3e83b4233caab4",
"ContactFlag": 2,
"MemberCount": 0,
"MemberList": [],
"RemarkName": "",
"HideInputBarFlag": 0,
"Sex": 0,
"Signature": "",
"VerifyFlag": 0,
"OwnerUin": 0,
"PYInitial": "WJCSZS",
"PYQuanPin": "wenjianchuanshuzhushou",
"RemarkPYInitial": "",
"RemarkPYQuanPin": "",
"StarFriend": 0,
"AppAccountFlag": 0,
"Statues": 0,
"AttrStatus": 0,
"Province": "",
"City": "",
"Alias": "",
"SnsFlag": 0,
"UniFriend": 0,
"DisplayName": "",
"ChatRoomId": 0,
"KeyWord": "fil",
"EncryChatRoomId": "",
"IsOwner": 0
},还有其他的]
}
新请求
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?
r=-613135321
&pass_ticket=xNiKeCBgFkMBfEK8oOK3Gp9qj%252F1HfLpcfPrDwGv3A4nltKskVqoxkECrVYEN9eJJ
新请求 GET 获取所有联系人和公众号
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?
lang=zh_CN
&pass_ticket=gWbCT8vTjFeFKXDvfJZ6DtMtHo5d8zzhtLgLoybILn7eeTNSMI4BErA7e9otuPXQ
&r=1529642330650
&seq=0
&skey=@crypt_7358fe11_9dc260b8cffb962a3e475ca50e7813c9
-----------------------------------------------------------------------------
{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
}
,
"MemberCount": 162,
"MemberList": [{
"Uin": 0,
"UserName": "@39ef4d4197e9a7388e41fc9de150b3e28bf125082f1e442822814dec4803c6a0",
"NickName": "å®é™è‡´è¿œ",
"HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=0&username=@39ef4d4197e9a7388e41fc9de150b3e28bf125082f1e442822814dec4803c6a0&skey=@crypt_7358fe11_9dc260b8cffb962a3e475ca50e7813c9",
"ContactFlag": 1,
"MemberCount": 0,
"MemberList": [],
"RemarkName": "",
"HideInputBarFlag": 0,
"Sex": 1,
"Signature": "凶巴巴呛è´è´",
"VerifyFlag": 0,
"OwnerUin": 0,
"PYInitial": "NJZY",
"PYQuanPin": "ningjingzhiyuan",
"RemarkPYInitial": "",
"RemarkPYQuanPin": "",
"StarFriend": 0,
"AppAccountFlag": 0,
"Statues": 0,
"AttrStatus": 4197,
"Province": "æ²³å—",
"City": "郑州",
"Alias": "",
"SnsFlag": 17,
"UniFriend": 0,
"DisplayName": "",
"ChatRoomId": 0,
"KeyWord": "",
"EncryChatRoomId": "",
"IsOwner": 0
},
还有其他
]
'''
各个url详细请求