我是靠谱客的博主 可爱小丸子,这篇文章主要介绍基于wxbot微信框架的微信遥控电视程序,现在分享给大家,希望可以做个参考。

最近买了个树莓派,打算在上面部署一点小应用。因此,想到了这个基于wxbot微信框架的遥控电视程序。程序的原理比较简单:对wxbot类进行继承,修改其中的信息处理函数,使其对自己给自己发送的消息进行处理,再根据发送的内容,调用selenium打开chrome浏览器,并播放相应的视频。程序的启动和退出均可通过微信命令遥控。


然而,在开发完之后才发现树莓派上的Raspberry pi系统上装不上flash插件,chrome浏览器也不好装,只能暂时停止移植到树莓派上的计划……

首先宣传一下wxbot框架:github: https://github.com/liuwons/wxBot,作者的csdn: http://blog.csdn.net/tobacco5648/article/details/50722321。这个框架比较好用,只需要继承一下它的wxbot类,再实现一下schedule和handle_msg_all函数就可以实现对微信的各种控制了。

下面是自己的代码。首先拿到tv.cctv/live和tv.cntv/btv1里的链接地址。在tv.cctv/live,拿到右侧的地址有些难度,因此在这里选择了手动添加- _- ||,然后可以对tv.cntv/btv1里的“卫视频道”和“城市频道”标签下的内容做爬虫,同样拿到链接后存储在channel_link.txt文件中。以“城市频道”标签为例,爬虫代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
driver=webdriver.Chrome(executable_path=chromedriver_path,chrome_options=options) driver.get('http://tv.cntv.cn/live/btv1') WebDriverWait(driver, 3).until(lambda x: driver.find_element_by_id('vplayer')) driver.maximize_window() label=driver.find_element_by_link_text(u'城市频道') ActionChains(driver).move_to_element(label) channel_file=open('city_channel_new1.txt','a') channel_num=53 #前面的“卫视频道”排号到52 for j in range(2,48,3): channel_div=driver.find_elements_by_xpath('//*[@id="channelpane4"]/div['+str(j)+']/div') for i in range(1,len(channel_div)+1): channel_link=driver.find_element_by_xpath('//*[@id="channelpane4"]/div['+str(j)+']/div['+str(i)+']/div/h3/a') channel_info = str(channel_num) + ' ' + channel_link.get_attribute('href') + ' ' + unicode(channel_link.text) + 'n' channel_file.writelines(channel_info) channel_num+=1 channel_file.close()

不知道为何channel_info中取channel_link.text取不到……

然后是下面的主程序部分,主要就是对wxbot的继承,实现的sysbot类:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# -*- coding=utf-8 -*- from wxbot import * from selenium import webdriver from selenium.common.exceptions import * from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.action_chains import ActionChains import time class Systembot(WXBot): CHROME_DRIVER_PATH='D:\WebDrivers\chromedriver_win32\chromedriver.exe' channel_list=[] channel_dict={} driver=None def __init__(self): WXBot.__init__(self) self.usr_name = 'self'

以上是一些初始化操作,其中channel_dict存放频道号与频道链接,频道号作为key,链接作为value。

下面是程序的启动函数:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
def set_dict(self): option=webdriver.ChromeOptions() option.add_argument('Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36') option.add_extension('2.3.8_0.crx') option.add_extension('cntvLive_20160119.crx') channel_file=open('channellink.txt','r') self.driver=webdriver.Chrome(executable_path=self.CHROME_DRIVER_PATH,chrome_options=option) handles=self.driver.window_handles curr_handle=self.driver.current_window_handle for h in handles: if h!=curr_handle: self.driver.switch_to.window(h) self.driver.close() self.driver.switch_to.window(curr_handle) self.driver.maximize_window() self.channel_dict['1']=['http://tv.cctv.com/live/cctv1/','CCTV-1'] self.channel_dict['2']=['http://tv.cctv.com/live/cctv2/','CCTV-2'] self.channel_dict['3'] = ['http://tv.cctv.com/live/cctv3/','CCTV-3'] self.channel_dict['4'] = ['http://tv.cctv.com/live/cctv4/','CCTV-4'] self.channel_dict['5'] = ['http://tv.cctv.com/live/cctv5/','CCTV-5'] self.channel_dict['6'] = ['http://tv.cctv.com/live/cctv6/','CCTV-6'] self.channel_dict['7'] = ['http://tv.cctv.com/live/cctv7/','CCTV-7'] self.channel_dict['8'] = ['http://tv.cctv.com/live/cctv8/','CCTV-8'] self.channel_dict['9'] = ['http://tv.cctv.com/live/cctvjilu/','CCTV-9'] self.channel_dict['10'] = ['http://tv.cctv.com/live/cctv10/','CCTV-10'] self.channel_dict['11'] = ['http://tv.cctv.com/live/cctv11/','CCTV-11'] self.channel_dict['12'] = ['http://tv.cctv.com/live/cctv12/','CCTV-12'] self.channel_dict['13'] = ['http://tv.cctv.com/live/cctv13/','CCTV-13-新闻'] self.channel_dict['14'] = ['http://tv.cctv.com/live/cctvchild/','CCTV-14-少儿'] self.channel_dict['15'] = ['http://tv.cctv.com/live/cctv15/','CCTV-15-音乐'] self.channel_dict['16'] = ['http://tv.cctv.com/live/cctv5plus/','CCTV-5+'] for line in channel_file: self.channel_dict[line.split(' ')[0]]=[line.split(' ')[1],' '] channel_file.close()

