易班自动刷网薪系统

Aimerl0
• 阅读 2951

写在前面

Python 课最后的大作业,跟大哥们一起写这个小玩意,因为学院好像很喜欢刷这些东西,总体来说挺简单的

分到我的模块刚刚好需要手机抓包,网页端易班登陆进去没有发动态的模块了,模块在维护 后续会更新其他人的板块并尝试做出来真正的模拟登陆(逆向app或者使用appium提取loginToken)

源码

# -*- coding: utf-8 -*-
"""
@Time : 2021/5/5
@Author : C1everF0x
@File : dongtai
@Description : 
"""
import re
import requests
import urllib.parse

def login():
    '''
    登录模块其实没有真正实现,网页端登录已经能通过逆向分析 login.js 文件来获取易班对密码在前端的加密算法,可以真正实现模拟登录
    app端无法通过抓包或分析接口地址来找到加密方式
    第一次输入密码登陆过后,app会将 loginToken 嵌入到 app 里,下次打开会提取拼接到 autologin 接口的 url中
    目前能想到的 app 端实现真正模拟登录两种方法:
    1、app 端在登录时候对密码的加密是嵌在 app 的源码里,真要做可以通过逆向分析 app 源码,找到加密代码逆向破解
    2、使用类似于 seleium 的 appium 来实现模拟真正的人进行登录,再从中提取出 loginToken
    目前实现只能够是抓包拿 loginToken 来给到 autologin 接口进行伪造登录
    2021.05.07
    :return:
    '''
    url = "https://mobile.yiban.cn/api/v3/passport/autologin?access_token=e3017321cf9cdae74e34061cf7adef4a"
    header = {
        'User-Agent': 'YiBan/4.9.9 Mozilla/5.0 (Linux; Android 5.1.1; MI 9 Build/NMF26X; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.136 Mobile Safari/537.36',
        'Authorization': 'Bearer e3017321cf9cdae74e34061cf7adef4a',
        'loginToken': 'e3017321cf9cdae74e34061cf7adef4a',
        'AppVersion': '4.9.9',
        'Content-Type': 'application/json',
        'Accept-Encoding': 'gzip, deflate'
    }
    try:
        r = requests.get(url = url,headers = header)
        r.raise_for_status()    # 判断异常
        r.encoding = r.apparent_encoding    # 设置编码
        return '登录成功'
    except:
        return '登录失败'

class DongTai:
    def __init__(self,token,neirong_dongtai,neirong_pinglun):   # 初始化类里面的私密属性
        self.__token = token
        self.neirong_dongtai = neirong_dongtai
        self.__dongtai_hao = None
        self.neirong_pinglun = neirong_pinglun
    def release(self,neirong_dongtai):
        '''
        自动发布动态,动态内容需要进行一次 url 编码
        动态发布成功后会返回一个 json ,里面有每个动态专属的一个九位数的号码
        之后对动态进行的点赞、评论操作,需要通过该号码定位是哪条动态
        :return:
        '''
        url = r'https://mobile.yiban.cn/api/v3/feeds/?access_token=' + self.__token + '&content=' + urllib.parse.quote(neirong_dongtai) + '&visibleScope=0&artwork=0&toUserIds=&address=&lat=&lng=&share=0&shareTitle=&shareUrl=&shareContent=&shareImage=&shareSource=&kind=1&hiddenAddress=0'
        header = {
            'User-Agent': 'YiBan/4.9.9 Mozilla/5.0 (Linux; Android 5.1.1; MI 9 Build/NMF26X; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.136 Mobile Safari/537.36',
            'Authorization': 'Bearer e3017321cf9cdae74e34061cf7adef4a',
            'loginToken': 'e3017321cf9cdae74e34061cf7adef4a',
            'AppVersion': '4.9.9',
            'Content-Type': 'application/x-www-form-urlencoded',
            'Accept-Encoding': 'gzip, deflate',
            'Content-Length': '0',
        }
        try:
            r = requests.post(url,headers = header)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            response_json = r.text
            re_response_json = re.findall(r'\d{9}',response_json)   # 正则匹配提取动态号码
            self.__dongtai_hao = ''.join(re_response_json)  # 赋给私有变量
            return '发布成功,该动态 id 为 {}'.format(self.__dongtai_hao)
        except:
            return '发布失败'

        # 返回 json 样例,feedId 是动态号码
        # {"response": 100, "message": "\u8bf7\u6c42\u6210\u529f",
        #  "data": {"feedId": 294594341, "feedCheckinReward": null}}

    def give_good(self):
        '''
            自动给动态点赞
            :return:
            '''
        url = r'https://mobile.yiban.cn/api/v3/feeds/' + self.__dongtai_hao + r'/ups?access_token=' + self.__token
        header = {
            'User-Agent': 'YiBan/4.9.9 Mozilla/5.0 (Linux; Android 5.1.1; MI 9 Build/NMF26X; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.136 Mobile Safari/537.36',
            'Authorization': 'Bearer e3017321cf9cdae74e34061cf7adef4a',
            'loginToken': 'e3017321cf9cdae74e34061cf7adef4a',
            'AppVersion': '4.9.9',
            'Content-Type': 'application/x-www-form-urlencoded',
            'Accept-Encoding': 'gzip, deflate',
            'Content-Length': '0',
        }
        try:
            r = requests.post(url, headers=header)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return '点赞成功'
        except:
            return '点赞失败'

    def comments(self,neirong_pinglun):
        '''
        自动给动态评论,内容需要进行一次 url 编码,通过之前发布存入私有变量的动态号码来确定需要评论哪条动态
        :return:
        '''
        url = r'https://mobile.yiban.cn/api/v3/feeds/' + self.__dongtai_hao + '/comments?access_token=' + self.__token + r'&content=' + urllib.parse.quote(neirong_pinglun) + r'&toUserId=&toCommentId='
        header = {
            'User-Agent': 'YiBan/4.9.9 Mozilla/5.0 (Linux; Android 5.1.1; MI 9 Build/NMF26X; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.136 Mobile Safari/537.36',
            'Authorization': 'Bearer e3017321cf9cdae74e34061cf7adef4a',
            'loginToken': 'e3017321cf9cdae74e34061cf7adef4a',
            'AppVersion': '4.9.9',
            'Content-Type': 'application/x-www-form-urlencoded',
            'Accept-Encoding': 'gzip, deflate',
            'Content-Length': '0',
        }
        try:
            r = requests.post(url, headers=header)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return '评论成功,评论内容为 {}'.format(neirong_pinglun)
        except:
            return '评论失败'

