package com.shsening.autouploadvideos
|
|
|
import android.app.Instrumentation
|
import android.content.Context
|
import android.os.SystemClock
|
import android.os.Handler
|
import com.shsening.autouploadvideos.UploadSessionActivity
|
import com.shsening.autouploadvideos.utils.Utils
|
import com.shsening.autouploadvideos.WebviewUtils
|
import com.shsening.autouploadvideos.action.PlatformActionInterface
|
|
class ActionBilibili (private var activity: UploadSessionActivity, private var threadHandler: Handler, private var videoInfo: Utils.VideoUploadTaskInfo) :
|
PlatformActionInterface {
|
|
|
private var webView = activity.sessionProfileWebView
|
|
|
var jsCode_CheckContentLoaded = """
|
document.querySelector('#video-up-app > div.video-entrance > div.upload-body > div > div.upload-wrp > div.bcc-upload.upload > div > input[type=file]') !== null
|
""".trimIndent()
|
var jsCode_CheckVideoUploadFinished = """
|
document.querySelector('#video-up-app > div.video-basic-wrp > div.video-basic > div.video-upload > div.upload-queue > div > div.file-list > div.drag-list > div > div > div.file-item-content > div.file-item-content-detail > div.file-item-content-operate > div > div') !==null
|
""".trimIndent()
|
var jsCode_PublishVideo_Finished ="document.querySelector('#video-up-app > div.video-entrance > div.upload-body > div > div.banner-entry > div.banner-entry-right > div') !== null"
|
|
var jsPath_PublishVideo ="#video-up-app > div.video-basic-wrp > div.video-basic > div.form > div:nth-child(17) > div > div > span"
|
|
|
|
private fun updatePostDescription(){
|
|
WebviewUtils.addValueToInput(webView,"#video-up-app > div.video-basic-wrp > div.video-basic > div.form > div.form-item.form-item-short-margin > div > div.video-title-content > div.input.input-container > div > input",videoInfo.title+videoInfo.datetime)
|
|
WebviewUtils.addValueToDiv(webView,"#video-up-app > div.video-basic-wrp > div.video-basic > div.form > div:nth-child(7) > div > div.desc-text-wrp > div > div.editor.ql-container > div.ql-editor.ql-blank",videoInfo.description)
|
|
|
WebviewUtils.simpleElementClick(webView,"#video-up-app > div.video-basic-wrp > div.video-basic > div.form > div:nth-child(8) > div > div.time-switch-wrp > div")
|
val datetime1 = videoInfo.datetime.substring(0,8)
|
val datetime2 = videoInfo.datetime.substring(8)
|
setDatePickerInput("#video-up-app > div.video-basic-wrp > div.video-basic > div.form > div:nth-child(8) > div > div.time-switch-wrp > div.time-picker > div > div > div:nth-child(2) > div",datetime1)
|
setTimePickerInput("#video-up-app > div.video-basic-wrp > div.video-basic > div.form > div:nth-child(8) > div > div.time-switch-wrp > div.time-picker > div > div > div:nth-child(3) > div",datetime2)
|
|
// 在主线程中设置延迟执行
|
threadHandler.postDelayed(Runnable {
|
startToPublishVideo()
|
}, 5000)
|
}
|
|
|
override fun checkIfContentLoaded() {
|
webView.postDelayed({
|
webView.evaluateJavascript(jsCode_CheckContentLoaded) { result ->
|
if (result == "true") {
|
simulateSwipeAndUploadVideo()
|
} else {
|
webView.postDelayed({
|
checkIfContentLoaded()
|
}, 1000) // 1秒后再次检查
|
}
|
}
|
}, 1000) // 每秒检查一次
|
}
|
|
private fun startToPublishVideo(){
|
WebviewUtils.simpleElementClick(webView, jsPath_PublishVideo)
|
|
checkVideoPublishFinished()
|
}
|
|
private fun checkVideoUploadFinished(){
|
webView.postDelayed({
|
webView.evaluateJavascript(jsCode_CheckVideoUploadFinished) { result ->
|
if (result == "true") {
|
// 等待视频检测和生成封面
|
threadHandler.postDelayed({updatePostDescription()},3000)
|
|
} else {
|
// 元素不存在,1秒后再次检查
|
webView.postDelayed({
|
checkVideoUploadFinished()
|
}, 1000) // 1秒后再次检查
|
}
|
}
|
}, 1000) // 每秒检查一次
|
}
|
|
private fun checkVideoPublishFinished(){
|
webView.postDelayed({
|
webView.evaluateJavascript(jsCode_PublishVideo_Finished) { result ->
|
if (result == "true") {
|
|
// video published successfully!!!
|
activity.checkAndStartNextTask()
|
|
|
} else {
|
// 元素不存在,1秒后再次检查
|
webView.postDelayed({
|
checkVideoPublishFinished()
|
}, 1000) // 1秒后再次检查
|
}
|
}
|
}, 1000) // 每秒检查一次
|
}
|
|
private fun setDatePickerInput(jsPath: String, targetValue: String) {
|
var datetimes = Utils.validateAndReturnDateTime(targetValue) ?: return
|
var dpPanelText = datetimes[0].toString()+"年"+datetimes[1].toString()+"月";
|
var dateRowColum = Utils.getDatePosition(datetimes[0],datetimes[1],datetimes[2])?:return;
|
|
val jsCode = """
|
try {
|
var dp = document.querySelector('${jsPath}');
|
dp.focus(); // 确保输入框获得焦点
|
dp.click();
|
|
// need time to popup date-picker
|
setTimeout(() => {
|
var dpPanel = document.querySelector('.date-picker-container');
|
var dpPanelSpan = dpPanel.querySelector('div > p');
|
if (dpPanelSpan && dpPanelSpan.textContent != '${dpPanelText}'){
|
document.querySelector('#video-up-app > div.video-basic-wrp > div.video-basic > div.form > div:nth-child(8) > div > div.time-switch-wrp > div.time-picker > div > div > div:nth-child(2) > div.date-picker-container > div.date-picker-nav-wrp > svg.next-btn-day.icon-sprite.icon-sprite-ic_into').click();
|
}
|
document.querySelector('div > div > div > div > div:nth-child(1) > div.semi-datepicker-month > div.semi-datepicker-weeks > div:nth-child(${dateRowColum[0]}) > div:nth-child(${dateRowColum[1]})').click()
|
|
//switch to time selection
|
document.querySelector('#video-up-app > div.video-basic-wrp > div.video-basic > div.form > div:nth-child(8) > div > div.time-switch-wrp > div.time-picker > div > div > div:nth-child(2) > div.date-picker-container > div.date-picker-nav-wrp > svg.next-btn-day.icon-sprite.icon-sprite-ic_into').click();
|
setTimeout(() => {
|
dpPanel.querySelector('div > div > div > div.semi-datepicker-tpk > div > div > div.semi-scrolllist-body > div.semi-scrolllist-item-wheel.undefined-list-hour > div.semi-scrolllist-list-outer > ul > li:nth-child(${(datetimes[3]+1)})').click();
|
dpPanel.querySelector('div > div > div > div.semi-datepicker-tpk > div > div > div.semi-scrolllist-body > div.semi-scrolllist-item-wheel.undefined-list-minute > div.semi-scrolllist-list-outer > ul > li:nth-child(${(datetimes[4]+1)})').click();
|
}, 500);
|
}, 500);
|
} catch (error) {
|
console.error('设置日期时发生错误:', error);
|
}
|
""".trimIndent()
|
|
// 在 WebView 中执行 JavaScript 代码
|
webView.evaluateJavascript(jsCode, null)
|
}
|
|
private fun setTimePickerInput(jsPath: String, targetValue: String) {
|
// 解析分秒字符串,假设格式为 "MMSS"
|
val minutes = targetValue.substring(0, 2).toIntOrNull() ?: return // 获取前两个字符作为分钟,如果转换失败则返回
|
val seconds = targetValue.substring(2, 4).toIntOrNull() ?: return // 获取后两个字符作为秒,如果转换失败则返回
|
|
// 构建要执行的 JavaScript 代码
|
val jsCode = """
|
try {
|
|
setTimeout(() => {
|
var minuteSelector = document.querySelector('.minute-selector-class');
|
var secondSelector = document.querySelector('.second-selector-class');
|
|
if (minuteSelector && secondSelector) {
|
minuteSelector.value = ${minutes};
|
secondSelector.value = ${seconds};
|
}
|
}, 500); // 延迟时间可能需要根据实际情况调整
|
} catch (error) {
|
console.error('设置时间时发生错误:', error);
|
}
|
""".trimIndent()
|
|
// 在 WebView 中执行 JavaScript 代码
|
webView.evaluateJavascript(jsCode, null)
|
}
|
private fun addValueToDatePickerInput(first:Boolean, jsPath: String, targetValue: String) {
|
|
var datetimes = Utils.validateAndReturnDateTime(targetValue) ?: return
|
|
var dpPanelText = datetimes[0].toString()+"年 "+datetimes[1].toString()+"月";
|
|
var dateRowColum = Utils.getDatePosition(datetimes[0], datetimes[1], datetimes[2]) ?:return;
|
|
val jsCode = """
|
try {
|
var dp = document.querySelector('${jsPath}');
|
dp.focus(); // 确保输入框获得焦点
|
dp.click();
|
|
// need time to popup date-picker
|
setTimeout(() => {
|
var dpPanel = document.querySelector('.semi-popover-content');
|
var dpPanelSpan = dpPanel.querySelector('div > div > div > div:nth-child(1) > div.semi-datepicker-navigation > div > button > span > span');
|
if (dpPanelSpan && dpPanelSpan.textContent != '${dpPanelText}'){
|
dpPanel.querySelector('div > div > div > div > div:nth-child(1) > div.semi-datepicker-navigation > button:nth-child(3)').click();
|
}
|
dpPanel.querySelector('div > div > div > div > div:nth-child(1) > div.semi-datepicker-month > div.semi-datepicker-weeks > div:nth-child(${dateRowColum[0]}) > div:nth-child(${dateRowColum[1]})').click()
|
|
//switch to time selection
|
dpPanel.querySelector('div > div > div > div > div.semi-datepicker-switch > div.semi-datepicker-switch-time').click();
|
setTimeout(() => {
|
dpPanel.querySelector('div > div > div > div.semi-datepicker-tpk > div > div > div.semi-scrolllist-body > div.semi-scrolllist-item-wheel.undefined-list-hour > div.semi-scrolllist-list-outer > ul > li:nth-child(${(datetimes[3]+1)})').click();
|
dpPanel.querySelector('div > div > div > div.semi-datepicker-tpk > div > div > div.semi-scrolllist-body > div.semi-scrolllist-item-wheel.undefined-list-minute > div.semi-scrolllist-list-outer > ul > li:nth-child(${(datetimes[4]+1)})').click();
|
}, 500);
|
}, 500);
|
} catch (error) {
|
console.error('发生错误:', error);
|
}
|
"""
|
webView.evaluateJavascript(jsCode,null)
|
|
|
}
|
|
|
private fun simulateSwipeAndUploadVideo() {
|
val instrumentation = Instrumentation()
|
val displayMetrics = activity.resources.displayMetrics
|
val width = displayMetrics.widthPixels
|
val height = displayMetrics.heightPixels
|
|
val startX = width.toFloat() * 0.9f // 从右侧滑动
|
val endX = width.toFloat() * 0.1f // 滑动到左侧
|
val y = height / 3f // Y 坐标在屏幕中间
|
|
Thread {
|
Utils.instrumentationSwipe(instrumentation, startX, y, endX, y)
|
SystemClock.sleep(500)
|
Utils.instrumentationSwipe(instrumentation, startX, y, endX, y)
|
SystemClock.sleep(500)
|
Utils.instrumentationClick(instrumentation, width / 2f, height * 2 / 4f)
|
// back to main thread
|
threadHandler.post {
|
checkVideoUploadFinished()
|
}
|
}.start()
|
}
|
|
}
|