Commit 2035c1bf by lei

1

parent 2c4cd242
split_assets/
download/
avatar/
res_assets/
assets/
\ No newline at end of file
...@@ -5,9 +5,25 @@ ...@@ -5,9 +5,25 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="69cbe23c-d853-4b51-b873-06f85f1d3199" name="变更" comment=""> <list default="true" id="69cbe23c-d853-4b51-b873-06f85f1d3199" name="变更" comment="">
<change afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
<change afterPath="$PROJECT_DIR$/custom_oss_upload.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/image_split.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Vmlogin.py" beforeDir="false" afterPath="$PROJECT_DIR$/Vmlogin.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Vmlogin.py" beforeDir="false" afterPath="$PROJECT_DIR$/Vmlogin.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ai_pyppeteer.py" beforeDir="false" afterPath="$PROJECT_DIR$/ai_pyppeteer.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/ai_pyppeteer.py" beforeDir="false" afterPath="$PROJECT_DIR$/ai_pyppeteer.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/download/0f24e1f6-4ba2-42d7-bdf4-852653f30fe4.png" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/download/3969de2a-91ba-469f-9b9e-601213611ee2.png" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/download/ad9d288d-2d40-460f-bf1a-4d4bb2cd7951.png" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/download/c82e5161-dca5-441b-8c39-4f39122e8654.png" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/download/fce61744-34a8-4d8f-b9bc-5db40640c71b.png" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/download_img.py" beforeDir="false" afterPath="$PROJECT_DIR$/download_img.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/gpt.py" beforeDir="false" afterPath="$PROJECT_DIR$/gpt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/res_assets/test_0.jpg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/res_assets/test_1.jpg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/res_assets/test_10.jpg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/res_assets/test_2.jpg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/res_assets/test_3.jpg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/test.py" beforeDir="false" afterPath="$PROJECT_DIR$/test.py" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
...@@ -85,7 +101,7 @@ ...@@ -85,7 +101,7 @@
<option name="INPUT_FILE" value="" /> <option name="INPUT_FILE" value="" />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<configuration name="bit_api" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> <configuration name="custom_oss_upload" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="Img_Ai" /> <module name="Img_Ai" />
<option name="INTERPRETER_OPTIONS" value="" /> <option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" /> <option name="PARENT_ENVS" value="true" />
...@@ -94,10 +110,10 @@ ...@@ -94,10 +110,10 @@
</envs> </envs>
<option name="SDK_HOME" value="" /> <option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="false" /> <option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" /> <option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" /> <option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/bit_api.py" /> <option name="SCRIPT_NAME" value="$PROJECT_DIR$/custom_oss_upload.py" />
<option name="PARAMETERS" value="" /> <option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" /> <option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" /> <option name="EMULATE_TERMINAL" value="false" />
...@@ -106,7 +122,7 @@ ...@@ -106,7 +122,7 @@
<option name="INPUT_FILE" value="" /> <option name="INPUT_FILE" value="" />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<configuration name="download_img" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> <configuration name="image_split" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="Img_Ai" /> <module name="Img_Ai" />
<option name="INTERPRETER_OPTIONS" value="" /> <option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" /> <option name="PARENT_ENVS" value="true" />
...@@ -118,7 +134,7 @@ ...@@ -118,7 +134,7 @@
<option name="IS_MODULE_SDK" value="true" /> <option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" /> <option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" /> <option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/download_img.py" /> <option name="SCRIPT_NAME" value="$PROJECT_DIR$/image_split.py" />
<option name="PARAMETERS" value="" /> <option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" /> <option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" /> <option name="EMULATE_TERMINAL" value="false" />
...@@ -127,19 +143,19 @@ ...@@ -127,19 +143,19 @@
<option name="INPUT_FILE" value="" /> <option name="INPUT_FILE" value="" />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<configuration name="gpt" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> <configuration name="test" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="python-demo" /> <module name="Img_Ai" />
<option name="INTERPRETER_OPTIONS" value="" /> <option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" /> <option name="PARENT_ENVS" value="true" />
<envs> <envs>
<env name="PYTHONUNBUFFERED" value="1" /> <env name="PYTHONUNBUFFERED" value="1" />
</envs> </envs>
<option name="SDK_HOME" value="C:\Users\lei\AppData\Local\Programs\Python\Python38\python.exe" /> <option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="false" /> <option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" /> <option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" /> <option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/gpt.py" /> <option name="SCRIPT_NAME" value="$PROJECT_DIR$/test.py" />
<option name="PARAMETERS" value="" /> <option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" /> <option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" /> <option name="EMULATE_TERMINAL" value="false" />
...@@ -151,10 +167,10 @@ ...@@ -151,10 +167,10 @@
<recent_temporary> <recent_temporary>
<list> <list>
<item itemvalue="Python.ai_pyppeteer" /> <item itemvalue="Python.ai_pyppeteer" />
<item itemvalue="Python.image_split" />
<item itemvalue="Python.custom_oss_upload" />
<item itemvalue="Python.test" />
<item itemvalue="Python.Vmlogin" /> <item itemvalue="Python.Vmlogin" />
<item itemvalue="Python.download_img" />
<item itemvalue="Python.gpt" />
<item itemvalue="Python.bit_api" />
</list> </list>
</recent_temporary> </recent_temporary>
</component> </component>
......
...@@ -73,7 +73,6 @@ class VmLogin: ...@@ -73,7 +73,6 @@ class VmLogin:
url = self.get_local_url(f'/profile/start?profileId={profile_id}') url = self.get_local_url(f'/profile/start?profileId={profile_id}')
text = requests.get(url).json() text = requests.get(url).json()
if text['status'] == 'ERROR': if text['status'] == 'ERROR':
logger.info(text)
return '' return ''
return ('' + text['value']).replace("http://127.0.0.1:", "") return ('' + text['value']).replace("http://127.0.0.1:", "")
......
import requests import requests as req
import pyperclip import pyperclip
import time import time
from loguru import logger from loguru import logger
from bit_api import *
import asyncio import asyncio
from Helper import RedisCon from Helper import RedisCon
import json import json
...@@ -34,17 +33,8 @@ class ToWork: ...@@ -34,17 +33,8 @@ class ToWork:
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Authorization': '' 'Authorization': ''
} }
self.page = ''
# 获取浏览器窗口 self.ws = ''
async def browser(self, browser_id):
"""
:return:
"""
self.browser_id = browser_id
ws = await self.bit_get_ws()
return await pyppeteer.connect({
"browserWSEndpoint": ws
})
# 随机等待 # 随机等待
def random_sleep(self, min, max): def random_sleep(self, min, max):
...@@ -145,10 +135,7 @@ class ToWork: ...@@ -145,10 +135,7 @@ class ToWork:
async def get_policy(self, url): async def get_policy(self, url):
for i in range(5): for i in range(5):
try: try:
proxies = { res = req.get(url)
'http': '192.168.100.139:2009'
}
res = requests.get(url)
data = json.loads(res.text)['data'] data = json.loads(res.text)['data']
return data return data
except Exception as e: except Exception as e:
...@@ -161,7 +148,7 @@ class ToWork: ...@@ -161,7 +148,7 @@ class ToWork:
:param url: :param url:
:return: :return:
""" """
get_file = requests.get(url=url, headers=self.header, stream=True, allow_redirects=False, timeout=10) get_file = req.get(url=url, headers=self.header, stream=True, allow_redirects=False, timeout=10)
file_name = cur_uuid file_name = cur_uuid
if not os.path.exists('./download'): if not os.path.exists('./download'):
os.makedirs('./download') os.makedirs('./download')
...@@ -198,9 +185,7 @@ class ToWork: ...@@ -198,9 +185,7 @@ class ToWork:
'Content-Type': 'multipart/form-data;charset=utf-8' 'Content-Type': 'multipart/form-data;charset=utf-8'
} }
logger.info('阿里云上传') logger.info('阿里云上传')
res = requests.post(url, data=params, headers=header, proxies={ res = req.post(url, data=params, headers=header)
'http': '192.168.100.139:2009'
})
logger.info(res) logger.info(res)
# 上传后的链接为 # 上传后的链接为
upload_img = policy['domain'] + policy['dir'] + cur_uuid upload_img = policy['domain'] + policy['dir'] + cur_uuid
...@@ -230,8 +215,9 @@ class ToWork: ...@@ -230,8 +215,9 @@ class ToWork:
'result_img': href, 'result_img': href,
'user_id': task['user_id'], 'user_id': task['user_id'],
'task_id': task['task_id'], 'task_id': task['task_id'],
'prompt_id': task['prompt_id'],
} }
res = requests.post(url, data=params) res = req.post(url, data=params)
except Exception as e: except Exception as e:
logger.error(e) logger.error(e)
...@@ -332,7 +318,7 @@ class ToWork: ...@@ -332,7 +318,7 @@ class ToWork:
# 获取任务列表 # 获取任务列表
def get_current_tasks(self): def get_current_tasks(self):
if False: if True:
task = RedisCon.get_task(self.key) task = RedisCon.get_task(self.key)
# 当前浏览器需要执行的任务 # 当前浏览器需要执行的任务
cur_tasks = [] cur_tasks = []
...@@ -369,19 +355,22 @@ class ToWork: ...@@ -369,19 +355,22 @@ class ToWork:
return [] return []
async def open_browser(self, browser_item): async def open_browser(self, browser_item):
try: while True:
logger.info(f'浏览器id-{browser_item["num"]},开始执行') try:
vm = VmLogin(self.browser_token) logger.info(f'浏览器id-{browser_item["num"]},开始执行')
proxy = vm.start_chrome(browser_item['id']) vm = VmLogin(self.browser_token)
if not proxy: proxy = vm.start_chrome(browser_item['id'])
logger.info('无法打开浏览器') ws = ''
else: if not proxy and self.ws:
url = f'http://127.0.0.1:{proxy}/json/version' logger.info('ws已存在')
logger.info(url) ws = self.ws
ws = requests.get(url).json() else:
logger.info(ws) url = f'http://127.0.0.1:{proxy}/json/version'
res = req.get(url).json()
ws = res['webSocketDebuggerUrl']
self.ws = res['webSocketDebuggerUrl']
browser = await pyppeteer.connect({ browser = await pyppeteer.connect({
"browserWSEndpoint": ws['webSocketDebuggerUrl'], "browserWSEndpoint": ws,
'args': [ 'args': [
'--window-size=1536,824', '--window-size=1536,824',
'--start-maximized', '--start-maximized',
...@@ -392,34 +381,39 @@ class ToWork: ...@@ -392,34 +381,39 @@ class ToWork:
'--disable-renderer-backgrounding', '--disable-renderer-backgrounding',
] ]
}) })
page = await browser.newPage() if self.page:
logger.info('打开窗口') await self.page.goto('https://discord.com/channels/@me')
await page.goto('https://discord.com/channels/@me') else:
return page page = await browser.newPage()
except Exception as e: self.page = page
logger.error(e) await self.page.goto('https://discord.com/channels/@me')
return False return self.page
except Exception as e:
logger.error(e)
logger.info('浏览器打开失败,正在重试')
# 初始化任务 # 初始化任务
async def on_start(self): async def on_start(self):
# 打开窗口
page = await self.open_browser(self.browser_item)
if not page:
# 浏览器打开失败
logger.error(f'{self.browser_item["num"]},窗口打开失败')
return
else:
logger.info(f'{self.browser_item["num"]},打开窗口')
while True: while True:
# 获取任务 # 获取任务
tasks = self.get_current_tasks() tasks = self.get_current_tasks()
if len(tasks): if len(tasks):
logger.info(f'{self.browser_item["num"]},打开窗口') # 开始执行任务
# 打开窗口 logger.info('开始执行任务')
page = await self.open_browser(self.browser_item) status = await self.run_task(self.browser_item, tasks, page)
if not page: else:
# 浏览器打开失败 time.sleep(3)
logger.error(f'{self.browser_item["num"]},窗口打开失败,检查代理ip') logger.info('不存在任务,等待3秒')
else:
# 开始执行任务
logger.info('开始执行任务')
status = await self.run_task(self.browser_item, tasks, page)
if status == False:
logger.info('请检查自动化')
time.sleep(3)
logger.info('不存在任务,等待3秒')
async def run_task(self, browser_item, tasks, page): async def run_task(self, browser_item, tasks, page):
try: try:
...@@ -469,20 +463,12 @@ def process_start(browser_item, lock): ...@@ -469,20 +463,12 @@ def process_start(browser_item, lock):
if __name__ == '__main__': if __name__ == '__main__':
# 测试-两个任务
browser_list = [ browser_list = [
{ {
# 1 'num': 2,
'num': 1, 'id': 'F1670ACB-79E6-4071-A7EA-69ECDA448ED8'
'id': '2A61BF52-6997-4290-AF3D-7FD7F8FC9CA6' }
},
# {
# # 9
# 'num': 9,
# 'id': 'db474b6936a24a7a949377a6d90b4dcb'
# }
] ]
lock = Lock() lock = Lock()
l = [] l = []
for item in browser_list: for item in browser_list:
......
import oss2
class AliyunOss(object):
def __init__(self):
self.access_key_id = "LTAI5tNAZDPTevMxLvyCYM4y" # 从阿里云查询到的 AccessKey 的ID
self.access_key_secret = "HYfehCbtKs9z41x69mnyDi7FllVTr9" # 从阿里云查询到的 AccessKey 的Secret
self.auth = oss2.Auth(self.access_key_id, self.access_key_secret)
self.bucket_name = "yunyi-tiktok" # 阿里云上创建好的Bucket的名称
self.endpoint = "oss-cn-shenzhen.aliyuncs.com" # 阿里云从Bucket中查询到的endpoint
self.bucket = oss2.Bucket(self.auth, self.endpoint, self.bucket_name)
def put_object_from_file(self, name, file):
"""
:param name: 在阿里云Bucket中要保存的文件名
:param file: 本地图片的文件名
:return:
"""
self.bucket.put_object_from_file(name, file)
return "https://{}.{}/{}".format(self.bucket_name, self.endpoint, name)
import json
import time
import uuid import uuid
from multiprocessing import Process, Lock from multiprocessing import Process, Lock
import asyncio import asyncio
...@@ -5,7 +7,7 @@ from loguru import logger ...@@ -5,7 +7,7 @@ from loguru import logger
from Helper import RedisCon from Helper import RedisCon
import requests import requests
import os import os
import oss2 from custom_oss_upload import AliyunOss
class DownLoad: class DownLoad:
...@@ -19,6 +21,26 @@ class DownLoad: ...@@ -19,6 +21,26 @@ class DownLoad:
'Authorization': '' 'Authorization': ''
} }
# 图片下载回调
async def task_callback(self, status, result_img, message=''):
url = self.task['callback']
for i in range(5):
try:
params = {
'prompt_id': self.task['prompt_id'],
}
if status:
# 为真-成功
params['result_img'] = result_img
else:
# 提交报错信息
params['message'] = message
res = requests.post(url, data=params)
logger.info(res)
break
except Exception as e:
logger.error(e)
async def download_img(self, url, cur_uuid): async def download_img(self, url, cur_uuid):
""" """
下载图片 下载图片
...@@ -41,12 +63,13 @@ class DownLoad: ...@@ -41,12 +63,13 @@ class DownLoad:
logger.error(e) logger.error(e)
async def upload_ali_oss(self, path, cur_uuid): async def upload_ali_oss(self, path, cur_uuid):
access_key_id = os.getenv('key', 'cener') # path--本地图片路径
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', 'xxxxxxxxxxxxxxx') # name- 阿里云存储位置
bucket_name = os.getenv('OSS_TEST_BUCKET', 'xxxx-test') name = f"files/download/admin/{cur_uuid}"
endpoint = os.getenv('OSS_TEST_ENDPOINT', 'oss-cn-shenzhen.aliyuncs.com') result_img = await AliyunOss().put_object_from_file(name, path)
base_file_url = 'xxxxx-test.oss-cn-shenzhen.aliyuncs.com' if result_img:
bucket_folder = 'test/' # bucket_folder = 'test/' # 回调
await self.task_callback(True, result_img)
# 开始 # 开始
async def on_start(self): async def on_start(self):
...@@ -59,10 +82,9 @@ class DownLoad: ...@@ -59,10 +82,9 @@ class DownLoad:
logger.info('图片下载成功') logger.info('图片下载成功')
# 图片下载成功--准备上传阿里云 # 图片下载成功--准备上传阿里云
await self.upload_ali_oss(path, cur_uuid) await self.upload_ali_oss(path, cur_uuid)
else: else:
# 图片下载失败-直接回调-失败状态 # 图片下载失败-直接回调-失败状态
print('111') await self.task_callback(False, '', '转存discord图片失败')
def process_start(lock, task): def process_start(lock, task):
...@@ -75,26 +97,31 @@ def process_start(lock, task): ...@@ -75,26 +97,31 @@ def process_start(lock, task):
if __name__ == '__main__': if __name__ == '__main__':
# 获取任务并实例化 # 获取任务并实例化
key = 'laravel_database_discord_img_download' key = 'laravel_database_discord_img_download'
try: while True:
tasks = list() try:
task_num = RedisCon.get_task_num(key) tasks = list()
logger.info(f'{task_num}个任务') task_num = RedisCon.get_task_num(key)
nums = 10 logger.info(f'{task_num}个任务')
process = 0 nums = 5
if task_num and task_num > 0: process = 0
if task_num < nums: if task_num and task_num > 0:
process = task_num if task_num < nums:
else: process = task_num
process = nums else:
lock = Lock() process = nums
l = [] lock = Lock()
for i in range(process): l = []
task = RedisCon.get_task(key) for i in range(process):
p = Process(target=process_start, args=(lock, task)) task = RedisCon.get_task(key)
p.start() if task:
l.append(p) # 将进程加入列表中,这样 5 个子进程就会全部执行 task = json.loads(task)
p = Process(target=process_start, args=(lock, task))
p.start()
l.append(p) # 将进程加入列表中,这样 5 个子进程就会全部执行
for p in l: for p in l:
p.join() # 当5 个子进程全部执行完,才会执行主进程 p.join() # 当5 个子进程全部执行完,才会执行主进程
except Exception as e: except Exception as e:
logger.error(e) logger.error(e)
logger.info('等待3秒')
time.sleep(3)
...@@ -33,8 +33,6 @@ def gpt_callback(res_prompt, task): ...@@ -33,8 +33,6 @@ def gpt_callback(res_prompt, task):
logger.error(e) logger.error(e)
# 拆分指令 # 拆分指令
def split_prompt(response, task): def split_prompt(response, task):
try: try:
......
import requests
import os
from loguru import logger
from Helper import RedisCon
from multiprocessing import Process, Lock
import asyncio
import time
import uuid
import cv2
import json
import base64
from custom_oss_upload import AliyunOss
class ImageSplit:
def __init__(self, lock, task):
self.header = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': ''
}
self.lock = lock
self.task = task
# 切割后的图片目录
self.split_path = './split_assets'
self.baidu_host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=SEVtEVlQPyqf55mgGt5u5Ad2&client_secret=0CNGhjMrgXRPmDE014S2IXyHLKCuTcfK'
# 百度接口的token
self.baidu_token = ''
async def download_img(self, url, cur_uuid):
"""
下载图片
:param url:
:return:
"""
for i in range(3):
try:
get_file = requests.get(url=url, headers=self.header, stream=True, allow_redirects=False, timeout=10)
file_name = cur_uuid
if not os.path.exists('./download'):
os.makedirs('./download')
path = f'./download/{file_name}'
with open(path, "wb") as Pypdf:
for chunk in get_file.iter_content(chunk_size=1024): # 1024 bytes
if chunk:
Pypdf.write(chunk)
return path
except Exception as e:
logger.error(e)
# 创建目录
async def mkdir(self, path):
path = path.strip()
path = path.rstrip("\\")
isExists = os.path.exists(path)
if not isExists:
os.makedirs(path)
print(path + ' 创建成功')
return True
else:
print(path + ' 目录已存在')
return False
# 切割图片
async def split_img(self, img_file):
img = cv2.imread(img_file)
# 这一段是改为灰色
# img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_h = img.shape[0] # 高度
img_w = img.shape[1] # 宽度
# h1_half = int(img_h / 2)
# w1_half = int(img_w / 2)
h1_half = img_h // 2
w1_half = img_w // 2
img_name = os.path.basename(img_file)
for i in range(4):
img1 = img[int(i / 2) * h1_half: h1_half * (int(i / 2) + 1),
int(i % 2) * w1_half: (int(i % 2) + 1) * w1_half]
img1_path = os.path.join(self.split_path, f"{img_name[:-4]}_{i + 1}.png")
cv2.imwrite(img1_path, img1)
# 文件是否存在
async def file_isexist(self, file_name, cut_id, path):
read_file_name = f'{path}/{str(file_name)}_{cut_id}.png'
exist = os.path.exists(read_file_name)
if exist:
return True
return False
# 获取百度的token
async def get_api_token(self):
try:
for i in range(5):
response = requests.get(self.baidu_host)
if response:
access_token = response.json()['access_token']
self.baidu_token = access_token
return True
except Exception as e:
logger.error(e)
return False
async def Img_enhance(self, path):
'''
图片增强
'''
request_url = "https://aip.baidubce.com/rest/2.0/image-process/v1/image_definition_enhance"
# 二进制方式打开图片文件
f = open(path, 'rb')
img = base64.b64encode(f.read())
params = {"image": img}
request_url = request_url + "?access_token=" + self.baidu_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
if response:
imgdata = base64.b64decode(response.json()["image"])
file = open(path, 'wb')
file.write(imgdata)
file.close()
async def Img_enlarge(self, path):
'''
图片无损放大
'''
request_url = "https://aip.baidubce.com/rest/2.0/image-process/v1/image_quality_enhance"
# 二进制方式打开图片文件
f = open(path, 'rb')
img = base64.b64encode(f.read())
params = {"image": img}
request_url = request_url + "?access_token=" + self.baidu_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
if response:
imgdata = base64.b64decode(response.json()["image"])
file = open(f'{path}', 'wb')
file.write(imgdata)
file.close()
# 任务回调
async def task_callback(self, result_img):
url = self.task['callback']
for i in range(5):
try:
res = requests.post(url, data={
'cut_img': result_img,
'prompt_id': self.task['prompt_id']
})
back = res.json()
logger.info(back)
if back['code'] == 0:
break
except Exception as e:
logger.error(e)
# 开始
async def on_start(self):
download_url = self.task['result_img']
cur_uuid = uuid.uuid4()
new_uuid = str(cur_uuid) + '.png'
path = await self.download_img(download_url, new_uuid)
if path:
# 下载成功
# 创建目录
await self.mkdir(self.split_path)
# 开始切割
await self.split_img(os.path.join('./download', new_uuid))
logger.info('图片切割完成')
# 判断文件是存在
status = await self.file_isexist(cur_uuid, self.task['cut_id'], self.split_path)
if status:
logger.info('切割文件存在')
# 获取百度接口的token
baidu_status = await self.get_api_token()
if not baidu_status:
logger.info('百度token获取失败')
else:
# 文件路径
file_path = f'{self.split_path}/{str(cur_uuid)}_{self.task["cut_id"]}.png'
# 开始图像无损放大
logger.info('开始图像无损放大')
await self.Img_enlarge(file_path)
# 开始图像质量增强
await self.Img_enhance(file_path)
logger.info('图像增强结束')
# 上传阿里云
name = f"files/download/admin/{new_uuid}"
result_img = AliyunOss().put_object_from_file(name, file_path)
if result_img:
# 回调
await self.task_callback(result_img)
logger.info('本次任务结束')
else:
logger.info('切割文件不存在')
def process_start(lock, task):
loop = asyncio.get_event_loop()
keyword = ImageSplit(lock, task)
# 生产
loop.run_until_complete(keyword.on_start())
if __name__ == '__main__':
# 获取任务并实例化
key = 'laravel_database_discord_img_split'
while True:
try:
tasks = list()
task_num = RedisCon.get_task_num(key)
logger.info(f'{task_num}个任务')
nums = 5
process = 0
if task_num and task_num > 0:
if task_num < nums:
process = task_num
else:
process = nums
lock = Lock()
l = []
for i in range(process):
task = RedisCon.get_task(key)
if task:
task = json.loads(task)
# 测试
p = Process(target=process_start, args=(lock, task))
p.start()
l.append(p) # 将进程加入列表中,这样 5 个子进程就会全部执行
for p in l:
p.join() # 当5 个子进程全部执行完,才会执行主进程
time.sleep(3)
except Exception as e:
logger.error(e)
logger.info('等待3秒')
time.sleep(3)
import time import socket
import re import requests
# 获取当前时间
# print(int(time.mktime(time.localtime(time.time()))))
text = '\u6761\u76f8\u4f3c\u7684\u6307\u4ee4\u53ef\u80fd\u662f\uff1a\n\n1.A attractive girls, 12 years old, dancing with a rainbow umbrella, in a wide street, full body, V-Ray render, Octane render, X-Particles, cartoon material, Popmart keychains, CG trend, night lighting, long-focus, ultra high definition. \n2.A very handsome teenagers, 10 years old, riding a skateboard, in a colorful playground, 3/4 body, Arnold render, Corona render, hard surface modeling, photorealistic material, Popmart toys, Pixar tech, interior lighting, soft focus, ultra realistic. \n3.A very lovely kids, 5 years old, playing a guitar, in an old alley, full body, Blender render, Redshift render, polygon modeling, 3d printed material, Popmart collectibles, anime trend, day lighting, depth of field, ultra stunning. \n4.A cute baby, 2 years old, flying a kite, in a green park, upper body, Maxwell render, Arnold render, sculpting, traditional material, Popmart accessories, motion graphics trend, art direction lighting, bokeh, ultra hyper real. \n5.A really cute teens, 14 years old, drawing a picture, in a quiet garden, full body, Octane render, Art Renderer, low polygon modeling, abstract material, Popmart dolls, Hollywood trend, environment lighting, vignette, ultra vibrant.'
# 拆分
# 使用正则定义分隔符
pattern = r'\n[1-9]{1,2}.*.'
# 拆分字符串
chemical_list = re.findall(pattern, text)
for item in chemical_list:
# 匹配标题并替换
item = re.sub(r'\n[1-9]{1,3}.', '', item, count=0, flags=0)
print(item)
# 获取本机计算机名称
hostname = socket.gethostname()
# 获取本机ip
ip = socket.gethostbyname(hostname)
print(ip)
ip = 'http://' + ip
res = requests.get(ip)
print(res)
'192.168.1.51' '192.168.100.225'
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment