开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

楼主: 1393267359
收起左侧

[易语言] 求一个最新能解析蓝奏云直链的易语言模块

[复制链接]
结帖率:89% (8/9)
发表于 2026-1-21 18:21:30 | 显示全部楼层   四川省乐山市
lsqiang 发表于 2026-1-21 16:31
才写的模块,可以直接用
https://bbs.ijingyi.com/thread-14871485-1-1.html

傻瓜式使用
QQ20260121-162800.jpg
回复

使用道具 举报

结帖率:100% (6/6)

签到天数: 5 天

发表于 2026-1-21 19:44:28 | 显示全部楼层   安徽省蚌埠市
1393267359 发表于 2026-1-20 19:49
https://wwaxn.lanzout.com/iXsc83gmg8sj能解析这个地址的

这玩意解析出来怎么那么 像我一个客户的文件 不能说一样 完全一摸一样  更新又不能用了? 不应该啊,我这里显示 11-3日期 完全好好的,都没变动

补充内容 (2026-1-21 19:45):
不对,好像你那个技术没接受是吧。。哈哈~~
回复

使用道具 举报

结帖率:89% (8/9)

签到天数: 5 天

发表于 2026-1-21 21:09:14 | 显示全部楼层   四川省乐山市

附件,最新的,刚写的

蓝奏云解析.rar

647.87 KB, 下载次数: 4

回复

使用道具 举报

结帖率:91% (21/23)

签到天数: 5 天

发表于 2026-1-21 22:20:11 | 显示全部楼层   山东省临沂市
  
