MYF

北邮人自动做种脚本

这两天随便看了看python3,写了个比较有意思的脚本。

背景

这个脚本其实我早就想写了,但是一直想写的是一个能帮我自动挂种的,就是那种一出free种子就自动下载然后做种,形成一个队列,然后出新的再把队列pop到刚好可以添加一个新的种子。本来想写一个的,后来看看我这个月的搬瓦工,竟然用了200多个g,我的小伙伴们科学上网的需求似乎很大。我以为每个月有个几十个g就够了呢。

今天看python3,看了一下smtp邮件的东西,觉得还挺简单,随手写了一下。

需求分析

这个脚本的目地很简单,在最短的时间内让我知道有合适的种子可以下了。所以流程的pipeline如下

  1. 获取free种子列表
  2. 筛选合适大小的种子
  3. push email

使用者需要做的是什么的:

  1. 登录。byr使用cookie来进行验证,所以只要抓取cookie就ok了。
  2. 确定种子大小要求。比如种子太大,没那么大地方,种子太小,似乎没有挂的必要。
  3. 设置定时执行
  4. 有一个smtp的邮箱,我这里使用qq邮箱

Code

说明:

  1. 在函数mail中,你需要修改my_sender, my_pass, my_user三个字段,分别代表邮件信息
  2. Line 31 需要设置自己的cookie
  3. Line 60 代表离当前多少秒内的种子进行通知
  4. Line 61 代表可接受的种子的最小size
  5. Line 62 代表可接受的种子的最大size
import requests, re, time, smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
def mail(Subject):
my_sender='your_send_email@qq.com' # 发件人邮箱账号
my_pass = 'your_pwd' # 发件人邮箱密码(当时申请smtp给的口令)
my_user='your_recv_email@qq.com' # 收件人邮箱账号,我这边发送给自己
ret=True
try:
msg=MIMEText('Have a good day.','plain','utf-8')
msg['From']=formataddr(["BYR机器人",my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To']=formataddr(["主人",my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject']=Subject # 邮件的主题,也可以说是标题
server=smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是465
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender,[my_user,],msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit()# 关闭连接
except Exception:# 如果 try 中的语句没有执行,则会执行下面的 ret=False
ret=False
if ret:
print("邮件发送成功")
else:
print("邮件发送失败")
return
def notifyGoodTorrent(timeInterval, minTorrentSize, maxTorrentSize):
hd={
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36",
"Cookie": "Your_cookie"
}
req = requests.get('http://bt.byr.cn/torrents.php?spstate=2', headers=hd)
html = req.text
re_title = re.compile('<a title="(.*?)" href="details.')
re_time = re.compile('<span title="(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})">.*?rowfollow">(.*?)</td')
data = [] # data of free list
for a, b in zip(re_title.findall(html), re_time.findall(html)):
uptime = time.strptime(b[0],"%Y-%m-%d %H:%M:%S")
filesize = b[1].replace('<br />', "")
if filesize[-2] == 'G':
filesize = float(filesize[:-2])*1024
elif filesize[-2] == 'M':
filesize = float(filesize[:-2])
elif filesize[-2] == 'T':
filesize = float(filesize[:-2])*1024*1024
else:
continue
title = a
data.append((uptime, filesize, title))
for item in data:
distance = time.time() - time.mktime(item[0])
if distance < timeInterval and item[1] > minTorrentSize and item[1] < maxTorrentSize:
mail("【BYR】[" + str(item[1]/1024) + "GB]"+ item[2])
def main():
timeInterval = (2 * 24 * 60 + 0) * 60 # in sec
minTorrentSize = 2 * 1024 # in MB
maxTorrentSize = 10 * 1024 # in MB
notifyGoodTorrent(timeInterval, minTorrentSize, maxTorrentSize)
if __name__ == '__main__':
main()
view raw byrbt.py hosted with ❤ by GitHub

Further work

有空的时候研究一下transmission的rpc,看看能不能直接实现完全脱离人工的方法