Skip to content

Commit 794bdd8

Browse files
author
coolrc136
committed
🐛 修复linux下图片黑线的问题
1 parent b9b288e commit 794bdd8

File tree

4 files changed

+59
-53
lines changed

4 files changed

+59
-53
lines changed

browser.py

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,33 @@
1616

1717
from selenium import webdriver
1818
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
19-
from selenium.webdriver.firefox.options import Options
19+
from selenium.webdriver.chrome.options import Options
2020

2121

2222
def new_web_driver(
2323
http_proxy=None, socks5_proxy=None, socks_username=None, socks_password=None
24-
) -> webdriver.Firefox:
25-
ffoptions = Options()
26-
ffoptions.add_argument("--headless") #
27-
ffoptions.add_argument("window-size=2560,1440")
28-
if http_proxy is not None:
29-
webdriver.DesiredCapabilities.FIREFOX["proxy"] = {
30-
"httpProxy": http_proxy,
31-
"sslProxy": http_proxy,
32-
"proxyType": "MANUAL",
33-
}
34-
return webdriver.Firefox(options=ffoptions)
35-
if socks5_proxy is not None:
36-
webdriver.DesiredCapabilities.FIREFOX["proxy"] = {
37-
"socks_proxy": socks5_proxy,
38-
"socksUsername": socks_username,
39-
"socksPassword": socks_password,
40-
"proxyType": "MANUAL",
41-
}
42-
return webdriver.Firefox(options=ffoptions)
43-
return webdriver.Firefox(options=ffoptions)
24+
) -> webdriver.Chrome:
25+
chrome_options = Options()
26+
chrome_options.add_argument("--headless") #
27+
chrome_options.add_argument("--disable-gpu")
28+
chrome_options.add_argument("window-size=2560,1440")
29+
# TODO: chrome proxy
30+
# if http_proxy is not None:
31+
# webdriver.DesiredCapabilities.FIREFOX["proxy"] = {
32+
# "httpProxy": http_proxy,
33+
# "sslProxy": http_proxy,
34+
# "proxyType": "MANUAL",
35+
# }
36+
# return webdriver.Chrome(options=chrome_options)
37+
# if socks5_proxy is not None:
38+
# webdriver.DesiredCapabilities.FIREFOX["proxy"] = {
39+
# "socks_proxy": socks5_proxy,
40+
# "socksUsername": socks_username,
41+
# "socksPassword": socks_password,
42+
# "proxyType": "MANUAL",
43+
# }
44+
# return webdriver.Firefox(options=ffoptions)
45+
return webdriver.Chrome(options=chrome_options)
4446

4547

4648
def new_remote_web_driver(url: str):

dockerfile

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
FROM python:3.9-alpine
22

33
WORKDIR /usr/src/app
4-
ENV gecko_version=v0.29.1
54

6-
RUN wget https://ghproxy.com/https://github.com/mozilla/geckodriver/releases/download/${gecko_version}/geckodriver-${gecko_version}-linux64.tar.gz \
7-
&& tar -x geckodriver -zf geckodriver-${gecko_version}-linux64.tar.gz -O > /usr/bin/geckodriver \
8-
&& chmod +x /usr/bin/geckodriver \
9-
&& rm geckodriver-${gecko_version}-linux64.tar.gz
10-
11-
RUN apk add --no-cache firefox
5+
RUN apk add --no-cache chromium-chromedriver chromium
126

137
COPY requirements.txt ./
148
RUN pip install --no-cache-dir -r requirements.txt

main.py

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -36,34 +36,29 @@ def hello_world():
3636
@app.route("/raysopic", methods=["GET"])
3737
def capture_rayso_pic():
3838
content = request_parse(request)
39+
args = {
40+
"content": content.get("content"),
41+
"font": content.get("font"),
42+
"padding": parse_float(content.get("padding")),
43+
"title": content.get("title"),
44+
"size": parse_float(content.get("size")),
45+
}
3946

40-
try:
41-
args = {
42-
"content": content.get("content"),
43-
"font": content.get("font"),
44-
"padding": parse_float(content.get("padding")),
45-
"title": content.get("title"),
46-
"size": parse_float(content.get("size")),
47-
}
48-
49-
for k in list(args.keys()):
50-
if args[k] is None:
51-
del args[k]
52-
53-
if not args["content"]:
54-
return {"ok": 400, "msg": "no content!", "data": None}
47+
for k in list(args.keys()):
48+
if args[k] is None:
49+
del args[k]
5550

56-
args["content"] = base64.b64decode(args["content"]).decode("utf-8")
51+
if not args["content"]:
52+
return {"ok": 400, "msg": "no content!", "data": None}
5753

58-
print(args["content"] + "\n")
54+
args["content"] = base64.b64decode(args["content"]).decode("utf-8")
5955

60-
global rayso
56+
print(args["content"] + "\n")
6157

62-
rayso.capture_img(**args)
63-
return send_from_directory("./", "test.png")
58+
global rayso
6459

65-
except Exception as e:
66-
return {"ok": 500, "msg": format(e), "data": None}
60+
rayso.capture_img(**args)
61+
return send_from_directory("./", "screenshot.png")
6762

6863

6964
@app.route("/rayso", methods=["POST", "GET"])
@@ -103,10 +98,10 @@ def on_exit_app(): # 由于quit() 执行有问题,所以退出时候直接杀
10398
sys = platform.system()
10499
if sys == "Windows":
105100
command = "taskkill /F /T /IM "
106-
command = command + "firefox.exe"
101+
command = command + "chromium-browser.exe"
107102
os.system(command) # nosec
108103
else:
109-
command = "pkill geckodriver && pkill firefox"
104+
command = "pkill chromedriver && pkill chromium-browser"
110105
os.system(command) # nosec
111106

112107

rayso.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
import unittest
1919
import threading
2020

21+
from selenium.webdriver.common.by import By
22+
from selenium.webdriver.support.wait import WebDriverWait
23+
from selenium.webdriver.support import expected_conditions as EC
24+
2125
from browser import new_web_driver
2226

2327
# from browser import new_remote_web_driver
@@ -80,7 +84,7 @@ def capture_img(self, content, font="Fira code", padding=26, title="", size=1):
8084

8185
box = self.webdriver.find_element_by_xpath('//*[@id="frame"]')
8286
self.lock.release()
83-
return box.screenshot("test.png")
87+
return box.screenshot("screenshot.png")
8488

8589
def set_content(self, content: str):
8690
lock = threading.Lock()
@@ -90,6 +94,17 @@ def set_content(self, content: str):
9094
"""
9195
ActionChains(self.webdriver).send_keys("r").perform() # 随机更换主题
9296

97+
# Chrome需要激活textarea才能开始输入
98+
textarea = WebDriverWait(self.webdriver, 10).until(
99+
EC.element_to_be_clickable(
100+
(
101+
By.CSS_SELECTOR,
102+
"#frame > div.app-frame-container > div.app-frame > div.vue-codemirror.code-editor > div",
103+
)
104+
)
105+
)
106+
textarea.click()
107+
93108
textarea = self.webdriver.find_element_by_css_selector(
94109
".CodeMirror > div > textarea"
95110
)

0 commit comments

Comments
 (0)