Python实现某云在线客服退款保持联系,自动化测试selenium元素定位,利用多线程Thread实现脚本暂停/继续执行,采用pyttsx3实现语音播报排名情况

本文主要是介绍Python实现某云在线客服退款保持联系,自动化测试selenium元素定位,利用多线程Thread实现脚本暂停/继续执行,采用pyttsx3实现语音播报排名情况,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目背景

某云在线客服只要一阵子不理他,他就会给你断线要重新排队

 

为了能够与该在线客服保持联络,我要实现浏览器操作自动化才能完成进入到人工客服的队列里

 项目需求

  1. 周期性定时在输入框自动输入文字内容,并发送给机器人客服
  2. 能够随时中断自动输入的文字内容,我人工介入与在线客服进行咨询
  3. 进阶优化功能:排队人数小于3人时,语音播报我实时的排名情况

系统架构

待补充...

完整代码

#!/usr/bin/env pythonfrom selenium import webdriver 
# from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.by import Byimport time
from threading import Thread
# import os
import reimport pyttsx3
engine = pyttsx3.init()Flag_Pause = FalseError_Count = 0# 操作网页
def operateWeb():driver = webdriver.Chrome ()url = "https://im.ldygo.com/webchat_new/static/html/index.html?ht=kRLOt2"# url = "https://baidu.com"driver.get(url)input('按任意内容继续')# 进入嵌入的iframedriver.switch_to.frame("mainiframe")t1 = Thread(target=changeFlag)t1.start()# driver.switch_to.default_content() #退出iframe页面,返回主页面while True:# str = input('请输入要查找的内容:')if not Flag_Pause:try:# words = driver.find_element(By.ID,"%s"%str)# print(words)msg = driver.find_elements(By.CLASS_NAME,"msg-text")# print(msg)waitNum = re.findall(r'-?\d+\.?\d*', msg[-2].text)if int(waitNum[0]) < 3 :sentence = "前面排队还有 %s 名"%waitNumengine.setProperty('volume', 0.1)  # 设置音量(最小为0, 最大为1)engine.say(sentence) # 朗读文本engine.runAndWait() # 执行并等待语音结束else:sentence = msg[-2].textprint(sentence)# 发送文字至目标iddriver.find_element(By.ID,"chatText").send_keys("手机号1*****4的订单,请求退款,麻烦处理一下")# # 点击目标iddriver.find_element(By.ID,"send").click()# 保持排队通讯联络2分钟发一次time.sleep(120)except Exception as result:print("未知错误 %s" % result)global Error_CountError_Count += 1# 错误5次程序停止继续执行 这里有点像看门狗的意思 # 停止下来等待人的继续操作通知if Error_Count == 5:input('程序异常,请按任意键继续')Error_Count = 0 # 计数器重新置零# os._exit(0) # 如果直接退出程序,浏览器就关闭了,可能导致白排队,但其实浏览器没有被关闭,这个退出程序退的进程不彻底# 自动发送暂停/继续
def changeFlag():global Flag_Pausewhile True:value = input('是否停止自动发送 y/n?')if value == 'y':Flag_Pause = Trueinput('已暂停持续自动发送,按任意键继续自动发送')Flag_Pause = Falseif __name__ == "__main__":print('----------使用范围:联系客服----------')operateWeb()

注意事项

  1. 不需要语音播报的可以注释掉我语音播报的部分代码
  2. 程序需要写在循环函数里,中断函数需要另外创建一个线程,并能够修改与主程序共用的Flag_Pause全局变量。中断函数要声明修改的是全局变量,故global声明很关键。
  3. 捕捉的定位元素所在页面层级很关键,某云是与云软合作的,将云软的页面内嵌到他们的页面上,故定位的时候还需要切换一下页面句柄,你们不是iframe类型的元素定位,可以注释掉我切换句柄的那一句。

实际输出日志

​​​​​​​ 

