孔子曰:学而时习之~
初学python,一边看语法,一边看参考例程,写了一个小程序,做个存档,否则很容易忘记。
这次的目标是利用某种子下载网站,编写一个磁力链下载种子文件的工具。
常见的种子文件磁力链接的格式是这样的:magnet:?xt=urn:btih:XXX
其中的XXX就是种子文件的哈希值,而这个网站可以输入哈希值,下载对应的种子文件,
但是该网站广告内容太多了,用浏览器打开不太方便呀~,具体是哪个网站我就不说了,哈哈~~~,自己看代码吧。
# 磁力链接转种子文件
# QQ:446252221 <446252221@qq.com>
import io
import os
import time
import urllib.request
import urllib.parse
import html.parserUSER_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 Nonedef handle_data(self, data):return Nonedef handle_comment(self, data):return Nonedef get_key(self):return self.key#第1步获取key
def step1_get_key(hash):req_url = "http://www.storetorrents.com/hash/" + hashreq = 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 cookieexcept 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"] = keyreq_values["infohash"] = hashreq_values["captcha"] = captchareq_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 Nonerespon_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")continuecookie = step2_get_captcha()if cookie == None:print("获取验证码失败!")os.system("pause")continuecode = 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页面返回的数据写入到文件,这就是我们要的种子文件啦。