import re
import time
import json
import execjs
import requests
from urllib.parse import urljoin, urlparse
class LanZouCloudParser:
def __init__ (self):
# 定义JavaScript计算函数
self.acw_js_code = """
var MASK_B64="MzAwMDE3NjAwMDg1NjAwNjA2MTUwMTUzMzAwMzY5MDAyNzgwMDM3NQ==";
var POS_LIST=[15,35,29,24,33,16,1,38,10,9,19,31,40,27,22,23,25,13,6,11,39,18,20,8,14,21,32,26,2,30,7,4,17,5,3,28,34,37,12,36];
function base64Decode (str){
var chars= ' ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var output= ' ';
var buffer=0,bits=0;
for (var i=0;i<str.length;i++){
var c=chars.indexOf (str.charAt (i));
if (c<0)continue;
buffer= (buffer<<6)|c;
bits+=6;
if (bits>=8){
bits-=8;
output+=String.fromCharCode ( (buffer>>bits)&0xFF);
}
}
return output;
}
function compute_acw_sc_v2 (arg1){
var posToIdx={};
for (var i=0;i<pos_list.length;i++)postoidx[pos_list[i]]=i;
var output=[];
for (var j=1;j<=arg1.length;j++){
var idx=posToIdx[j];
if (typeof idx=== ' number'&&idx<pos_list.length){
output[idx]=arg1.charAt (j-1);
}
}
var rearranged=output.join ( ' ');
var mask=base64Decode (MASK_B64);
var result= ' ';
var k=0;
while (k<rearranged.length&&k<mask.length){
var dataChunkText=rearranged.substr (k,2);
var maskChunkText=mask.substr (k,2);
if (!dataChunkText||!maskChunkText)break;
var dataChunk=parseInt (dataChunkText,16);
var maskChunk=parseInt (maskChunkText,16);
var xorVal=dataChunk^maskChunk;
var hex=xorVal.toString (16);
if (hex.length<2)hex= ' 0'+hex;
result+=hex;
k+=2;
}
return result.toLowerCase ();
}
"""
# 编译JavaScript
self.ctx = execjs.compile (self.acw_js_code)
# 请求头
self.headers = {
' User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36',
' Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
' Accept-Language': 'zh-CN,zh;q=0.9',
' Accept-Encoding': 'gzip, deflate, br',
' Connection': 'keep-alive',
' Upgrade-Insecure-Requests': '1',
' Sec-Fetch-Dest': 'document',
' Sec-Fetch-Mode': 'navigate',
' Sec-Fetch-Site': 'same-origin',
' Sec-Fetch-User': '?1',
' Cache-Control': 'max-age=0',
' sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',
' sec-ch-ua-mobile': '?0',
' sec-ch-ua-platform': '"Windows"'
}
# 创建会话,自动处理cookies
self.session = requests.Session ()
self.session.headers.update (self.headers)
def compute_acw_sc_v2 (self, arg1):
"""计算acw_sc__v2值"""
try:
result = self.ctx.call ( ' compute_acw_sc_v2', arg1)
return result
except Exception as e:
print (f"JavaScript计算错误: {e}")
return ""
def extract_file_id_from_page (self, html_content):
"""从HTML页面中提取文件ID"""
# 从报告链接中提取(最常见)
# 格式: /q/jb/?f=271513649&report=1
report_match = re.search (r ' /q/jb/\?f=(\d+)', html_content)
if report_match:
return report_match.group (1)
# 尝试其他可能的模式
file_match = re.search (r ' file=(\d+)', html_content)
if file_match:
return file_match.group (1)
return "271513649"  # 默认值
def parse_fn_page (self, fn_url, original_page_html):
"""解析fn页面,获取最终下载链接"""
try:
print (f"访问fn页面: {fn_url}")
# 先提取文件ID(从原始页面)
file_id = self.extract_file_id_from_page (original_page_html)
print (f"使用的文件ID: {file_id}")
# 访问fn页面
response = self.session.get (fn_url)
response.raise_for_status ()
html_content = response.text
print (f"fn页面长度: {len (html_content)}")
# 提取关键参数
# 1. 提取 wp_sign
wp_sign_match = re.search (r"var wp_sign = ' ([^']+)'", html_content)
if wp_sign_match:
wp_sign = wp_sign_match.group (1)
print (f"提取到wp_sign: {wp_sign}")
else:
print ("未找到wp_sign")
return None
# 2. 提取 ajaxdata(通常是 VJvp)
ajaxdata_match = re.search (r"var ajaxdata = ' ([^']+)'", html_content)
if ajaxdata_match:
ajaxdata = ajaxdata_match.group (1)
print (f"提取到ajaxdata: {ajaxdata}")
else:
# 使用默认值
ajaxdata = "VJvp"
print (f"使用默认ajaxdata: {ajaxdata}")
# 3. 构建正确的ajax_url(使用正确的文件ID)
base_url = f"{urlparse (fn_url).scheme}://{urlparse (fn_url).netloc}"
ajax_url = f"{base_url}/ajaxm.php?file={file_id}"
print (f"构建的ajax_url: {ajax_url}")
# 构建POST数据
post_data = {
' action': 'downprocess',
' websignkey': ajaxdata,
' signs': ajaxdata,
' sign': wp_sign,
' websign': '',
' kd': 1,
' ves': 1
}
print (f"POST数据: {post_data}")
# 设置AJAX请求头
ajax_headers = {
' User-Agent': self.headers['User-Agent'],
' Referer': fn_url,
' Origin': base_url,
' Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
' X-Requested-With': 'XMLHttpRequest',
' Accept': 'application/json, text/javascript, */*; q=0.01',
' Accept-Language': 'zh-CN,zh;q=0.9'
}
# 立即发送AJAX请求
print (f"发送POST请求到: {ajax_url}")
ajax_response = self.session.post (ajax_url, data=post_data, headers=ajax_headers)
print (f"AJAX响应状态码: {ajax_response.status_code}")
# 检查响应内容
response_text = ajax_response.text
print (f"AJAX响应内容: {response_text[:200]}...")
# 尝试解析JSON
try:
json_data = ajax_response.json ()
print (f"解析到的JSON: json_data")
# 修正:zt=1 表示成功
if json_data.get ( ' zt') == 1:
dom = json_data.get ( ' dom', '')
url = json_data.get ( ' url', '')
if url and dom:
# 处理转义字符
dom = dom.replace ( ' \\/', '/')
url = url.replace ( ' \\/', '/')
# 构建最终下载链接
# 注意:url 以 ' ?' 开头,所以应该是 dom + "/file" + url
if url.startswith ( ' ?'):
download_url = f"{dom}/file{url}"
else:
download_url = f"{dom}/file/{url}"
print (f"最终下载链接: {download_url}")
return download_url
else:
print (f"缺少必要字段: dom={dom}, url={url}")
else:
print (f"状态不为1: {json_data.get ( ' zt')}")
print (f"错误信息: {json_data.get ( ' inf', '未知错误')}")
except json.JSONDecodeError as e:
print (f"JSON解析错误: {e}")
print (f"完整响应: {response_text}")
return None
except requests.exceptions.RequestException as e:
print (f"请求错误: {e}")
return None
except Exception as e:
print (f"解析错误: {e}")
return None
def parse_lanzou_url (self, url):
"""解析蓝奏云链接"""
try:
print (f"正在解析链接: {url}")
# 第一次请求
print ("第一次请求...")
response = self.session.get (url)
response.raise_for_status ()
# 打印cookies信息
print (f"第一次响应Cookies: {self.session.cookies.get_dict ()}")
# 提取arg1
html_content = response.text
arg1_match = re.search (r"arg1= ' ([0-9A-F]+)'", html_content)
if not arg1_match:
arg1_match = re.search (r ' arg1=\'([0-9A-F]+)\'', html_content)
if not arg1_match:
print ("未找到arg1参数")
return None
arg1 = arg1_match.group (1)
print (f"提取到的arg1: {arg1}")
# 计算acw_sc__v2值
acw_sc_v2_value = self.compute_acw_sc_v2 (arg1)
print (f"计算出的acw_sc__v2值: {acw_sc_v2_value}")
if not acw_sc_v2_value:
print ("acw_sc__v2计算失败")
return None
# 添加acw_sc__v2到cookies
self.session.cookies.set ( ' acw_sc__v2', acw_sc_v2_value)
# 立即进行第二次请求
print ("第二次请求...")
self.session.headers.update ({ ' Referer': url})
response2 = self.session.get (url)
response2.raise_for_status ()
second_page_html = response2.text
print (f"第二次响应状态码: {response2.status_code}")
print (f"第二次响应长度: {len (second_page_html)}")
# 检查是否包含下载链接(iframe)
iframe_match = re.search (r ' src="(/fn\?[^"]+)"', second_page_html)
if not iframe_match:
print ("未找到iframe下载链接")
return None
iframe_src = iframe_match.group (1)
print (f"找到iframe链接: {iframe_src}")
# 转换为完整URL
if iframe_src.startswith ( ' /'):
base_url = f"{urlparse (url).scheme}://{urlparse (url).netloc}"
fn_url = urljoin (base_url, iframe_src)
else:
fn_url = iframe_src
# 提取文件信息
filename_match = re.search (r ' ]*>([^<]+)
' , second_page_html)
if filename_match:
filename = filename_match.group (1)
print (f"文件名: {filename}")
else:
filename = "未知文件名"
filesize_match = re.search (r ' 大小:([^<]+)
' , second_page_html)
if filesize_match:
filesize = filesize_match.group (1)
print (f"文件大小: {filesize}")
else:
filesize = "未知大小"
# 解析fn页面获取最终下载链接
download_url = self.parse_fn_page (fn_url, second_page_html)
if download_url:
return {
' filename': filename,
' filesize': filesize,
' download_url': download_url,
' iframe_url': fn_url,
' raw_html': second_page_html
}
else:
print ("未能获取到下载链接")
return {
' filename': filename,
' filesize': filesize,
' iframe_url': fn_url,
' raw_html': second_page_html
}
except requests.exceptions.RequestException as e:
print (f"请求错误: {e}")
return None
except
</rearranged.length&&k<mask.length){
</pos_list.length){
</pos_list.length;i++)postoidx[pos_list]=i;
</str.length;i++){
回复

使用道具 举报

签到天数: 1 天

发表于 2026-1-22 17:52:06 | 显示全部楼层   浙江省湖州市
lsqiang 发表于 2026-1-21 16:31
才写的模块,可以直接用
https://bbs.ijingyi.com/thread-14871485-1-1.html

他准备白嫖
回复

使用道具 举报

结帖率:0% (0/1)
 楼主| 发表于 2026-1-25 14:39:08 | 显示全部楼层   广东省茂名市
Behavior 发表于 2026-1-21 19:44
这玩意解析出来怎么那么 像我一个客户的文件 不能说一样 完全一摸一样  更新又不能用了? 不应 ...

什么一样
回复

使用道具 举报

结帖率:0% (0/1)
 楼主| 发表于 2026-1-25 14:39:36 | 显示全部楼层   广东省茂名市
lsqiang 发表于 2026-1-21 21:09
附件,最新的,刚写的

我用了 解析是空的 解析不出来了
回复

使用道具 举报

结帖率:100% (23/23)
发表于 2026-1-25 14:40:57 | 显示全部楼层   广东省深圳市
话说这个经常更新吗? 我怎么是一直用着没看到更新啥啊?

蓝奏云解析模块--2026-01-25.e

592.45 KB, 下载次数: 3

回复

使用道具 举报

结帖率:100% (6/6)

签到天数: 5 天

发表于 2026-1-25 21:36:22 | 显示全部楼层   安徽省蚌埠市

下载的内容
回复

使用道具 举报

结帖率:100% (6/6)

签到天数: 5 天

发表于 2026-1-26 23:34:56 | 显示全部楼层   安徽省蚌埠市

https://bbs.ijingyi.com/thread-14871770-1-1.html 你那文件分享挺奇怪啊 更新了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表