闲的无事,不想学习,做了一个小的定时脚本来检测韩剧网站的熟肉更新。因为虽然剧每周都是按日期播,但是字幕组们可能就没有那么准时了,与其自己手动刷新,不如懒(不是叫服务器帮我完成,反正服务器除了架了个插件的后台没什么别的用。

#获取更新

一般一个字幕组的剧集主页都是不变的,这样方便各个地方索引,但是资源的网站基本都是变的,因为可能的版权啊之类的,所以要一层一层一层的拨开我的心找到最终的资源页,才能知道有木有更新。

1
2
3
root
├── ju.py
└── data.json

#剧数据

当然,一个小小的脚本是不需要数据库来杀鸡牛刀的,就直接写入文件读取文件吧(因为要记录之前多少集,才有更新一说)。

1
2
3
4
5
6
7
8
[
{
"url": "https://newzmz.com/details-xN3YGxeW.html",
"count": 0,
"name": "\u867d\u7136\u662f\u7cbe\u795e\u75c5\u4f46\u6ca1\u5173\u7cfb",
"element": ["<a class=\"addgz\" href=\"([\\S]+)\"", "<tr>"]
}
]

以上就是data.json的内容,因为未来可能会有很多剧需要追更,所以最外层是个数组,然后才是每个剧的字典。

因为功能很简单,所以字段暂时先弄这么多,后面需要再加

  • url: 就是前面说的字幕组的剧集主页,不会变的。
  • count: 记录当前集数。
  • name: 就是这部剧的名字,发邮件的时候要带上的,这里其实是《虽然是精神病但没关系》的 unicode 字符。
  • element: 这个就是比较重要的东西了,是一个正则表达式,前面的 n-1 个是用来找到最终的资源页面的,最后一个是用来数数的,就是有多少集。

#主体代码

为了兼容,写的是python2的版本。

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
import os
import json
import time
import urllib2
import re

发邮件直接 copy 幕课的,因为以前有个电费提醒的脚本,所以直接拿过来用了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
my_sender='i@onns.xyz'    # 发件人邮箱账号
my_pass = '' # 发件人邮箱密码
my_user='onns@onns.xyz'

def mail(to,content):
ret=True
try:
msg=MIMEText(content,'plain','utf-8')
msg['From']=formataddr(["Onns",my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To']=formataddr(['to',to]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject']="新剧提醒" # 邮件的主题,也可以说是标题

server=smtplib.SMTP_SSL("smtp.exmail.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender,[to,],msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
except Exception, e: # 如果 try 中的语句没有执行,则会执行下面的 ret=False
print e
ret=False
return ret

主体代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
f = open('/root/data.json', 'r')
data = json.loads(f.read())
f.close()
new_data = []

for ju in data:
html = ''
url = ju['url']
for ele in ju['element']:
html = urllib2.urlopen(url).read().decode('utf-8')
results = re.findall(ele, html)
url = results[0]
count = len(results)
if count > ju['count']:
ret=mail(my_user,u'《'+ju['name']+ u'》更新啦!')
ju['count'] = count
new_data.append(ju)

f = open('/root/data.json', 'w')
f.write(json.dumps(new_data))
f.close()

#上服务器

1
$ crontab -e

把定时脚本加进去

1
*/10 * * * 6,7,1 /usr/bin/python /root/ju.py /dev/null 1>/dev/null

因为不用很精细就 10 分钟执行一次,周末晚间更新所以 6、7、1 三天才需要跑的。

截图

完。