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

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四: