模拟 GIWIGI 客户端认证过程

模拟 GIWIGI 客户端认证过程

这不是破解!

模拟 giwifi 客户端的登录验证过程,仅用于学术交流。

分别使用 python 和 Golang 实现了 GIWIFI 客户端的认证过程,使用时需要先用抓包工具抓取一下 giwi 认证过程中的流量信息,在代码中填入对应的信息即可。

GitHub: https://github.com/Pililink/GIWIFI-demo-Login

有问题可以提 issues

关于 Django 执行单独文件时导入内部包的问题

关于 Django 执行单独文件时导入内部包的问题

.
├── django_web
│   ├── RealTimeData
│   │   ├── init.py
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── migrations
│   │   │   ├── 0001_initial.py
│   │   │   ├── init.py
│   │   ├── models.py
│   │   ├── sql_api_test.html
│   │   ├── templates
│   │   │   └── RealTimeData
│   │   │   └── index.html
│   │   ├── tests.py
│   │   ├── urls.py
│   │   └── views.py
│   ├── init.py
│   ├── db.sqlite3
│   ├── django_web
│   │   ├── init.py
│   │   ├── asgi.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   └── manage.py
└── main.py

这是文件结构,同时 main.py 处在一个 django_web 的文件夹下。
现在的问题是:当我单独执行 main.py 文件时,导入 RealTimeData 的模块出现 ModuleNotFoundError 。

然而在配置 DJANGO_SETTINGS_MODULE 时引用 settings 文件是没问题的。sys.path 也包含了 main.py 的父目录的路径。

print(sys.path)
os.environ.setdefault(‘DJANGO_SETTINGS_MODULE’, ‘django_web.django_web.settings’)
django.setup()

from django_web.RealTimeData.models import RowRecord

