孔子曰:学而时习之~
初学python,一边看语法,一边看参考例程,写了一个小程序,做个存档,否则很容易忘记。
这次的目标是利用某种子下载网站,编写一个磁力链下载种子文件的工具。
常见的种子文件磁力链接的格式是这样的:magnet:?xt=urn:btih:XXX
其中的XXX就是种子文件的哈希值,而这个网站可以输入哈希值,下载对应的种子文件,
但是该网站广告内容太多了,用浏览器打开不太方便呀~,具体是哪个网站我就不说了,哈哈~~~,自己看代码吧。
# 磁力链接转种子文件
# QQ:446252221 <[email protected]>
import io
import os
import time
import urllib.request
import urllib.parse
import html.parser
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
#HTML解析
class html_dumper(html.parser.HTMLParser):
def __init__(self):
html.parser.HTMLParser.__init__(self)
self.key = ""
def handle_starttag(self, tag, attrs):
if tag == "input":
if attrs[1][1] == "key":
self.key = attrs[2][1]
return None
def handle_data(self, data):
return None
def handle_comment(self, data):
return None
def get_key(self):
return self.key
#第1步获取key
def step1_get_key(hash):
req_url = "http://www.storetorrents.com/hash/" + hash
req = urllib.request.Request(url=req_url, method="GET")
req.add_header("User-Agent", USER_AGENT)
try:
respon = urllib.request.urlopen(req)
#print("第1步:", respon.status)
respon_cook = respon.getheader("Set-Cookie")
respon_body = respon.read()
dumper = html_dumper()
dumper.feed(respon_body.decode("utf-8"))
#print("key:", dumper.get_key())
return dumper.get_key()
except BaseException as e:
print("urlopen error:", e)
return None
#第2步获取captcha
def step2_get_captcha():
req_url = "https://storetorrents.xyz/captcha"
req = urllib.request.Request(url=req_url, method="GET")
req.add_header("User-Agent", USER_AGENT)
#req.add_header("Cookie", "__cfduid=dac7712102a83c5d8e2d3fb4ec6f407031553505032; PHPSESSID=25d2d5kd6erdqbo1fv4o4e8vs2")
try:
respon = urllib.request.urlopen(req)
#print("第2步:", respon.status)
respon_body = respon.read()
respon_cook = respon.getheader("Set-Cookie")
file_name = "captcha.jpg"
file_obj = open(file_name, "wb")
file_obj.write(respon_body)
file_obj.close()
os.system(file_name)
#print("cookie:", respon_cook)
cookie_list = respon_cook.split(";", -1)
cookie = cookie_list[0] + ";" + cookie_list[5].split(",", 1)[1]
#print("cookie:", cookie)
return cookie
except BaseException as e:
print("urlopen error:", e)
return None
#第3步下载文件
def step3_download(key, hash, captcha, cookie):
req_url = "https://storetorrents.xyz/download"
req_values = {}
req_values["key"] = key
req_values["infohash"] = hash
req_values["captcha"] = captcha
req_body = urllib.parse.urlencode(req_values)
#print("key encode:", req_body)
req = urllib.request.Request(url=req_url, method="POST", data=bytes(req_body, encoding="utf8"))
req.add_header("User-Agent", USER_AGENT)
req.add_header("Cookie", cookie)
try:
respon = urllib.request.urlopen(req)
#print("第3步:", respon.status)
type = respon.getheader("Content-Type")
#print("Type:", type)
if type.startswith("text/html"):
print(respon.read().decode("utf-8"))
return None
respon_body = respon.read()
file_name = hash + ".torrent"
file_obj = open(file_name, "wb")
file_obj.write(respon_body)
file_obj.close()
print("下载完成!")
except BaseException as e:
print("urlopen error:", e)
return None
#入口
os.system("title 磁力转换工具")
os.system("echo off")
while(True):
hash = input("magnet:?xt=urn:btih:")
key = step1_get_key(hash)
if key == None:
print("未找到该资源!")
os.system("pause")
continue
cookie = step2_get_captcha()
if cookie == None:
print("获取验证码失败!")
os.system("pause")
continue
code = input("请输入验证码:")
step3_download(key, hash, code, cookie)
os.system("pause")
简单解释一下代码内容:
整体流程是:
1.访问A页面,解析HTML得到其中的重要参数key.
2.访问B页面,得到cookie和验证码.
3.输入验证码:由于python显示图片要用第三方库实现,所以暂时没有用代码实现。取而代之的是下载图片,然后用Windows系统图片查看器打开它,然后人工识别验证码。
4.访问C页面,下载种子文件,这个页面使用POST方式请求,并附加B页面得到的cookie和3个参数:由A页面得到的key,由B页面得到的验证码,和种子文件的哈希值。
5.下载C页面返回的数据写入到文件,这就是我们要的种子文件啦。