ZHZ1024 commited on
Commit
9af4e87
·
verified ·
1 Parent(s): 3b234f0

Upload 8 files

Browse files
Files changed (8) hide show
  1. Dockerfile +17 -0
  2. Wright.py +412 -0
  3. api.py +108 -0
  4. auth.json +1 -0
  5. error-comment.png +0 -0
  6. error_screenshot.png +0 -0
  7. requirements.txt +11 -0
  8. ww_submission_error.png +0 -0
Dockerfile ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 使用官方Python镜像作为基础镜像
2
+ FROM python:3.10-slim
3
+
4
+ # 设置工作目录
5
+ WORKDIR /app
6
+
7
+ # 复制当前目录内容到容器中
8
+ COPY . /app
9
+
10
+ # 安装依赖
11
+ RUN pip install --no-cache-dir -r requirements.txt
12
+ RUN python -m playwright install
13
+ # 暴露端口
14
+ EXPOSE 8000
15
+
16
+ # 运行应用
17
+ CMD ["uvicorn", "api:app", "--host", "0.0.0.0", "--port", "8000"]
Wright.py ADDED
@@ -0,0 +1,412 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from playwright.sync_api import sync_playwright
2
+ import time
3
+ from typing import Optional
4
+ import asyncio
5
+ from sympy import false
6
+ from win32gui import FlashWindowEx
7
+ import json
8
+ import requests
9
+ import os
10
+ def automate_cwall_login(
11
+ username: str,
12
+ password: str,
13
+ headless: bool = False,
14
+ timeout: int = 30000,
15
+ keep_open: bool = False
16
+ ):
17
+ """
18
+ 自动化登录cwall网站的函数
19
+
20
+ 参数:
21
+ username (str): 用户名
22
+ password (str): 密码
23
+ headless (bool): 是否无头模式,默认显示浏览器
24
+ timeout (int): 超时时间(毫秒),默认30秒
25
+ keep_open (bool): 完成后是否保持浏览器打开
26
+ """
27
+ with sync_playwright() as p:
28
+ browser = p.chromium.launch(headless=headless)
29
+ context = browser.new_context()
30
+ page = context.new_page()
31
+
32
+ try:
33
+ # 设置默认超时
34
+ page.set_default_timeout(timeout)
35
+
36
+ print("正在导航到登录页面...")
37
+ page.goto("https://cwall.czoffice.top/login.php", wait_until="networkidle")
38
+
39
+ # 输入凭据
40
+ print("正在输入用户名和密码...")
41
+ page.fill("xpath=/html/body/div[2]/form/div[1]/input", username)
42
+ page.fill("xpath=/html/body/div[2]/form/div[2]/input", password)
43
+
44
+ # 点击登录
45
+ print("正在提交登录表单...")
46
+ page.click("xpath=/html/body/div[2]/form/input[@type='submit']")
47
+
48
+ # 等待登录完成
49
+ print("等待登录完成...")
50
+ try:
51
+ # 尝试检测登录成功元素
52
+ page.wait_for_selector("xpath=//*[contains(text(),'欢迎') or contains(text(),'Dashboard')]", timeout=5000)
53
+ print("登录成功!")
54
+ except:
55
+ print("未检测到欢迎信息,但可能已登录成功")
56
+
57
+ if keep_open:
58
+ print(f"浏览器将保持打开,按Ctrl+C终止程序...")
59
+ while True:
60
+ time.sleep(1)
61
+ context.storage_state(path="auth.json")
62
+
63
+ return True
64
+
65
+ except Exception as e:
66
+ print(f"自动化过程中发生错误: {str(e)}")
67
+ # 出错时截图保存
68
+ page.screenshot(path="error_screenshot.png")
69
+ print("已保存错误截图: error_screenshot.png")
70
+ return False
71
+
72
+ finally:
73
+ if not keep_open:
74
+ browser.close()
75
+
76
+
77
+ def cwall_ww_sub(
78
+ info: str,
79
+ kind: str,
80
+ kind_enable: bool = False,
81
+ image_update_enable: bool = False,
82
+ image: Optional[str] = None,
83
+ headless: bool = False,
84
+ timeout: int = 30000,
85
+ keep_open: bool = False
86
+ ) -> bool:
87
+ """
88
+ Cwall WW自动发送参数
89
+
90
+ 参数:
91
+ info (str): 发送内容
92
+ kind_enable (bool): 是否启用分类
93
+ kind (str): 分类(只支持一个)
94
+ image_update_enable (bool): 是否启用图片上传
95
+ image (str): 图片路径
96
+ headless (bool): 是否无头模式,默认显示浏览器
97
+ timeout (int): 超时时间(毫秒),默认30秒
98
+ keep_open (bool): 完成后是否保持浏览器打开
99
+ """
100
+ with sync_playwright() as p:
101
+ browser = p.chromium.launch(headless=headless)
102
+
103
+ context = browser.new_context(storage_state="auth.json")
104
+ page = context.new_page()
105
+
106
+ try:
107
+ page.set_default_timeout(timeout)
108
+
109
+ print("正在导航ww页面...")
110
+ page.goto("https://cwall.czoffice.top/ww/", wait_until="networkidle")
111
+
112
+ # 输入内容
113
+ print("正在输入ww内容...")
114
+ page.fill("xpath=/html/body/div[3]/textarea", info)
115
+
116
+ # 处理分类
117
+ if kind_enable:
118
+ print(f"正在设置分类: {kind}")
119
+ page.fill("xpath=/html/body/div[3]/input", kind)
120
+ page.press("xpath=/html/body/div[3]/input", "Enter")
121
+
122
+ # 处理图片上传
123
+ if image_update_enable and image:
124
+ print(f"正在上传图片: {image}")
125
+ # 先触发文件选择对话框的打开(如点击上传按钮)
126
+ # page.click("xpath=/html/body/div[3]/button[1]")
127
+ #
128
+ # # 然后等待文件输入框出现并上传
129
+ # with page.expect_file_chooser() as fc:
130
+ # page.click("text=打开(O)") # 触发文件选择器的元素
131
+ # file_chooser = fc.value
132
+ # file_chooser.set_files(image)
133
+ with page.expect_file_chooser() as fc_info:
134
+ page.get_by_role("button", name="上传图片").click()
135
+ file_chooser = fc_info.value
136
+ file_chooser.set_files(image)
137
+
138
+ # 提交表单
139
+ print("正在提交内容...")
140
+ page.click("xpath=/html/body/div[3]/button[2]")
141
+ time.sleep(3)
142
+ # 等待提交完成
143
+ # page.wait_for_selector("text=提交成功", timeout=15000)
144
+ # print("提交成功!")
145
+
146
+ if keep_open:
147
+ print("浏览器将保持打开,按Ctrl+C退出...")
148
+ while True:
149
+ time.sleep(1)
150
+
151
+ return True
152
+
153
+ except Exception as e:
154
+ print(f"操作失败: {str(e)}")
155
+ page.screenshot(path="ww_submission_error.png")
156
+ print("错误截图已保存为 ww_submission_error.png")
157
+ return False
158
+
159
+ finally:
160
+ if not keep_open:
161
+ browser.close()
162
+
163
+
164
+ def Get_PHPSESSID(
165
+ username: str,
166
+ password: str,
167
+ headless: bool = False,
168
+ timeout: int = 30000,
169
+ keep_open: bool = False
170
+ ):
171
+ """
172
+ 自动化获得PHPSESSID的函数
173
+
174
+ 参数:
175
+ username (str): 用户名
176
+ password (str): 密码
177
+ headless (bool): 是否无头模式,默认显示浏览器
178
+ timeout (int): 超时时间(毫秒),默认30秒
179
+ keep_open (bool): 完成后是否保持浏览器打开
180
+ """
181
+ with sync_playwright() as p:
182
+ browser = p.chromium.launch(headless=headless)
183
+ context = browser.new_context()
184
+ page = context.new_page()
185
+
186
+ try:
187
+ # 设置默认超时
188
+ page.set_default_timeout(timeout)
189
+
190
+ print("正在导航到登录页面...")
191
+ page.goto("https://cwall.czoffice.top/login.php", wait_until="networkidle")
192
+
193
+ # 输入凭据
194
+ print("正在输入用户名和密码...")
195
+ page.fill("xpath=/html/body/div[2]/form/div[1]/input", username)
196
+ page.fill("xpath=/html/body/div[2]/form/div[2]/input", password)
197
+
198
+ # 点击登录
199
+ print("正在提交登录表单...")
200
+ page.click("xpath=/html/body/div[2]/form/input[@type='submit']")
201
+
202
+ # 等待登录完成
203
+ print("等待登录完成...")
204
+ try:
205
+ # 尝试检测登录成功元素
206
+ page.wait_for_selector("xpath=//*[contains(text(),'欢迎') or contains(text(),'Dashboard')]",
207
+ timeout=5000)
208
+ print("登录成功!")
209
+ except:
210
+ print("未检测到欢迎信息,但可能已登录成功")
211
+
212
+ if keep_open:
213
+ print(f"浏览器将保持打开,按Ctrl+C终止程序...")
214
+ while True:
215
+ time.sleep(1)
216
+ context.storage_state(path="auth.json")
217
+ # 读取auth.json文件
218
+ with open('auth.json', 'r', encoding='utf-8') as file:
219
+ data = json.load(file)
220
+
221
+ # 提取PHPSESSID
222
+ phpsessid = None
223
+ for cookie in data['cookies']:
224
+ if cookie['name'] == 'PHPSESSID':
225
+ phpsessid = cookie['value']
226
+ break
227
+
228
+ if phpsessid:
229
+ print("提取到的PHPSESSID是:", phpsessid)
230
+ else:
231
+ print("未找到PHPSESSID")
232
+ return True
233
+
234
+
235
+ except Exception as e:
236
+ print(f"自动化过程中发生错误: {str(e)}")
237
+ # 出错时截图保存
238
+ page.screenshot(path="error_screenshot.png")
239
+ print("已保存错误截图: error_screenshot.png")
240
+ return False
241
+
242
+ finally:
243
+ if not keep_open:
244
+ browser.close()
245
+ def get_cwall_ww_info(
246
+ page: str = "1"
247
+ ):
248
+ """
249
+ 自动化解析Cwall ww内容
250
+
251
+ 参数:
252
+ page (str): 页码
253
+ 返回:
254
+ list: 包含所有ww信息的列表,每个元素是一个字典
255
+ """
256
+ result = []
257
+ #请求Cwall API
258
+ response = requests.get("https://cwall.czoffice.top/ww/fetch_contents.php?page="+page)
259
+ # 将响应内容解析为 Python 字典
260
+ if response.status_code == 200:
261
+ data_dict = response.json()
262
+
263
+ # 检查请求是否成功
264
+ if data_dict.get('success'):
265
+ # 遍历 data 列表
266
+ for item in data_dict.get('data', []):
267
+ result.append({
268
+ "ID": item.get('id'),
269
+ "UserID": item.get('user_id'),
270
+ "用户名": item.get('username'),
271
+ "内容": item.get('content'),
272
+ "发布时间": item.get('publish_time'),
273
+ "点赞数": item.get('like'),
274
+ "图片列表": item.get('images')
275
+ })
276
+ return result
277
+ else:
278
+ print("请求失���")
279
+ return None
280
+ else:
281
+ print(f"请求失败,状态码: {response.status_code}")
282
+ return None
283
+ def clear_auth():
284
+ if os.path.exists("auth.json"):
285
+ os.remove("auth.json")
286
+ print("auth.json已删除")
287
+ else:
288
+ print("auth.json不存在")
289
+ def ww_like(
290
+ post_id: str,
291
+ headless: bool = False,
292
+ timeout: int = 30000,
293
+ keep_open: bool = False
294
+ ):
295
+ """
296
+ 自动化ww点赞/取消
297
+
298
+ 参数:
299
+ Post_id(str): ww的ID
300
+ headless (bool): 是否无头模式,默认显示浏览器
301
+ timeout (int): 超时时间(毫秒),默认30秒
302
+ keep_open (bool): 完成后是否保持浏览器打开
303
+ """
304
+ with sync_playwright() as p:
305
+ browser = p.chromium.launch(headless=headless)
306
+ context = browser.new_context(storage_state="auth.json")
307
+ page = context.new_page()
308
+ try:
309
+ page.set_default_timeout(timeout)
310
+ print("正在导航ww页面...")
311
+ page.goto("https://cwall.czoffice.top/ww/detail.php?id="+post_id)
312
+
313
+ #点击点赞按钮
314
+ print("正在点赞")
315
+ page.click("xpath=/html/body/div/div[1]/button[1]")
316
+ time.sleep(1)
317
+ if keep_open:
318
+ print(f"浏览器将保持打开,按Ctrl+C终止程序...")
319
+ while True:
320
+ time.sleep(1)
321
+ return True
322
+ except Exception as e:
323
+ print("自动化过程出现错误")
324
+ page.screenshot(path="error-like.png")
325
+ print("已保存错误截图:error-like.png")
326
+ return False
327
+ finally:
328
+ if not keep_open:
329
+ browser.close()
330
+ def ww_Comment(
331
+ info: str,
332
+ post_id: str,
333
+ headless: bool = False,
334
+ timeout: int = 30000,
335
+ keep_open: bool = False
336
+ ):
337
+ """
338
+ 自动化ww评论
339
+ 参数:
340
+ info(str): 评论内容
341
+ Post_id(str): ww的ID
342
+ headless (bool): 是否无头模式,默认显示浏览器
343
+ timeout (int): 超时时间(毫秒),默认30秒
344
+ keep_open (bool): 完成后是否保持浏览器打开
345
+ """
346
+ with sync_playwright() as p:
347
+ browser = p.chromium.launch(headless=headless)
348
+ context = browser.new_context(storage_state="auth.json")
349
+ page = context.new_page()
350
+ try:
351
+ page.set_default_timeout(timeout)
352
+ print("正在导航ww页面...")
353
+ page.goto("https://cwall.czoffice.top/ww/detail.php?id=" + post_id)
354
+ # 输入
355
+ page.fill("xpath=/html/body/div/form/textarea",info)
356
+ #提交
357
+ page.click("xpath=/html/body/div/form/button")
358
+ if keep_open:
359
+ print(f"浏览器将保持打开,按Ctrl+C终止程序...")
360
+ while True:
361
+ time.sleep(1)
362
+ return True
363
+ except Exception as e:
364
+ print("自动化过程出现错误")
365
+ page.screenshot(path="error-comment.png")
366
+ print("已保存错误截图:error-comment.png")
367
+ return False
368
+ finally:
369
+ if not keep_open:
370
+ browser.close()
371
+
372
+
373
+ # 使用示例
374
+ if __name__ == "__main__":
375
+ # # 基本用法
376
+ # automate_cwall_login(
377
+ # username="一只fish (づ ●─● )づ",
378
+ # password="zy842530",
379
+ # headless=False
380
+ # )
381
+ # cwall_ww_sub(
382
+ # info="Xes什么私人UI,这个C拉的比面条还长", # 必需
383
+ # kind="Open Cwall API", # 必需
384
+ # kind_enable=True,
385
+ # image_update_enable=True,
386
+ # image="C://Users/张雨.WIN-KF4D01O81O2/desktop/屏幕截图 2025-05-17 185324.png", # 可选
387
+ # headless=True,
388
+ # keep_open=False
389
+ # )
390
+
391
+ # 高级用法 - 保持浏览器打开
392
+ # automate_cwall_login(
393
+ # username="testuser",
394
+ # password="testpass",
395
+ # keep_open=True
396
+ # )
397
+ # get_cwall_ww_info(
398
+ # page= "1"
399
+ # )
400
+ # clear_auth()
401
+ # ww_like(
402
+ # post_id="3432",
403
+ # keep_open = True,
404
+ # timeout=30000,
405
+ # )
406
+ ww_Comment(
407
+ info="OpenCwallAPI评论测试", # 必需
408
+ post_id="3438", # 必需
409
+ headless=False,
410
+ keep_open=False,
411
+ timeout=30000,
412
+ )
api.py ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # api.py
2
+ from fastapi import FastAPI, HTTPException
3
+ from typing import Optional
4
+ from fastapi.middleware.cors import CORSMiddleware
5
+ from Wright import automate_cwall_login, cwall_ww_sub, Get_PHPSESSID, get_cwall_ww_info, clear_auth, ww_like, ww_Comment
6
+
7
+ app = FastAPI()
8
+
9
+ # 添加CORS中间件
10
+ app.add_middleware(
11
+ CORSMiddleware,
12
+ allow_origins=["*"],
13
+ allow_credentials=True,
14
+ allow_methods=["*"],
15
+ allow_headers=["*"],
16
+ )
17
+
18
+ @app.post("/automate_cwall_login")
19
+ def api_automate_cwall_login(
20
+ username: str,
21
+ password: str,
22
+ headless: bool = False,
23
+ timeout: int = 30000,
24
+ keep_open: bool = False
25
+ ):
26
+ try:
27
+ result = automate_cwall_login(username, password, headless, timeout, keep_open)
28
+ return {"success": result}
29
+ except Exception as e:
30
+ raise HTTPException(status_code=500, detail=str(e))
31
+
32
+ @app.post("/cwall_ww_sub")
33
+ def api_cwall_ww_sub(
34
+ info: str,
35
+ kind: str,
36
+ image: str,
37
+ image_update_enable: bool = False,
38
+ kind_enable: bool = False,
39
+ headless: bool = False,
40
+ timeout: int = 30000,
41
+ keep_open: bool = False
42
+ ):
43
+ try:
44
+ result = cwall_ww_sub(info, kind, kind_enable, headless=headless, timeout=timeout, keep_open=keep_open, image=image, image_update_enable=image_update_enable)
45
+ return {"success": result}
46
+ except Exception as e:
47
+ raise HTTPException(status_code=500, detail=str(e))
48
+
49
+ @app.post("/Get_PHPSESSID")
50
+ def api_Get_PHPSESSID(
51
+ username: str,
52
+ password: str,
53
+ headless: bool = False,
54
+ timeout: int = 30000,
55
+ keep_open: bool = False
56
+ ):
57
+ try:
58
+ result = Get_PHPSESSID(username, password, headless, timeout, keep_open)
59
+ return {"success": result}
60
+ except Exception as e:
61
+ raise HTTPException(status_code=500, detail=str(e))
62
+
63
+ @app.post("/get_cwall_ww_info")
64
+ def api_get_cwall_ww_info(page: str = "1"):
65
+ try:
66
+ result = get_cwall_ww_info(page)
67
+ return {"success": True, "data": result}
68
+ except Exception as e:
69
+ raise HTTPException(status_code=500, detail=str(e))
70
+
71
+ @app.post("/clear_auth")
72
+ def api_clear_auth():
73
+ try:
74
+ clear_auth()
75
+ return {"success": True}
76
+ except Exception as e:
77
+ raise HTTPException(status_code=500, detail=str(e))
78
+
79
+ @app.post("/ww_like")
80
+ def api_ww_like(
81
+ post_id: str,
82
+ headless: bool = False,
83
+ timeout: int = 30000,
84
+ keep_open: bool = False
85
+ ):
86
+ try:
87
+ result = ww_like(post_id, headless, timeout, keep_open)
88
+ return {"success": result}
89
+ except Exception as e:
90
+ raise HTTPException(status_code=500, detail=str(e))
91
+
92
+ @app.post("/ww_Comment")
93
+ def api_ww_Comment(
94
+ info: str,
95
+ post_id: str,
96
+ headless: bool = False,
97
+ timeout: int = 30000,
98
+ keep_open: bool = False
99
+ ):
100
+ try:
101
+ result = ww_Comment(info, post_id, headless, timeout, keep_open)
102
+ return {"success": result}
103
+ except Exception as e:
104
+ raise HTTPException(status_code=500, detail=str(e))
105
+
106
+ if __name__ == "__main__":
107
+ import uvicorn
108
+ uvicorn.run(app, host="0.0.0.0", port=8000)
auth.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"cookies": [{"name": "PHPSESSID", "value": "6ep38m4v7lbgbvksgjndjvipdu", "domain": "cwall.czoffice.top", "path": "/", "expires": 1783252397.768407, "httpOnly": false, "secure": false, "sameSite": "Lax"}], "origins": [{"origin": "https://cwall.czoffice.top", "localStorage": [{"name": "searcheng", "value": "[\"https://www.baidu.com/s?ie=utf-8&wd=\"]"}]}]}
error-comment.png ADDED
error_screenshot.png ADDED
requirements.txt ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ fastapi==0.104.1
2
+ uvicorn==0.23.2
3
+ python-multipart==0.0.6
4
+ pydantic==2.4.2
5
+ python-jose==3.3.0
6
+ passlib==1.7.4
7
+ python-dotenv==1.0.0
8
+ aiofiles==23.2.1
9
+ playwright
10
+ sympy
11
+ playwright
ww_submission_error.png ADDED