采用带扩展程序的方式通过selenium启动chrome浏览器。其中,2.3.8_0.crx是Adguard插件,去除广告;而cntvlive.crx为cntv的插件。去除广告的原因在于为了使播放时自动全屏,需模拟双击视频的方式,然而有广告存在的话就会点到广告从而进入广告页面,而那个handle部分是因为调用Adguard插件会启动很多Tab页,会占用较多资源,因此将多余的标签页全部关闭,只保留最后打开的那个。

随后向字典中添加内容,手动+从文件读取两种方式。

最后一部分:处理微信信息

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def handle_msg_all(self, msg): if msg['msg_type_id']==1: if self.channel_dict.has_key(msg['content']['data']): self.driver.get(self.channel_dict[msg['content']['data']][0]) if int(msg['content']['data'])<17: WebDriverWait(self.driver,3).until(lambda x:self.driver.find_element_by_id('hds_flash_player')) video = self.driver.find_element_by_id('hds_flash_player') else: WebDriverWait(self.driver, 3).until(lambda x: self.driver.find_element_by_id('vplayer')) video = self.driver.find_element_by_id('vplayer') time.sleep(5) ActionChains(self.driver).double_click(video).perform() ActionChains(self.driver).double_click(video).perform() if unicode(msg['content']['data']) == u'get': self.set_dict() elif unicode(msg['content']['data']) == u'full': try: video = self.driver.find_element_by_id('hds_flash_player') except NoSuchElementException: video = self.driver.find_element_by_id('vplayer') ActionChains(self.driver).double_click(video).perform() ActionChains(self.driver).double_click(video).perform() elif unicode(msg['content']['data']) == u'exit': self.driver.quit() sys.exit(0)

msg_type_id为1时表示是自己发送的消息。随后就是根据消息的内容判断要执行的功能,发送的消息为频道号,为1-109。由于央视频道采用的播放器和其他频道采用的播放器不一样,因此还需根据频道号判断页面的视频元素的id号。

这里使用了WebDriverWait智能等待的方式,使视频一出来马上进入全屏。值得注意的是ActionChains这个函数,虽然函数名为double_click,但经试验发现实际上执行的是单击操作,因此需要连续调用两次才能使视频全屏。

full命令是当视频万一没有自动全屏时,可以发送这条命令手动令视频进入全屏状态。

主函数:

复制代码
1
2
3
4
5
# -*- coding=utf-8 -*- from systembot import Systembot if __name__=='__main__': systembot=Systembot() systembot.run()


程序运行效果:

首先会显示二维码,用微信扫一下登录。


然后输入get并发送给自己:


稍等片刻,浏览器开启



输入频道号并发送:


进入画面:



换台及全屏:




Ok。

这个基于wxbot的微信遥控电视程序就到此结束。由于微信可能会有延迟,因此导致换台时可能反应不是很及时;此外,地方台不知为何无法自动全屏,需要输入full命令手动全屏。


可惜这个东西现在暂时无法部署到树莓派上……或者,有谁知道如何在树莓派上装iso格式的ubuntu-mate或flash视频插件的也可以告诉我,争取把它移植到树莓派上,从而将树莓派变成一个移动机顶盒。


最后

以上就是可爱小丸子最近收集整理的关于基于wxbot微信框架的微信遥控电视程序的全部内容,更多相关基于wxbot微信框架内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部