Toggle navigation
Toggle navigation
This project
Loading...
Sign in
LiuFuhua
/
xj-marketing
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
rinalLi
2024-12-24 16:09:23 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
137c8c81e73faaa366d86e49e291228c805236a3
137c8c81
1 parent
fd40f88f
sohu
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
179 additions
and
7 deletions
cli_main.py
uploader/sohu_uploader/__init__.py
uploader/sohu_uploader/main.py
uploader/xhs_uploader/main.py
utils/base_social_media.py
utils/log.py
cli_main.py
View file @
137c8c8
...
...
@@ -11,10 +11,11 @@ from uploader.tencent_uploader.main import weixin_setup, TencentVideo
from
uploader.tk_uploader.main_chrome
import
tiktok_setup
,
TiktokVideo
from
uploader.xhs_uploader.main
import
xhs_setup
,
XHSVideo
from
uploader.wyh_uploader.main
import
wyh_setup
from
uploader.sohu_uploader.main
import
sohu_setup
,
SOHUVideo
from
uploader.toutiao_uploader.main
import
toutiao_setup
from
utils.base_social_media
import
get_supported_social_media
,
get_cli_action
,
SOCIAL_MEDIA_DOUYIN
,
\
SOCIAL_MEDIA_TENCENT
,
SOCIAL_MEDIA_TIKTOK
,
SOCIAL_MEDIA_KUAISHOU
,
SOCIAL_MEDIA_WANGYIHAO
,
\
SOCIAL_MEDIA_XHS
,
SOCIAL_MEDIA_TOUTIAO
,
SOCIAL_MEDIA_BAIJIAHAO
SOCIAL_MEDIA_XHS
,
SOCIAL_MEDIA_TOUTIAO
,
SOCIAL_MEDIA_BAIJIAHAO
,
SOCIAL_MEDIA_SOHU
from
utils.constant
import
TencentZoneTypes
from
utils.files_times
import
get_title_and_hashtags
...
...
@@ -80,6 +81,8 @@ async def main():
await
toutiao_setup
(
str
(
account_file
),
handle
=
True
)
elif
args
.
platform
==
SOCIAL_MEDIA_BAIJIAHAO
:
await
toutiao_setup
(
str
(
account_file
),
handle
=
True
)
elif
args
.
platform
==
SOCIAL_MEDIA_SOHU
:
await
sohu_setup
(
str
(
account_file
),
handle
=
True
)
elif
args
.
action
==
'upload'
:
title
,
tags
=
get_title_and_hashtags
(
args
.
video_file
)
...
...
@@ -108,6 +111,9 @@ async def main():
elif
args
.
platform
==
SOCIAL_MEDIA_XHS
:
await
xhs_setup
(
account_file
,
handle
=
True
)
app
=
XHSVideo
(
title
,
video_file
,
tags
,
publish_date
,
account_file
)
elif
args
.
platform
==
SOCIAL_MEDIA_SOHU
:
await
sohu_setup
(
account_file
,
handle
=
True
)
app
=
SOHUVideo
(
title
,
video_file
,
tags
,
None
,
account_file
)
else
:
print
(
"Wrong platform, please check your input"
)
exit
()
...
...
uploader/sohu_uploader/__init__.py
0 → 100644
View file @
137c8c8
File mode changed
uploader/sohu_uploader/main.py
0 → 100644
View file @
137c8c8
# -*- coding: utf-8 -*-
from
datetime
import
datetime
from
playwright.async_api
import
Playwright
,
async_playwright
import
os
import
asyncio
import
json
from
conf
import
LOCAL_CHROME_PATH
from
utils.base_social_media
import
set_init_script
from
utils.files_times
import
get_absolute_path
from
utils.log
import
sohu_logger
async
def
cookie_auth
(
account_file
):
async
with
async_playwright
()
as
playwright
:
browser
=
await
playwright
.
chromium
.
launch
(
headless
=
False
)
context
=
await
browser
.
new_context
(
storage_state
=
account_file
)
await
set_init_script
(
context
)
# context = await browser.new_context()
page
=
await
context
.
new_page
()
# saved_cookies = await read_cookies_from_file(account_file)
# await context.add_cookies(saved_cookies)
try
:
await
page
.
goto
(
"https://tv.sohu.com/"
,
timeout
=
5000
)
except
:
pass
try
:
await
page
.
wait_for_selector
(
"div.user-ico"
,
timeout
=
5000
)
# 等待5秒
sohu_logger
.
success
(
"[+] cookie 有效"
)
return
True
except
:
sohu_logger
.
info
(
"[+] 等待5秒 cookie 失效"
)
return
False
async
def
sohu_setup
(
account_file
,
handle
=
False
):
account_file
=
get_absolute_path
(
account_file
,
"sohu_uploader"
)
if
not
os
.
path
.
exists
(
account_file
)
or
not
await
cookie_auth
(
account_file
):
if
not
handle
:
return
False
sohu_logger
.
info
(
'[+] cookie文件不存在或已失效,即将自动打开浏览器,请扫码登录,登陆后会自动生成cookie文件'
)
await
get_sohu_cookie
(
account_file
)
return
True
async
def
get_sohu_cookie
(
account_file
):
async
with
async_playwright
()
as
playwright
:
options
=
{
'args'
:
[
'--lang en-GB'
],
'headless'
:
False
,
# Set headless option here
}
# Make sure to run headed.
browser
=
await
playwright
.
chromium
.
launch
(
**
options
)
# Setup context however you like.
context
=
await
browser
.
new_context
()
# Pass any options
context
=
await
set_init_script
(
context
)
# Pause the page, and start recording manually.
page
=
await
context
.
new_page
()
try
:
await
page
.
goto
(
"https://tv.sohu.com/"
,
timeout
=
5000
)
except
:
pass
await
asyncio
.
sleep
(
1
)
await
page
.
wait_for_selector
(
"div.user-ico"
,
timeout
=
50000
)
sohu_logger
.
info
(
"搜狐视频登录成功"
)
await
asyncio
.
sleep
(
3
)
# await page.pause()
# 点击调试器的继续,保存cookie
# cookies = await context.cookies()
# await write_cookies_to_file(cookies, account_file)
await
context
.
storage_state
(
path
=
account_file
)
class
SOHUVideo
(
object
):
def
__init__
(
self
,
title
,
file_path
,
tags
,
publish_date
:
datetime
,
account_file
):
self
.
title
=
title
# 视频标题
self
.
file_path
=
file_path
self
.
tags
=
tags
self
.
publish_date
=
publish_date
self
.
account_file
=
account_file
self
.
date_format
=
'
%
Y-
%
m-
%
d
%
H:
%
M'
self
.
local_executable_path
=
LOCAL_CHROME_PATH
async
def
handle_upload_error
(
self
,
page
):
pass
# sohu_logger.error("视频出错了,重新上传中")
# await page.locator('div.progress-div [class^="upload-btn-input"]').set_input_files(self.file_path)
async
def
upload
(
self
,
playwright
:
Playwright
)
->
None
:
# 使用 Chromium 浏览器启动一个浏览器实例
if
self
.
local_executable_path
:
browser
=
await
playwright
.
chromium
.
launch
(
headless
=
False
,
executable_path
=
self
.
local_executable_path
,
)
else
:
browser
=
await
playwright
.
chromium
.
launch
(
headless
=
False
)
# 创建一个浏览器上下文,使用指定的 cookie 文件
context
=
await
browser
.
new_context
(
storage_state
=
self
.
account_file
)
page
=
await
context
.
new_page
()
# saved_cookies = await read_cookies_from_file(self.account_file)
# await context.add_cookies(saved_cookies)
# context = await set_init_script(context)
# context.on("close", lambda: )
# 创建一个新的页面
# 访问指定的 URL
try
:
await
page
.
goto
(
"https://tv.sohu.com/s/center/index.html#/"
,
timeout
=
5000
)
except
:
pass
sohu_logger
.
info
(
'正在上传-------{}.mp4'
.
format
(
self
.
title
))
# 等待页面跳转到指定的 URL,没进入,则自动等待到超时
# 点击 "上传视频" 按钮
# await page.locator("dev.release-top").set_input_files(
# self.file_path)
await
page
.
locator
(
"input[type='file']"
)
.
set_input_files
(
self
.
file_path
)
upload_button
=
page
.
locator
(
'div.form-button span:has-text("发布")'
)
await
upload_button
.
wait_for
(
state
=
'visible'
)
# 确保按钮可见
await
asyncio
.
sleep
(
1
)
sohu_logger
.
info
(
"正在填充标题..."
)
await
page
.
locator
(
"input.input-topic"
)
.
nth
(
0
)
.
fill
(
self
.
title
[:
99
])
# 搜狐最多100
await
asyncio
.
sleep
(
1
)
sohu_logger
.
info
(
"正在填充话题..."
)
inputTag
=
page
.
locator
(
"input.input-topic"
)
.
nth
(
1
)
await
inputTag
.
click
()
for
index
,
tag
in
enumerate
(
self
.
tags
[:
2
],
start
=
1
):
await
page
.
keyboard
.
type
(
f
"#{tag}"
)
await
page
.
keyboard
.
press
(
"Enter"
)
sohu_logger
.
info
(
"已写完tag"
)
await
asyncio
.
sleep
(
1
)
sohu_logger
.
info
(
self
.
publish_date
)
# 定时任务 搜狐没有定时发布
# if self.publish_date != 0:
# await self.set_schedule_time(page, self.publish_date)
# upload_button = page.locator('button div span:has-text("定时发布")')
sohu_logger
.
info
(
"提交"
)
await
upload_button
.
click
()
await
page
.
wait_for_selector
(
'h3:has-text("视频管理")'
)
await
context
.
storage_state
(
path
=
self
.
account_file
)
sohu_logger
.
info
(
'cookie更新完毕!'
)
await
asyncio
.
sleep
(
4
)
# 这里延迟是为了方便眼睛直观的观看
# 关闭浏览器上下文和浏览器实例
await
context
.
close
()
await
browser
.
close
()
async
def
main
(
self
):
async
with
async_playwright
()
as
playwright
:
await
self
.
upload
(
playwright
)
uploader/xhs_uploader/main.py
View file @
137c8c8
...
...
@@ -90,8 +90,7 @@ class XHSVideo(object):
self
.
local_executable_path
=
LOCAL_CHROME_PATH
async
def
handle_upload_error
(
self
,
page
):
xhs_logger
.
error
(
"视频出错了,重新上传中"
)
await
page
.
locator
(
'div.progress-div [class^="upload-btn-input"]'
)
.
set_input_files
(
self
.
file_path
)
pass
async
def
upload
(
self
,
playwright
:
Playwright
)
->
None
:
# 使用 Chromium 浏览器启动一个浏览器实例
...
...
@@ -131,8 +130,10 @@ class XHSVideo(object):
inputTag
=
page
.
locator
(
'id=quillEditor'
)
.
locator
(
'div p'
)
await
inputTag
.
click
()
for
index
,
tag
in
enumerate
(
self
.
tags
,
start
=
1
):
await
page
.
keyboard
.
type
(
f
"#{tag} "
)
await
asyncio
.
sleep
(
2
)
await
page
.
keyboard
.
type
(
f
"#{tag}"
)
await
page
.
wait_for_selector
(
"ul.ql-mention-list"
)
await
page
.
keyboard
.
press
(
"Enter"
)
xhs_logger
.
info
(
"已写完tag"
)
await
asyncio
.
sleep
(
1
)
...
...
utils/base_social_media.py
View file @
137c8c8
...
...
@@ -9,14 +9,16 @@ SOCIAL_MEDIA_TIKTOK = "tiktok"
SOCIAL_MEDIA_BILIBILI
=
"bilibili"
SOCIAL_MEDIA_KUAISHOU
=
"kuaishou"
SOCIAL_MEDIA_WANGYIHAO
=
'wangyihao'
SOCIAL_MEDIA_XHS
=
'xiaohongshu'
SOCIAL_MEDIA_XHS
=
'xiaohongshu'
# 小红书最长标题是20
SOCIAL_MEDIA_TOUTIAO
=
'toutiao'
SOCIAL_MEDIA_BAIJIAHAO
=
'baijiahao'
SOCIAL_MEDIA_SOHU
=
'sohu'
# 搜狐视频话题最多2个 标题最多100 标题不支持🩹
def
get_supported_social_media
()
->
List
[
str
]:
return
[
SOCIAL_MEDIA_DOUYIN
,
SOCIAL_MEDIA_TENCENT
,
SOCIAL_MEDIA_TIKTOK
,
SOCIAL_MEDIA_KUAISHOU
,
SOCIAL_MEDIA_WANGYIHAO
,
SOCIAL_MEDIA_TOUTIAO
,
SOCIAL_MEDIA_BAIJIAHAO
,
SOCIAL_MEDIA_XHS
]
SOCIAL_MEDIA_WANGYIHAO
,
SOCIAL_MEDIA_TOUTIAO
,
SOCIAL_MEDIA_BAIJIAHAO
,
SOCIAL_MEDIA_XHS
,
SOCIAL_MEDIA_SOHU
]
def
get_cli_action
()
->
List
[
str
]:
...
...
utils/log.py
View file @
137c8c8
...
...
@@ -46,6 +46,7 @@ logger.add(stdout, colorize=True, format=log_formatter)
douyin_logger
=
create_logger
(
'douyin'
,
'logs/douyin.log'
)
tencent_logger
=
create_logger
(
'tencent'
,
'logs/tencent.log'
)
xhs_logger
=
create_logger
(
'xhs'
,
'logs/xhs.log'
)
sohu_logger
=
create_logger
(
'sohu'
,
'logs/sohu.log'
)
tiktok_logger
=
create_logger
(
'tiktok'
,
'logs/tiktok.log'
)
bilibili_logger
=
create_logger
(
'bilibili'
,
'logs/bilibili.log'
)
kuaishou_logger
=
create_logger
(
'kuaishou'
,
'logs/kuaishou.log'
)
...
...
Please
register
or
login
to post a comment