以前工作中需要经常进行批量生成百度网盘分享链接,几年前写了一个自己用的批量生成链接工具,这几年没有使用这个功能,这两需要 使用才发现百度网盘网页端更新变化很大。新版百度网盘网页端采用动态获取分页数据生成table,数据会随着滚动条的移动更新为新数据,且旧数据不保留,所以需要动态将获取到的所有分页数据保存下来。经过修改可以正常使用了。
工具图片如下:
Task<CefSharp.JavascriptResponse> task = webview.GetBrowser().MainFrame.EvaluateScriptAsync(js);
task.Wait();
经过很长时间的调试,最终确定ChromiumWebBrowser这个插件在调用EvaluateScriptAsync进行异步取值时,传入的JS代码不能带有async标记,否则将获取不到网页返回的结果。
在百度网盘页面想一次性取得多页数据时,又不得不使用async和await进行延时取值。这个矛盾导致无法获取超过一个页面的结果。
最终的解决方法是,在.net代码中进行延时分页取值,结果分多次存入到.net代码的List中。
经测试,该程序可以顺利批量生成几百条甚至更多的百度网盘分享链接。
核心代码如下:
/// <summary>
/// 由于新版百度网盘网页端采用动态获取分页数据生成表格,数据会随着滚动条的移动更新为新数据,且旧数据不保留
/// 所以必须将获取到的所有分页数据保存下来
/// </summary>
private void fillTaskList()
{
this.TaskList.Clear();
try
{
bool has = true;
while (has)
{
has = false;
Thread.Sleep(1000);
object result = ExcuteJsScriptForResult(JavaScriptText.JsGetChoosedList);
if (result != null)
{
List<object> subtaskList = (List<object>)result;
foreach (object subtask in subtaskList)
{
if (!TaskList.Contains(subtask.ToString()))
{
TaskList.Add(subtask.ToString());
has = true;//取到最后一页时,不会有新增项,也不会执行这一句。
}
}
}
}
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
/// <summary>
/// 开始批量分享
/// </summary>
private void StartBatShare()
{
// this.ShareDataList.Clear();
this.fillTaskList();