『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
楼主: qianshi

[技术探讨] 分享一个自部署的查询国家电网电费的API方案

  [复制链接]

3

主题

70

帖子

512

积分

论坛技术达人

积分
512
金钱
432
HASS币
50
发表于 2023-7-13 09:32:44 | 显示全部楼层
本帖最后由 d380025303 于 2023-7-13 09:35 编辑
qianshi 发表于 2023-7-12 19:52
这个有想过,不过我没有这方面需求所以没实现,过两天我实现一下


嗯 不着急, 我自己实现了, 大佬可以参考一下

def run(pw: Playwright, nop: str, nom: int) -> None:
    browser = pw.firefox.launch(headless=True)
    context = browser.new_context(viewport={'width': 1920, 'height': 1080})
    page = context.new_page()

    page.goto("https://www.95598.cn/osgweb/login")
    page.locator(".user").click()
    page.get_by_placeholder("请输入用户名/手机号/邮箱").fill(username)
    page.get_by_placeholder("请输入密码").fill(password)
    page.locator(".code-mask").screenshot(path="yzm.png")
    # el-dropdown-menu__item
    with open("yzm.png", 'rb') as f:
        img_bytes = f.read()
    res = ocr.classification(img_bytes)
    print("图形验证码:", res)

    page.get_by_role("textbox", name="请输入验证码").fill(res)
    page.get_by_role("button", name="登录").click()

    page.get_by_role("button", name="切换用户 ").click()

    count = page.locator(".el-dropdown-menu__item").count()
    print("数量 %s", count)

    output = ""
    if count <= 1:
        number, amount = get_data(page)
        output += f"{number}:{amount}"
    else:
        for i in range(count):
            page.locator(".el-dropdown-menu__item").nth(i).click()
            time.sleep(2)
            page.get_by_role("button", name="切换用户 ").click()
            number, amount = get_data(page)
            output += f"{number}:{amount}"
            if i < count - 1:
                output += ";"
    # 将电费保存到文件
    save_amount_to_file(output)

    page.close()
    context.close()
    browser.close()

def get_data(page):
    while page.locator(".cff8").get_by_text('元').inner_text(timeout=5000)[:-1] == "--":
        time.sleep(1)
    amount = float(page.locator(".cff8").get_by_text('元').inner_text()[:-1])
    user_no = page.get_by_text("用电户号").inner_text()
    number = re.findall(r'\d+', user_no)[0]
    print(f"用户户号:{number}")
    print(f"今日电费:{amount}")
    return number, amount
回复

使用道具 举报

8

主题

870

帖子

5218

积分

论坛元老

Rank: 8Rank: 8

积分
5218
金钱
4348
HASS币
0
发表于 2023-7-13 10:36:36 | 显示全部楼层
厉害,谢谢分享,
回复

使用道具 举报

9

主题

242

帖子

1287

积分

金牌会员

Rank: 6Rank: 6

积分
1287
金钱
1045
HASS币
0
发表于 2023-7-13 13:00:49 | 显示全部楼层
感觉是一个很牛逼的东西,只能期待大佬能稍微细化或者简化了,很想用,但暂时受能力所限,无法使用
回复

使用道具 举报

0

主题

54

帖子

1161

积分

金牌会员

Rank: 6Rank: 6

积分
1161
金钱
1107
HASS币
0
发表于 2023-7-13 14:18:07 | 显示全部楼层
qianshi 发表于 2023-7-12 19:52
这个可以的,技术上不是问题,过两天我实现一下,到时候回复小伙伴

好,非常感谢
回复

使用道具 举报

2

主题

26

帖子

255

积分

论坛分享达人

积分
255
金钱
229
HASS币
0
 楼主| 发表于 2023-7-13 21:36:17 | 显示全部楼层
PerryLayne 发表于 2023-7-13 13:00
感觉是一个很牛逼的东西,只能期待大佬能稍微细化或者简化了,很想用,但暂时受能力所限,无法使用 ...

这个我在重构了,打算做一个命令行界面或者GUI,自动生成配置文件,一键式运行
回复

使用道具 举报

9

主题

242

帖子

1287

积分

金牌会员

Rank: 6Rank: 6

积分
1287
金钱
1045
HASS币
0
发表于 2023-7-14 04:50:30 | 显示全部楼层
qianshi 发表于 2023-7-13 21:36
这个我在重构了,打算做一个命令行界面或者GUI,自动生成配置文件,一键式运行 ...

有技术就是牛,期待。

回复

使用道具 举报

3

主题

60

帖子

330

积分

中级会员

Rank: 3Rank: 3

积分
330
金钱
270
HASS币
0
发表于 2023-7-18 13:03:44 | 显示全部楼层
qianshi 发表于 2023-7-12 20:05
你好,我在我的本地没有遇到你说的这些问题,是不是你本地包的版本不太对呢? ...

应该是,这些都是小问题,简单修改就可以运行了
回复

使用道具 举报

0

主题

13

帖子

185

积分

注册会员

Rank: 2

积分
185
金钱
172
HASS币
0
发表于 2023-7-19 23:06:43 | 显示全部楼层
jjcs 发表于 2023-7-8 22:36
看方法好像是单纯的模拟请求,没套Selenium

还是用 headless 浏览器操作的
Selenium 过时了,Playwright 是微软的,google 的是 Puppeteer,包装 Chromium 等浏览器给测试等场景用。

这个做法跟 sgcc_electricity 那个是一样的。

不过我以前没仔细看,没想到原来国家电网的验证码这么容易……凡事还是要尝试,谢谢楼主
回复

使用道具 举报

0

主题

22

帖子

96

积分

注册会员

Rank: 2

积分
96
金钱
74
HASS币
0
发表于 2023-7-20 09:48:38 | 显示全部楼层
提示模块参数错误:
root@phicomm-t1:~/Baoding-Electricity-Tracker-master# python3 app.py
Traceback (most recent call last):
  File "/root/Baoding-Electricity-Tracker-master/app.py", line 42, in <module>
    schedule.every().day.at(f"{time}").do(run_main)
AttributeError: module 'schedule' has no attribute 'every'
回复

使用道具 举报

175

主题

2967

帖子

7606

积分

超级版主

我就是六神

Rank: 8Rank: 8

积分
7606
金钱
4614
HASS币
398

活跃会员教程狂人灌水之王

QQ
发表于 2023-7-26 14:11:08 | 显示全部楼层
等待 docker 版 然后就可以改造 hacs 了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 04:45 , Processed in 0.106209 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表