现在才发现提问题不给报错信息是多么愚蠢,程序在 django.setup()那一步就已经出错。
”’ (django_env) mac@Luxis-MacBook-Pro django_web % python -m main Traceback (most recent call last): File “/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/runpy.py“, line 194, in _run_module_as_main return _run_code(code, main_globals, None, File “/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/runpy.py“, line 87, in _run_code exec(code, run_globals) File “/Users/mac/Documents/gitee_dir/django_web/main.py“, line 13, in <module> django.setup() File “/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/site-packages/django/init.py”, line 24, in setup apps.populate(settings.INSTALLED_APPS) File “/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/site-packages/django/apps/registry.py“, line 91, in populate app_config = AppConfig.create(entry) File “/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/site-packages/django/apps/config.py“, line 212, in create mod = import_module(mod_path) File “/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/importlib/init.py”, line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File “<frozen importlib._bootstrap>”, line 1014, in _gcd_import File “<frozen importlib._bootstrap>”, line 991, in _find_and_load File “<frozen importlib._bootstrap>”, line 961, in _find_and_load_unlocked File “<frozen importlib._bootstrap>”, line 219, in _call_with_frames_removed File “<frozen importlib._bootstrap>”, line 1014, in _gcd_import File “<frozen importlib._bootstrap>”, line 991, in _find_and_load File “<frozen importlib._bootstrap>”, line 973, in _find_and_load_unlocked ModuleNotFoundError: No module named ‘RealTimeData’ ”’

Python 图片去除图片水印的问题

Python 图片去除图片水印的问题

代码


def remove_water_footer(path, newPath):
    """
    去除水印
    """
    # https://zhuanlan.zhihu.com/p/138169619
    img=cv2.imread(path,1)
    hight,width,depth=img.shape[0:3]
    height = hight

    #截取
    # cropped = img[int(hight*0.8):hight, int(width*0.7):width]  # 裁剪坐标为[y0:y1, x0:x1]
    #cropped = cropped_img(img,
    #height=height,
    #width=width)
    cropped_size = cropped_img_size(
    height=height,
    width=width)
    cropped = img[cropped_size[0][0]: cropped_size[0][1], cropped_size[1][0]: cropped_size[1][1]]
    cv2.imwrite(newPath, cropped)
    imgSY = cv2.imread(newPath,1)

    #图片二值化处理,把[200,200,200]-[250,250,250]以外的颜色变成 0
    # thresh = cv2.inRange(imgSY,np.array([200,200,200]),np.array([250,250,250]))
    thresh = cv2.inRange(imgSY,np.array([24, 43, 48]),np.array([160,180,190]))
    #创建形状和尺寸的结构元素
    kernel = np.ones((3,3),np.uint8)
    #扩展待修复区域
    hi_mask = cv2.dilate(thresh,kernel,iterations=10)
    specular = cv2.inpaint(imgSY,hi_mask,5,flags=cv2.INPAINT_TELEA)
    cv2.imwrite(newPath, specular)

    #覆盖图片
    imgSY = Image.open(newPath)
    img = Image.open(path)
    # img.paste(imgSY, (int(width*0.7),int(hight*0.8),width,hight))
    img.paste(imgSY, (cropped_size[1][0],cropped_size[0][0],cropped_size[1][1],cropped_size[0][1]))
    img.save(newPath)
    logger.info("去除水印: `{}` => `{}`".format(path, newPath))

我在网上搜的,但是这个样子会留下背景版,如果吧整个水印都删除呢,

也就是指定区域的部分都删除,这种效果该怎么做呢?

有没有人觉得 Python Flask 写后端很难用?

有没有人觉得 Python Flask 写后端很难用?

  • 自我感觉 python 越用越难用,动态类型提示*其的不友好
  • flask 集成 sqlalchemy 想要返回 JSON 返回内容还需要通过 marshmallow 等把 python 对象转换
  • 如果想要使用登录管理集成 flask_login 等
  • 这样就会出现项目中存在多个模型定义文件
  • 再说 sqlalchemy 本身就挺复杂,然后类型提示大部分都没用,想不起来时候只能查文档,非常繁琐
  • 还有 flaks 本身导入通过一个全局 app 控制,这样进行项目分块时候*其不友好,有蓝图也一样,对比 dotnent 和 java 自识别,flask 需要手动注册就很麻烦了
  • 然后我总结一句就是,动态语言一时爽,过一段时间自己都不知道这个变量会产生什么结果类型

如何把 Java properties 转换为具有层级结构的字典

如何把 Java properties 转换为具有层级结构的字典

java.class.version = 60.0
java.home = /usr/lib/jvm/java-16-openjdk
java.runtime.name = OpenJDK Runtime Environment
java.runtime.version = 16.0.2+7
java.specification.name = Java Platform API Specification
java.specification.vendor = Oracle Corporation
java.specification.version = 16
java.vendor = N/A
java.vendor.url = https://openjdk.java.net/
java.vendor.url = https://openjdk.java.net/
java.vendor.url.bug = https://bugreport.java.com/bugreport/
java.vendor.url.bug = https://bugreport.java.com/bugreport/
java.vendor.url.bug = https://bugreport.java.com/bugreport/
java.version = 16.0.2
java.version.date = 2021-07-20
java.vm.name = OpenJDK 64-Bit Server VM
java.vm.specification.name = Java Virtual Machine Specification
java.vm.specification.vendor = Oracle Corporation
java.vm.specification.version = 16
java.vm.vendor = Oracle Corporation
java.vm.version = 16.0.2+7
sun.arch.data.model = 64

我用 javaproperties 模块把上面内容转换成了字典:

{'java.class.version': '60.0',
 'java.home': '/usr/lib/jvm/java-16-openjdk',
 'java.runtime.name': 'OpenJDK Runtime Environment',
 'java.runtime.version': '16.0.2+7',
 'java.specification.name': 'Java Platform API Specification',
 'java.specification.vendor': 'Oracle Corporation',
 'java.specification.version': '16',
 'java.vendor': 'N/A',
 'java.vendor.url': 'https://openjdk.java.net/',
 'java.vendor.url.bug': 'https://bugreport.java.com/bugreport/',
 'java.version': '16.0.2',
 'java.version.date': '2021-07-20',
 'java.vm.name': 'OpenJDK 64-Bit Server VM',
 'java.vm.specification.name': 'Java Virtual Machine Specification',
 'java.vm.specification.vendor': 'Oracle Corporation',
 'java.vm.specification.version': '16',
 'java.vm.vendor': 'Oracle Corporation',
 'java.vm.version': '16.0.2+7',
 'sun.arch.data.model': '64'}

但是我想根据这些 properties 的键中相同的部分,把它转换成具有层级结构的字典,类似于:

{
    'java': {
        'class': {
            'version': 60.0
        },
        'home': '/usr/lib/jvm/java-16-openjdk',
        'runtime': {
            'name': 'OpenJDK Runtime Environment',
            'version': '16.0.2+7'
        },
        'specification': {
            'name': 'Java Platform API Specification',
            'vendor': 'Oracle Corporation',
            'verison': 16
        },
        ...: ...  # 省略剩余的内容
    },
    'sun': {
        'arch': {
            'data': {
                'model': 64
            }
        }
    }
}

有没有第三方库方便进行转换?或者如果自己造轮子,提供一个思路?

requests 的 post 中的 data 如何按顺序进行封装?

requests 的 post 中的 data 如何按顺序进行封装?

假设 data 如下 data={

a = ’11’,

b = ’22’,

c = 某个变量,

d = 另一个变量,

e = ’33’

} 然后我 requests.post 理论来说 他 data 的顺序应该是 a=11&b=22…..依次按顺序,但是我测试抓包发现,他顺序是乱的,特别是变量,他可能会封装成 a=11&c=某个变量&d=另一个变量值&b=22….. 我想让他就按照从上往下的顺序进行封装起来,百度了下也没人问这类的问题,请问有解吗?

Pycharm 使用 Anaconda 解释器,每次都 indexing

Pycharm 使用 Anaconda 解释器,每次都 indexing

如题,安装 Anaconda,每次启动 Pycharm 都会 indexing Python SDK (耗费 3 到 4 分钟) (我的 Base 环境是 Python3.8 ),google 百度搜了一通,发现都是说怎么 exclude project files,可是这是 Python SDK 的 index,exclude 之后就没得代码提示了,有没有解决方案,难道 JB 对于 Anaconda 的环境没有索引缓存吗?每次都要重新索引?

Python 不同程序 time 时间差异问题

Python 不同程序 time 时间差异问题

场景:现在有两个程序,一个程序的运行需要依靠另一个程序的运算结果方可正常运行,如果集成到一个程序中,将造成代码臃肿、维护麻烦等一系列问题。两个程序均与时间有紧密的关系,精确度需要到毫秒级别(排除 time 本身的误差),现在*个程序运算后得出一个时间,此时间作为第二个程序的输入。两个程序均设置 windll.winmm.timeBeginPeriod(1)。两个程序均使用 pyinstaller 打包。

疑问:其实这个问题从某个角度来说就是看 time 模块每次调用的时候是不是调用的 windows 系统时间。个人拙见!

问题:这种情况下,在同一台电脑上两个程序的时间能够达到毫秒级别精度同步,有哪位技术大牛能否给予技术解答,万分感谢。

在 Python 中如何放置一个钩子劫持接下来发生的标准输出?

在 Python 中如何放置一个钩子劫持接下来发生的标准输出?

如题,假设在 a.py 里有一段 print 代码

# a.py
print("hello everyone, this is a.py")

假设我们在不修改 a.py 的情况下,可否在其他文件中通过劫持标准输出的方式修改这段内容的输出?

比如我们期望的使用环境是在b.py中导入a.py

# b.py
# 首先劫持标准输出
do something

# 然后导入 a.py
import a

# 期望得到定制化的输出
# 比如
# 打印 this is a.py at 2021-08-08 12:12:12 (删除前面的 hello everyone,之后再添加时间)

《 Python 进阶》2021 更新版发布

《 Python 进阶》2021 更新版发布,欢迎大家提出意见或表示支持

自 2016 年《 Python 进阶》中文版*次发布以来,已经 5 年了,本书的 github repo 收到了 5800+赞,非常感谢社区对我们的认可,也说明了用心的做精品,好作品自己会说话。

这几年译者团队忙于各奔前程,有一两年没怎么更新了,*近看到 github repo 每天的 PV 还维持在平均 150 左右,还是说明能帮助到一些人的(还不算其他国内镜像托管版本的阅读量,如*客学院,PythonTab 等)。

所以,老苏我决定把此书再做了一次大的修订,希望能作为一部 Python 参考的经典,随时能帮到国内的 Python 程序员们,主要更新如下:

  1. 同步原著的全新目录结构,对比之前零散的章节,现在基于分类的目录,会更便于查找。
  2. 基于 V2EX 网友(@nightv2)提出的对阅读体验的建议,把每个章节里的小节合并在一个文件里,然后使用文件内的导航进行小节跳转。
  3. 针对英文原著的新内容和修复,做了同步。
  4. 放弃使用 GitBook 服务,因为 2020 年 GitBook 已经改变了商业模式,不再支持独立托管,很多国内镜像已经长久得不到更新同步,不利于开源社区的分享传播。
  5. 改用 GithubPages 服务,可以直接使用 Jekyll 生成静态网站,方便大家的本地部署或者托管。目前官方版本部署在https://py.eastlakeside.cn,会实时自动更新。
  6. 使用了全新的主题,目录导航和顶栏搜索带来非常流畅丝滑的阅读体验。
  7. 后续考虑增加国内 Python 社区网友建议的实用的主题,把《 Python 进阶》做成实战性很强的适应国内互联网发展的宝典。