if __name__ == "__main__":
    print(login())
    token = 'e6262d37a192f6be11c159f4080326d9'
    neirong_dongtai = input('请输入动态内容:')
    neirong_pinglun = input('请输入评论内容:')
    dongtai = DongTai(token,neirong_dongtai,neirong_pinglun)    # 实例化动态类,需要提供 loginToken,发布动态内容和评论内容
    print(dongtai.release(neirong_dongtai))
    print(dongtai.comments(neirong_pinglun))
    print(dongtai.give_good())

最后结果如图:

易班自动刷网薪系统

整体流程

  • 流程图如下

    易班自动刷网薪系统

知识点

  • 使用 requests 库编写爬虫程序,实现模拟真实用户进行发布动态、评论动态和点赞动态的功能

  • 使用 re 库对发布动态成功后的返回包进行解析,提取发布成功的动态的动态号码

  • 搭建安卓虚拟机 + xposed 框架 + justTrustMe 模块,因为 app 可以自己检验 SSL 握手时服务器返回的证书是否合法,“SSL pinning” 技术指在 app 中只信任固定的证书和公钥,安卓 7.0 以上把证书分为系统证书和用户证书,有些 app 只信任系统证书,真实手机抓包会提示手机没网,所以需要使用 xposed 框架 + justTrustMe 模块,来 hook 掉本地证书强校验的逻辑,同时导入 burp 的证书,使其流量通过 burp,实现手机抓包

    Xposed 框架是一款开源框架,其功能是可以在不修改 APK 的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作

    JustTrustMe 一个用来禁用、绕过 SSL 证书检查的基于 Xposed 模块。简单来说,JustTrustMe 是将 APK 中所有用于校验 SSL 证书的 API 都进行了 Hook,从而绕过证书检查的

  • 抓包分析各个功能对 api 请求的 url 构造格式和 http 请求头的伪造方法

  • 使用面向对象编程,将三个功能封装成类,方便团队进行最后的代码拼接

模拟登录

​ 模拟登录模块其实没有真正实现,网页端登录已经能通过逆向分析 login.js 文件来获取易班对密码在前端的加密算法,可以真正实现模拟登录 ​ app 端无法通过抓包或分析接口地址来找到加密方式 在 app 里第一次输入密码成功登陆后,app 会将 loginToken 嵌入到 app 里,下次打开会提取拼接到请求 autologin api 接口的 url 中 ​ 目前能想到的 app 端实现真正模拟登录两种方法: ​ 1、app 端在登录时候对密码的加密是嵌在 app 的源码里,真要做可以通过逆向分析 app 源码,找到加密代码逆向破解 ​ 2、使用类似于 seleium 的 appium 来实现模拟真正的人进行登录,再从中提取出 loginToken ​ 目前实现只能够是抓包拿 loginToken 来给到 autologin 接口进行伪造登录

抓取 loginToken

  • 假设已经配置好了安卓虚拟机环境,在安卓虚拟机上打开易班,同时用 burp 抓包

易班自动刷网薪系统

  • 保存下来复制到代码里面,替换掉所有需要用到的地方

    自动发布动态

自动发布动态,动态内容需要进行一次 url 编码 动态发布成功后会返回一个 json ,里面有每个动态专属的一个九位数的号码 之后对动态进行的点赞、评论操作,需要通过该号码定位是哪条动态

抓包分析

易班自动刷网薪系统

  • 发布动态时需要在 url 中添加 access_token 参数,内容为之前抓取到的 loginToken,在 http 请求头里面还存在两个需要用到 loginToken 的头

自动评论动态

自动给动态评论,评论内容需要进行一次 url 编码,通过之前发布存入私有变量的动态号码来确定需要评论哪条动态

自动点赞动态

拼接需要点赞的动态号进入请求点赞 api 的 url 中,请求即可完成点赞

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这