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

相关文章

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

《springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法》:本文主要介绍springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大... 目录1.开通阿里云百炼,获取到key2.新建SpringBoot项目3.工具类4.启动类5.测试类6.测

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加