----------使用范围:联系客服----------
按任意内容继续
是否停止自动发送 y/n?正在为您转接客服小姐姐,请稍等!前面还有24人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有24人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有22人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有21人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有20人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有16人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有15人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有14人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有13人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有12人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有11人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有11人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有9人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有8人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有8人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有8人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有8人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有7人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有7人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有7人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有7人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有7人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有7人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有7人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有6人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有5人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有4人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
感谢您的耐心等待,因用车高峰期,客服繁忙,您前面还有3人。您也可以选择
感谢您的耐心等待,因用车高峰期,客服繁忙,您前面还有3人。您也可以选择
感谢您的耐心等待,因用车高峰期,客服繁忙,您前面还有3人。您也可以选择
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
正在为您转接客服小姐姐,请稍等!前面还有3人排队,您也可以点击
前面排队还有 ['2'] 名
前面排队还有 ['2'] 名
前面排队还有 ['2'] 名
前面排队还有 ['2'] 名
前面排队还有 ['2'] 名
前面排队还有 ['2'] 名
前面排队还有 ['2'] 名
前面排队还有 ['2'] 名
前面排队还有 ['2'] 名
前面排队还有 ['2'] 名
前面排队还有 ['2'] 名
前面排队还有 ['2'] 名
前面排队还有 ['2'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名
前面排队还有 ['1'] 名

每一条日志就是2分钟的间隔,可想而知是某云做的障眼法,根本没有在线客服的存在...

24人排队也许是真实的人,但最后的那1个人一定是虚拟名额,大家不断的放弃离开一直到还有1名,这就是最真实的结果

后记

第一次租车就遇到了某云的故障车,后悔百度的时候看见大家的评价不好没有认真对待,真是把自己坑到了。

这年头没有点技术都不配联系某云的在线客服了?打语音电话机器人客服说联系APP上的在线客服,我笑了,排队重来没有排进去的。

一开始我用JS在浏览器里想实现功能,却发现只能修改value值,却没有办法发送出去,估计是页面框架绑定了键盘事件,最终采用python的方式来实现这个需求。

`,_+=1})),x=t}let U=l,A=l;l<0?(a=0,i<=o&&(a=s.div(s.sub(i,d),2))):0==l?i<=o&&(a=s.div(s.sub(i,d),2)):(t=s.add(4,36),t=s.add(s.add(d,t),s.add(s.mul(_,38),36)),l>S.sub(i,T)&&(A=S.sub(i,T)));let O="",L=t?s.runtime.getURL("img/video-default.png"):"https://res.stayfork.app/scripts/BB8CD00276006365956C32A6556696AD/icon.png",D='
'+L+'
'+S.getHostname(n.hostUrl)+"
";n.poster&&(O="border-radius: 15px;",D=`
`),function(t,e,r){if(t&&"VIDEO"==t.tagName){t.setAttribute("autoplay","autoplay"),t.setAttribute("crossOrigin","anonymous");var n=document.createElement("canvas");e=(n.width=e,n.height=r,n.getContext("2d"));e.drawImage(t,0,0,n.width,n.height)}}(e,u,d);var T=` `,P=['
','
','
','
'+D+"
",'
','
'+n.title+"
",'
',x,"
","
","
","
","
"];return document.body.append(S.parseToDOM(T)),document.body.append(S.parseToDOM(P.join(""))),document.querySelector("#__stay_sinffer_modal")}()).style.visibility="visible";const m=document.querySelector("#__stay_sinffer_modal ._stay-sinffer-popup");document.querySelector("#__stay_sinffer_modal .__stay-sinffer-content").classList.add("__stay-trans");let f=setTimeout((function(){p.classList.add("__stay-show-modal"),m.style.visibility="visible",clearTimeout(f),f=0}),400);p.addEventListener("touchmove",(t=>{t.preventDefault(),t.stopPropagation()}),!1),p.addEventListener("touchstart",(t=>{t.preventDefault(),p.classList.remove("__stay-show-modal"),m.style.animation="fadeout .5s;";let e=setTimeout((()=>{p&&document.body.removeChild(p),document.body.removeChild(document.querySelector("#__style_sinffer_style")),clearTimeout(e),e=0}),200)}),!1);const g=document.querySelectorAll("#__stay_sinffer_modal ._stay-quality-item");if(g&&g.length)for(let t=0;t{t=t.target.getAttribute("stay-download");var e=document.createElement("a");e.href=t,e.click()}))}function k(t){var e,r;return D()?(e=u.decodeFunStr,e=new Function("return "+e),r=S.queryParams(t,"url"),t=S.queryParams(t,"s"),t=e()(decodeURIComponent(t)),N(r=decodeURIComponent(r)+"&sig="+t)):""}function N(t){if(function(){let t=D();return t&&!!u.decodeSpeedFunStr}()&&!S.queryURLParams(t,"oid")){let n="",o=0;for(var e in f)f[e]&&void 0!==f[e]&&(o+=1,n+="&"+e+"="+f[e]);var r=S.queryURLParams(t,"n");r&&(g[r]||(g[r]=function(t){try{var e=u.decodeSpeedFunStr;return new Function("return "+e)()(decodeURIComponent(t))}catch(t){return""}}(r)),g[r])&&(t=S.replaceUrlArg(t,"n",g[r]),t+=n)}return t}function I(t,e){t&&(f.cver=f.cver||S.queryURLParams(t,"cver"),j(t)),e&&Object.keys(e).length&&(e.playbackTracking&&e.playbackTracking.ptrackingUrl&&e.playbackTracking.ptrackingUrl.baseUrl&&j(e.playbackTracking.ptrackingUrl.baseUrl),e.responseContext)&&e.responseContext.serviceTrackingParams&&e.responseContext.serviceTrackingParams.length&&e.responseContext.serviceTrackingParams.forEach((t=>{"CSI"==t.service&&t.params.length&&t.params.forEach((t=>{"cver"==t.key&&(f.cver=f.cver||t.value)}))}))}function j(t){f.cpn=f.cpn||S.queryURLParams(t,"cpn"),f.ptk=f.ptk||S.queryURLParams(t,"ptk"),f.oid=f.oid||S.queryURLParams(t,"oid"),f.ptchn=f.ptchn||S.queryURLParams(t,"ptchn"),f.pltype=f.pltype||S.queryURLParams(t,"pltype")}function M(t){return t&&t.length?(t.sort(S.compare("bitrate")),(t=t[0]).url||(D()?k(t.signatureCipher):t.signatureCipher)):""}function F(){let t=setTimeout((()=>{{let t={},e=window.location.host,r=(l=window.location.href,t.hostUrl=l,null);-1{"hls"==e.format&&"string"==typeof e.quality&&e.videoUrl&&n.push({downloadUrl:e.videoUrl,qualityLabel:e.quality,quality:Number(e.quality)}),!e.defaultQuality||"boolean"!=typeof e.defaultQuality&&"number"!=typeof e.defaultQuality||(r=e.defaultQuality,t.downloadUrl)||(t.downloadUrl=e.videoUrl)})),t.qualityList=n}}return t}function V(t){if(!t)return{};var e={};if(e.title=t.title,e.poster=t.poster,e.downloadUrl=t.playurl,t.clarityUrl&&t.clarityUrl.length){let r=[];t.clarityUrl.forEach((t=>{t.vodVideoHW,r.push({downloadUrl:t.url,qualityLabel:t.title,quality:t.key})})),e.qualityList=r}return e}function H(){var t=document.querySelector(".art-player-wrapper .art-video-player .art-poster");return t&&(t=t.getAttribute("style"),t)?S.matchUrlInString(t):(t=document.querySelector("#bdMainPlayer .art-video-player .art-poster"),t&&(t=t.getAttribute("style"),t)?S.matchUrlInString(t):"")}function W(){var t=document.querySelector(".adVideoPageV3 .curVideoInfo h3.videoTitle");return(t=t||document.querySelector(".video-info .video-info-title"))||(t=document.querySelector(".video-main .video-content .video-title .video-title-left"))?t.textContent:""}function B(t){let e={};var r=window.ytplayer;let o=S.queryURLParams(l,"v")||S.getLastPathParameter(l);o||(i=document.querySelector("#player-control-container > ytm-custom-control > div.inline-player-controls > a.inline-player-overlay"))&&(i=i.getAttribute("href"),o=S.queryParams(i,"v"));var i=r?r.bootstrapPlayerResponse:{};if(o){let l="";if(t)e.poster=t.getAttribute("poster")||"",e.downloadUrl=t.getAttribute("src"),t=t.getAttribute("title"),e.title=t;else if(!r||!i.videoDetails)return e;if(i&&i.videoDetails&&i.streamingData&&(!o||o===i.videoDetails.videoId)){I("",i);t=i.videoDetails;var a=t.title||"",s=(t=(e.title=a,t.thumbnail),t=(t&&(t=t.thumbnails)&&t.length&&(e.poster=t.pop().url),i.microformat&&i.microformat.playerMicroformatRenderer&&i.microformat.playerMicroformatRenderer.thumbnail&&i.microformat.playerMicroformatRenderer.thumbnail.thumbnails.length&&(e.poster=i.microformat.playerMicroformatRenderer.thumbnail.thumbnails[0].url),i.streamingData),t.adaptiveFormats);if(t.formats,l=l||"",!s||!s.length||l&&l.replace(/\s+/g,"")!==a.replace(/\s+/g,""))e.title=l||$(),e.downloadUrl=G();else{let o=[];new Set;var c;t=r.bootstrapWebPlayerContextConfig?r.bootstrapWebPlayerContextConfig.jsUrl:"";try{t&&(c=Y(m=t))&&(n.randomPathUuid=c)}catch(tt){}let i={},a=[],l=[],u=(s.forEach((t=>{var e,r=t.mimeType;-1{var r=i[t],n=r.filter((t=>{if(-1{if(-1(t.qualityLabel&&-1{var r=window.localStorage.getItem("__stay_decode_str");r&&(u=JSON.parse(r)).pathUuid&&u.pathUuid==t&&u.decodeFunStr?(T(),Z(t,e,!1)):Z(t,e,!0)};if(m=window.ytplayer?window.ytplayer.bootstrapWebPlayerContextConfig?window.ytplayer.bootstrapWebPlayerContextConfig.jsUrl:"":m)p=Y(m),t(p,m);else for(let e=1;e<10;e++){let r="">{(d=document.querySelector("#player-base"))&&d.getAttribute("src")&&(m=d.getAttribute("src"),p=Y(m),t(p,m),_.forEach((t=>{clearTimeout(t)})))}),200*e)}(e),d&&d.getAttribute("src"))break;_.push(r)}}}async function Z(e,r,n){o=e,i=window.location.href;var o,i,a=await new Promise(((e,r)=>{if(t)s.runtime.sendMessage({from:"sniffer",operate:"fetchYoutubeDecodeFun",pathUuid:o,pathUrl:i},(t=>{t=t&&t.decodeFunObj?t.decodeFunObj:{},e(t)}));else{const t=Math.random().toString(36).substring(2,9),r=n=>{n.data.pid===t&&"GET_YOUTUBE_DECODE_FUN_RESP"===n.data.name&&(e(n.data.decodeFunObj),window.removeEventListener("message",r))};window.postMessage({id:t,pid:t,name:"GET_YOUTUBE_DECODE_FUN",pathUuid:o,pathUrl:i}),window.addEventListener("message",r)}}));a&&Object.keys(a).length&&a.status&&200==a.status?(J(e,a.decodeFunStr,a.decodeSpeedFunStr),n&&T()):Q(e,r)}function J(t,e,r){u={pathUuid:t,decodeFunStr:e,decodeSpeedFunStr:r},n.decodeFunStr=e,n.decodeSpeedFunStr=r,window.localStorage.setItem("__stay_decode_str",JSON.stringify(u))}async function Q(e,r){if(r&&e)try{var n=await(await fetch("https://m.youtube.com"+r)).text();if(n){var o=n.match(/[a-zA-Z0-9]+\=function\(a\)\{[\r\n|a]\=a\.split\(\"\"\).*return\s+a\.join\(\"\"\)\};/g);let r="";if(r=o&&o.length?o[0]:r){let o="";var i=n.match(/var\s+[a-zA-Z0-9]+\=\{[a-zA-Z0-9]{2}\:function[\s\S]*(a\.reverse\(\)|splice\(0\,b\)|length\]\=c)\}\};/g);if(o=i&&i.length?i[0]:o)if(r=r.replace(/[a-zA-Z0-9]+\=function\(a\)\{/g,"function decodeFun(a){"+o)){let o="";var a=n.match(/[a-zA-Z0-9]+\=function\(a\)\{var\sb=a\.split\(\"\"\)[\s\S]*\}return\sb\.join\(\"\"\)\};/g);if(o=(o=a&&a.length?a[0]:o)&&o.replace(/^[a-zA-Z0-9]+\=function\(a\)\{/g,"function decodeSpeedFun(a){"),function(t){try{var e=new Function("return "+t),r=e()(decodeURIComponent("%3D%3DQmbTSWlgLuztoft4F_uqQieS7_jBtboKab9zSp5WRdSAiApcTRtZLjBmFtzLXphJ0x_haWmWIhVtdAg8jD1rsKkRKAhIQRw8JQ0qOAOA"));if(decodeURIComponent("https://rr5---sn-o097znsk.googlevideo.com/videoplayback%3Fexpire%3D1679042695%26ei%3DJ9QTZJ6FFKeksfIPkaSL-Aw%26ip%3D2602%253Afeda%253A30%253Aae86%253A40e7%253A53ff%253Afe8b%253A9a97%26id%3Do-AI3u_uLu7PqvSwoVFwTG0fSk-puen4XBHxlLqco9MH8Q%26itag%3D135%26aitags%3D133%252C134%252C135%252C160%252C242%252C243%252C244%252C278%26source%3Dyoutube%26requiressl%3Dyes%26mh%3D_m%26mm%3D31%252C26%26mn%3Dsn-o097znsk%252Csn-a5meknzk%26ms%3Dau%252Conr%26mv%3Dm%26mvi%3D5%26pl%3D44%26initcwndbps%3D2135000%26vprv%3D1%26mime%3Dvideo%252Fmp4%26ns%3DwhOrAPi40PxLIKHeHvAaoDIL%26gir%3Dyes%26clen%3D18438908%26dur%3D584.533%26lmt%3D1635010443575003%26mt%3D1679020854%26fvip%3D5%26keepalive%3Dyes%26fexp%3D24007246%26c%3DMWEB%26txp%3D5432434%26n%3D3BrEIxrXFc7SkC%26sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cvprv%252Cmime%252Cns%252Cgir%252Cclen%252Cdur%252Clmt%26lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%26lsig%3DAG3C_xAwRgIhAKYBlOvRZiHPnnEJJ5foNn7LZU1cgGvfyO3WU9TjETfZAiEA6PvSgRq0gdcsBBTTj0VHXybmMwb-ouW2TVIYGmG_PG0%253D")+"&sig="+r)return 1}catch(t){}}(r)){var l=e,c=r,u=o;if(t)s.runtime.sendMessage({from:"sniffer",operate:"saveYoutubeDecodeFun",pathUuid:l,randomFunStr:c,randomSpeedFunStr:u},(t=>{}));else{const t=Math.random().toString(36).substring(2,9),e=r=>{r.data.pid===t&&"SAVE_YOUTUBE_DECODE_FUN_STR_RESP"===r.data.name&&window.removeEventListener("message",e)};window.postMessage({id:t,pid:t,name:"SAVE_YOUTUBE_DECODE_FUN_STR",pathUuid:l,randomFunStr:c,randomSpeedFunStr:u}),window.addEventListener("message",e)}}J(e,r,o)}else J(e,"","");else J(e,"","")}else J(e,"","")}else J(e,"","")}catch(r){J(e,"","")}else J(e,"","")}function tt(t){!async function(){i||(e=!0,i=await C(),e=!1),a||(r=!0,a=await R(),r=!1)}(),X(),A(t)}tt(!1),document.onreadystatechange=()=>{"complete"===document.readyState&&tt(!0)},Object.defineProperty(n,"randomPathUuid",{get:function(){return randomPathUuid},set:function(t){(randomPathUuid=t)!=p&&Z(p=t,m,!1)}}),Object.defineProperty(n,"decodeFunStr",{get:function(){return decodeFunStr},set:function(t){(decodeFunStr=t)&&T()}})} handleInjectParseVideoJS(false);10;e++){let>("video>("video>("video")?(e=t.height,object.prototype.hasownproperty.call(i,e)?i[e].push(t):i[e]=[t]):-1("pornhub.com")?(r=(r=document.queryselector("#videoshow>;t++)g[t].addeventlistener("touchstart",(t=>0?(a=0,i<=o&&(a=s.div(s.sub(i,d),2))):0==l?i<=o&&(a=s.div(s.sub(i,d),2)):(t=s.add(4,36),t=s.add(s.add(d,t),s.add(s.mul(_,38),36)),l>(a)&&(s=' (i,2)&&(d=o),document.queryselector("#__stay_sinffer_modal"));(p=p||function(){let>("muiplayer.js.org")){let>("mobile.twitter.com")))if(-1("youtube.com")){var>

这篇关于Python实现某云在线客服退款保持联系,自动化测试selenium元素定位,利用多线程Thread实现脚本暂停/继续执行,采用pyttsx3实现语音播报排名情况的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/401936

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推