python笔记(爬虫 微爬取微信信息)

2023-11-19

views.py

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>

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python笔记(爬虫 微爬取微信信息) 的相关文章

随机推荐

  • openwrt 缺少 libc.so.6 libm.so.6 libpthread.so.0

    在开发openwrt时 编译内核的时候 自己写的代码在openwrt 编译报错 提示缺少依赖库文件 Package Gateway Auto is missing dependencies for the following librari
  • flutter版本号对比

    版本号对比 Future
  • 筛选素数之欧拉筛法 python实现 附带证明

    返回类型 列表 说明 返回小于upperBound的所有素数 def ouLaShai upperBound filter False for i in range upperBound 1 primeNumbers for num in
  • Java学习心得10——多态

    多态 一种类型的变量可以掌管多种类型的对象 这就是多态 说人话 直观理解成多种形态 人类就是多态的 黄种人 白种人 黑种人都是属于人类 人类这一个类可以表示黄种人 白种人 黑种人这三个类 这不就是多态多种形态吗 回到编程 Animal 动物
  • 【华为OD机试真题 python】数字加减游戏【2022 Q4

    题目描述 数字加减游戏 小明在玩一个数字加减游戏 只使用加法或者减法 将一个数字s变成数字t 在每个回合中 小明可以用当前的数字加上或减去一个数字 现在有两种数字可以用来加减 分别为a b a b 其中b没有使用次数限制 请问小明最少可以用
  • 第四章 Flume专题-日志采集工具

    一 Flume专题之组件及架构介绍 1 Flume概述 1 1 Flume定义 Flume是一种分布式的 高可靠的和高可用的服务 用于有效地收集 聚合和移动大量日志数据框架 Flume是一个简单灵活的基于流数据的体系结构 1 2 Flume
  • Delphi ListView 的用法

    Delphi ListView 的用法 常用技巧 增加 i ListView1 Items Count with ListView1 do begin ListItem Items Add ListItem Caption IntToStr
  • Vite搭建react+ts项目

    创建一个react项目 首先需要打开终端 进行vite的引入 yarn create vite 使用react模板创建项目 yarn create vite react test template react cd react test y
  • Float与二进制之间的转化(Java实现)

    在线转化 http www binaryconvert com 2 3 import java text DecimalFormat 4 5 6 public class SinglePrecision 7 8 浮点到二进制 9 publi
  • 采用通信方式控制台达B2伺服驱动器运行在速度模式

    目录 前言 一 伺服驱动器恢复出厂设置 二 伺服驱动器设置为速度模式 三 关闭告警信息 四 通讯功能设置 五 采用通信功能控制伺服驱动器按速度模式运行 总结 前言 最近 使用台达B2伺服驱动器做项目 项目中用伺服电机的速度模式驱动一个螺杆按
  • Linux笔记--查看Linux系统自动Kill掉的进程

    目录 1 前言 2 查看系统日志 3 参考 1 前言 今天在服务器训练一个模型 程序无任何错误 但一段时间后挂在后台的进程莫名被Kill掉 原因在于服务器 linux 系统的运行内存不足 为了避免系统奔溃 系统主动 kill 内存占用最大的
  • Python项目创建(Pycharm程序)

    点击 新建项目 创建一个新的项目 这一步重点在Python解释器的选择 一个是新建虚拟环境 另一个是使用已有环境 使用此工具新建环境 Virtualenv 新建后在项目根目录下会出现 venv 的文件夹 相当于把Python解释器复制过去一
  • RANSAC算法实现 + 直线拟合

    一 RANSAC算法 1 参考资料 1 题目来源与解析 商汤科技SLAM算法岗的RANSAC编程题 2 牛客网题目 编程题 线性回归 3 牛客网解答参考 商汤科技某算法岗的编程题有点过分了啊 4 RANSAC算法原理 RANSAC翻译 经典
  • TOPIAM 社区版 1.0.0 发布,开源 IAM/IDaaS 企业身份管理平台

    文章目录 产品概述 系统架构 功能列表 管理端 门户端 技术架构 后续规划 相关地址 Hi 亲爱的朋友们 今天是传统 24 节气中的立秋 秋天是禾谷成熟 收获的季节 经过长时间优化和迭代 TOPIAM 企业身份管控平台也迎来了当下的成长和收
  • [Redis]-四种部署方式

    森格 2022年11月 本文是对Redis部署方式的学习 主要学习基本原理 以及几种方式的优缺点 一 部署方式概况 对于Redis的安装部署主要可以分为单机版 主从同步 Sentinel哨兵 Cluster集群部署四种方式 下面一起看下几种
  • AutoCAD 2022 for Mac v2022(24.1.50.899)中文版介绍

    CAD2022 Mac是一款针对苹果电脑打造的CAD设计软件 用于二维绘图 详细绘制 设计文档和基本三维设计 广泛应用于机械设计 工业制图 工程制图 土木建筑 装饰装潢 服装加工等多个行业领域 CAD2022新特征 改进了桌面 Web和移动
  • 一个全网最详细的Python教程,不信你来学一学!2023Python入门教程完整版,无偿分享

    近几年 编程越来越火 网上也是铺天盖地的免费教程 中小学生都开始投入到学习中 编程学习从娃娃抓起 甚至有些小学生都做起了 UP 主 教大家学编程 PS 我落下了柠檬的眼泪 小小年纪就学得一手好编程 光从编程的难易度来说 Python 简单
  • IDEA进行了Pull操作,Merge时选择了他们的优先,但自己的代码没有Push导致自己未提交的代码没了,头脑发热我差点哭出来解决方案

    IDEA进行了Pull操作 Merge时选择了他们的优先 但自己的代码没有Push导致自己未提交的代码没了 头脑发热我差点哭出来解决方案 问题背景 解决方案 心得 Lyric 沉默是因为包容 问题背景 我和胖哥同时在一个项目里面开发 我让他
  • 华为OD机试 - 判断字符串子序列(Java)

    题目描述 给定字符串 target和 source 判断 target是否为 source 的子序列 你可以认为target和 source 中仅包含英文小写字母 字符串 source 可能会很长 长度 500 000 而 target是个
  • python笔记(爬虫 微爬取微信信息)

    views py import time import json import re import requests from bs4 import BeautifulSoup from flask import Blueprint ren