过了这好几年之后,总感觉自己已经从一个技术博主,变成了一个生活博主。
年龄越来越大了之后,探索能力,学习能力逐渐的下降。接受新事物的能力也日渐式微,总感觉想做一些东西而力不从心。
很多东西多年以前就知道了,但是想自己去做的时候却总感觉没什么头绪,不知道该从哪里开始。
今天又看到教主转的微博,同样原内容图片被夹了。
教主发的那个这就发挥作用了,是一张截图:
这么个东西。
至于原理,很久之前教主就大概提过,说出来也简单,就是利用cdn的缓存删除时间差,在节点未删除之前遍历所有的cdn节点去搜索图片。知道原理之后,要实现也简单,目前微博图片主要有四个域名+两个alias:
weibo_cdn_domain_list = [ 'wx1.sinaimg.cn', 'wx2.sinaimg.cn', 'wx3.sinaimg.cn', 'wx4.sinaimg.cn', 'weiboimgwx.gslb.sinaedge.com', 'weiboimgwx.grid.sinaedge.com' ]
既然有了域名,那么也简单,通过python库直接解析所有的地址即可:
def get_ipv4_ips(domain_name): try: ipv4_addresses = [] answers = dr.resolve(domain_name, "A") for rdata in answers: if str(rdata).startswith("192."): continue else: ipv4_addresses.append(str(rdata)) return ipv4_addresses except Exception as e: print(e) return None def get_ipv6_ips(domain_name): try: ipv6_addresses = [] answers = dr.resolve(domain_name, "AAAA") for rdata in answers: if str(rdata).startswith("::"): continue else: ipv6_addresses.append(str(rdata)) return ipv6_addresses except Exception as e: print(e) return None def get_all_ips(): ip_dict_list = [] for domain in weibo_cdn_domain_list: ips = get_ipv4_ips(domain) v6_ips = get_ipv6_ips(domain) print(domain, ips) domain_ips = { 'domain': domain, 'ipv4': ips, 'ipv6': v6_ips } ip_dict_list.append(domain_ips) return ip_dict_list
然而,这么高却也存在问题,就是拿到的ip地址都是国内解析到的,与命令查询到的一致:
四个域名加起来不多几十个ip地址,然而,仔细观察教主的图片会发现,解析出来的ip大约有2000+按照图片进度猜测。
即使加上ipv6的也远远少于教主的ip地址数量。
并且尝试下载的时候全部失败了,无法遍历到删除的文件,再次查看教主的图片,搜了下ip地址,并不是国内的:
那么,可能的原因在于,教主拿到了所有的ip地址,包括海外的,并且海外节点的删除时间会更晚,这样能找到被夹的图片的概率自然也越大。
那么直接去itdog.cn拉取所有的ip地址列表:
一个域名对应800+ip地址,那么这么看来基本跟教主的数量就能对上了。剩下的就简单了,告知思路,剩下的大家可以自由发挥了,主要代码可以暂停录像看屏幕代码:
1.将所有的域名解析为ip 2.讲ip与域名组装为: domain_ips = { 'domain': domain, 'ipv4': ips, 'ipv6': v6_ips } 格式。 3.遍历域名下的所有ip地址,拼接请求链接指定host。 4.针对请求数据进行处理,目前已知默认的占位符图片长度为:6067, 8308, 8844这几个,对于返回长度10000以下的,可以直接抛弃掉。 5.请求到数据之后保存为文件即可。
效果图:
视频演示: