背景
每天上班太忙碌,没有时间刷微博,新闻发展的太快,生怕错过微博热搜,看着手边的博灵语音通知终端,决定自己写一个脚本,让它给我读新闻!
少废话,先看东西
实现了以下效果
- 每
90分钟
刷新一次热搜 - 依次朗读这些新闻热搜
- 因为设备放在办公室,晚上并不会扰民,只有午休需要屏蔽,当拉取时间在
12点-14点
时,自动推迟一小时
终端日志截图
脚本运行截图
播报效果图
实现代码
热搜使用了聚合数据
的热搜Api实现,脚本使用的Python3
实现,因为想测试一下通知终端的Modbus TCP协议,所以采用了Modbus TCP协议推送,之后会放出HTTP协议的代码。
Modbus TCP协议说明文档点我查看
注意:
- 需要使用pymodbus类库,根据版本不同,有两处需要修改的地方,代码中已标注
- Modbus TCP一次只能传52个字,之后会编写HTTP版本的代码,更简单!
- 午休时间在代码中体现,可根据自己需求自行修改
import struct
import time
# pymodbus(v2.0)使用pymodbus.client.sync
# pymodbus(v3.0)使用pymodbus.client
from pymodbus.client.sync import ModbusTcpClient
from pymodbus.register_write_message import WriteMultipleRegistersRequest
import urllib3, json, datetime
import traceback
def encodeStr(s):
raw = []
for bit in s:
bit = int.from_bytes(bit.encode('utf-8'), 'big')
word = [0] * 2
word[0] = (0xffff0000 & bit) >> 16
word[1] = 0xffff & bit
raw += word
return raw
def sendModbusTCP(tts):
data_arr = []
led_style = 15
led_color = [0] * 8
led_color[0] = 0x8A
led_color[1] = 0x2be2
play_time = 0
tone = 0
tts_speed = 0
led_flag = 0x0601
empty = [0] * 2
tts_str = encodeStr(tts)
data_arr += [led_style] + led_color + [play_time] + [tone] + [tts_speed] + [led_flag] + empty + tts_str
# print([hex(x) for x in data_arr])
# print(len(data_arr))
# 新版本pymodbus(v3.x)必须要传后面的1,旧版本pymodbus(v2.0)不能传
# request = WriteMultipleRegistersRequest(100, data_arr, 1)
request = WriteMultipleRegistersRequest(100, data_arr)
try:
res = client.execute(request)
print(res)
except Exception as e:
with open('modbus.log', 'a') as f:
f.write('\n' + datetime.datetime.now().__str__() + '\n')
f.write(tts + '\n')
traceback.print_exc(file=f)
if __name__ == '__main__':
client = ModbusTcpClient(host='192.168.0.216', port=502)
http = urllib3.PoolManager()
while True:
now = datetime.datetime.now()
if 12 <= now.hour <= 14:
print("午休时间")
time.sleep(3600)
continue
print('拉取时间:' + now.__str__() + '\n')
news = http.request('get', 'http://apis.juhe.cn/fapigx/networkhot/query?key=自己的key')
news = news.data.decode('utf-8')
with open('resou_raw.log', 'a', encoding='utf-8') as f:
f.write('\n' + datetime.datetime.now().__str__() + '\n')
f.write(news)
news = json.loads(news)
i = 1
tts = ''
with open('resou.log', 'a', encoding='utf-8') as f:
f.write('\n' + datetime.datetime.now().__str__() + '\n')
for item in news['result']['list']:
print(str(i) + '-' + item['title'] + '\n')
f.write(str(i) + item['title'] + '\n')
if len(tts) + len(str(i) + '。' + item['title'] + ' ') > 51:
sendModbusTCP(tts)
tts = ''
tts += str(i) + '。' + item['title'] + ' '
i += 1
sendModbusTCP(tts)
time.sleep(5400)