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

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque