import time
import json
import re
import requests
from bs4 import BeautifulSoup
from flask import Blueprint, render_template, session, jsonify, request
wx = Blueprint("wx", __name__)
def xml_parse(text):
result = {}
soup = BeautifulSoup(text, "html.parser")
tag_list = soup.find(name="error").find_all()
for tag in tag_list:
result[tag.name] = tag.text
return result
@wx.route("/login")
def login():
ctime = int(time.time() * 1000)
wcode_url = "https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_={}".format(ctime)
res = requests.get(
url=wcode_url
)
data = res.text
uuid = re.findall('uuid = "(.*)";', data)[0]
session["uuid"] = uuid
return render_template("wechat_page.html", uuid=uuid)
@wx.route("/check_login")
def check_login():
uuid = session.get("uuid")
ctime = int(time.time() * 1000)
check_login_url = "https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid={}&tip=0&r=-1916563215&_={}".format(uuid, ctime)
res = requests.get(
url=check_login_url
)
result = {"code": None}
if "window.code=408" in res.text:
result["code"] = 408
elif "window.code=201" in res.text:
result["code"] = 201
result["userAvatar"] = re.findall("window.userAvatar = '(.*)';", res.text)[0]
elif "window.code=200" in res.text:
result["code"] = 200
redirect_uri = re.findall('redirect_uri="(.*)";', res.text)[0]+"&fun=new&version=v2"
ret = requests.get(
url=redirect_uri
)
ticket_dict = xml_parse(ret.text)
session["ticket_dict"] = ticket_dict
session["ticket_cookie"] = ret.cookies.get_dict()
return jsonify(result)
@wx.route("/mainpage")
def mainpage():
pass_ticket = session["ticket_dict"].get("pass_ticket")
init_url = " https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=-1932693400&pass_ticket={}".format(pass_ticket)
res = requests.post(
url=init_url,
json={
"BaseRequest": {
"DeviceID": "e145195217922834",
"Sid": session["ticket_dict"].get("wxsid"),
"Skey": session["ticket_dict"].get("skey"),
"Uin": session["ticket_dict"].get("wxuin")
}
}
)
res.encoding = "utf-8"
init_user_dict = res.json()
return render_template("wechat_index.html", init_user_dict=init_user_dict)
@wx.route("/contractlist")
def contractlist():
ctime = int(time.time() * 1000)
# pass_ticket = session["ticket_dict"].get("pass_ticket")
skey = session["ticket_dict"].get("skey")
print(session.get("ticket_cookie"))
contract_url = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?r={0}&seq=0&skey={1}".format(ctime, skey)
res = requests.get(
url=contract_url,
cookies=session.get("ticket_cookie")
)
res.encoding = "utf-8"
user_list = res.json()
return render_template("contact_list.html", userlist=user_list.get("MemberList"))
@wx.route("/get_img")
def get_img():
prev = request.args.get("prev")
username = request.args.get("username")
skey = request.args.get("skey")
head_img_url = "https://wx2.qq.com{0}&username={1}&skey={2}".format(prev, username, skey)
res = requests.get(
url=head_img_url,
cookies=session.get("ticket_cookie")
)
return res.content
@wx.route("/send_msg", methods=["POST"])
def send_msg():
ctime = int(time.time() * 1000)
from_user = request.form.get("fromuser")
to_user = request.form.get("touser")
content = request.form.get("content")
data_dict = {
"BaseRequest": {
"DeviceID": "e823270257010524",
"Sid": session["ticket_dict"].get("wxsid"),
"Skey": session["ticket_dict"].get("skey"),
"Uin": session["ticket_dict"].get("wxuin")
},
"Msg": {
"ClientMsgId": ctime,
"Content": content,
"FromUserName": from_user,
"LocalID": ctime,
"ToUserName": to_user,
'Type': 1
},
'Scene': 0
}
send_url = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?lang=zh_CN&pass_ticket={0}".format(session["ticket_dict"].get("pass_ticket"))
ret = requests.post(
url=send_url,
data=bytes(json.dumps(data_dict, ensure_ascii=False), encoding="utf-8")
)
print(ret)
return "发送成功"
wechat_page.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>微信</title>
</head>
<body>
<div>
<h1>扫码登录</h1>
<img id="userAvatar" src="https://login.weixin.qq.com/qrcode/{{uuid}}" alt="">
</div>
<script src="https://cdn.bootcss.com/jquery/3.4.0/jquery.min.js"></script>
<script>
$(function () {
check_login();
});
function check_login() {
$.ajax({
url:"/check_login",
method:"GET",
dataType:"json",
success:function (arg) {
if (arg.code === 408){
check_login();
}
else if (arg.code === 201){
$("#userAvatar").attr("src", arg.userAvatar);
check_login();
}
else if (arg.code === 200){
location.href = "/mainpage"
}
}
})
}
</script>
</body>
</html>
wechat_index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>微信首页</title>
</head>
<body>
<h1>欢迎来到微信{{init_user_dict.User.UserName}}</h1>
<h3>最近联系人</h3>
<ul>
{% for row in init_user_dict.ContactList %}
<li>{{row.NickName}}</li>
{% endfor %}
<a href="/contractlist">联系人列表</a>
</ul>
<h3>最近公众号</h3>
{% for item in init_user_dict.MPSubscribeMsgList %}
<div>
<h3>{{item.NickName}}</h3>
<ul>
{% for msg in item.MPArticleList %}
<li><a href="{{msg.Url}}">{{msg.Title}}</a></li>
{% endfor %}
</ul>
</div>
{% endfor %}
</body>
</html>
contact_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>联系人列表</title>
</head>
<body>
<div>
<form action="/send_msg" method="post">
<p>
自己的唯一标识:<input type="text" name="fromuser">
别人的唯一标识:<input type="text" name="touser">
发送内容:<input type="text" name="content">
<button type="submit">发送</button>
</p>
</form>
</div>
<h1>联系人列表</h1>
{% for user in userlist %}
<li>
<img style="height: 50px;width: 50px;" src="/get_img?prev={{user.HeadImgUrl}}">
<span>用户名:{{user.NickName}} 唯一标识:{{user.UserName}}</span>
</li>
{% endfor %}
</body>
</html>