js教程

油猴脚本获取抖音视频JOSN数据

我的站长站 2023-07-23 人阅读

脚本介绍

重写XMLHttpRequest的Send函数达到拦截。
注意,是用户主页,比如:https://www.douyin.com/user/MS4wLjABAAAAd4IEE9JOezbMuKOhRFAEAwlN3D5qgBDvTjjqV2g5FHM?is_search=0&list_name=follow&nt=0

页面5秒钟后会在页面右下角生成一个按钮,点击后会在控制台打印数据

油猴脚本获取抖音视频JOSN数据
油猴脚本截图

一个是原始数据,一个是经过处理的数据(标题+作品地址)

油猴脚本代码

// ==UserScript==
// @name         抖音用户主页抓取
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://www.douyin.com/user/*
// @icon         https://lf1-cdn-tos.bytegoofy.com/goofy/ies/douyin_web/public/favicon.ico
// @grant        none
// ==/UserScript==
 
(function() {
    'use strict';
    var isFirst = true;
    var aweme_list = [];
    var nickname = "";
 
    function extractDataFromScript() {
        var scriptTag = document.getElementById('RENDER_DATA');
        if (!scriptTag) return;
 
        var encodedContent = scriptTag.innerHTML;
        var decodedContent = decodeURIComponent(encodedContent);
        var json = JSON.parse(decodedContent);
 
        for (var prop in json) {
            if (json.hasOwnProperty(prop) && prop !== "_location" && prop !== "app") {
                var user = json[prop];
                nickname = user.user.user.nickname;
                var post = user.post;
                var data = post.data;
                aweme_list = aweme_list.concat(data);
            }
        }
    }
 
    function createButton() {
        const button = document.createElement('button');
        button.textContent = '点击我';
        button.style.position = 'fixed';
        button.style.right = '20px';
        button.style.bottom = '30%';
        button.addEventListener('click', buttonClick);
        document.body.appendChild(button);
    }
 
    function buttonClick() {
        console.log(aweme_list);
        const files = [];
        aweme_list.forEach((item) => {
            if (item.aweme_type === 0 || item.awemeType === 0 || item.aweme_type === 61 || item.awemeType === 61) {
                try {
                    files.push({ name: item.desc, url: item.video.play_addr.url_list[0] });
                } catch (error) {
                    files.push({ name: item.desc, url: item.video.playAddr[0].src });
                }
            } else if (item.aweme_type === 68 || item.awemeType === 68) {
                var urlList = item.images.map(img => {
                    try {
                        return img.url_list[0];
                    } catch (error) {
                        return img.urlList[0];
                    }
                });
                files.push({ name: item.desc, urlList: urlList });
            }
        });
 
        var data = { nickname: nickname, aweme_list: files };
        console.log(data);
    }
 
    function interceptResponse() {
        var originalSend = XMLHttpRequest.prototype.send;
        XMLHttpRequest.prototype.send = function() {
            var self = this;
            this.onreadystatechange = function() {
                if (self.readyState === 4) {
                    if (self._url.indexOf("/aweme/v1/web/aweme/post") > -1) {
                        var json = JSON.parse(self.response);
                        var data = json.aweme_list;
                        aweme_list = aweme_list.concat(data);
                    }
                }
            };
            originalSend.apply(this, arguments);
        };
    }
    function scrollPageToBottom() {
        const SCROLL_DELAY = 1000; // Adjust the delay between each scroll action (in milliseconds)
        let scrollInterval;
 
        function getScrollPosition() {
            return window.scrollY || window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
        }
 
        function scrollToBottom() {
            window.scrollTo(0, document.body.scrollHeight);
        }
 
        function hasReachedBottom() {
            return getScrollPosition() >= (document.body.scrollHeight - window.innerHeight);
        }
 
        function scrollLoop() {
            if (!hasReachedBottom()) {
                scrollToBottom();
            } else {
                console.log("Reached the bottom of the page!");
                clearInterval(scrollInterval);
                // You can perform additional actions here after reaching the bottom of the page.
            }
        }
 
        function startScrolling() {
            scrollInterval = setInterval(scrollLoop, SCROLL_DELAY);
        }
 
        function createButton() {
            const button = document.createElement('button');
            button.textContent = '点击开始下拉';
            button.style.position = 'fixed';
            button.style.right = '20px';
            button.style.bottom = '35%';
            button.addEventListener('click', startScrolling);
            document.body.appendChild(button);
        }
 
        createButton();
    }
 
    // To start scrolling, call the function:
    scrollPageToBottom();
 
 
    if (isFirst) {
        console.log("首次加载");
        isFirst = false;
        setTimeout(function() {
            extractDataFromScript();
            createButton();
        }, 5000); // 延迟时间为5000毫秒(即5秒)
    }
 
    interceptResponse();
 
})();


相关推荐
  • 油猴脚本
  • js获取
  • 利用油猴脚本突破百度网盘下载限速方法

    教程介绍分享一篇自用利用油猴脚本突破百度网盘下载限速方法,手机安卓版,PC版现在已经很难破解了,下载可以达到svip会员效果。油猴脚本百度网盘不限速截图准备软件①Firefox Nightly②idm+③(Tampermonkey)油猴④软件小妹的脚本《百度网盘简易下载助手》...

    经验分享 1801 3年前
  • 油猴脚本去除csdn登录才能复制限制
    油猴脚本去除csdn登录才能复制限制

    作为程序猿,应该会经常去csdn参(chao)考(xi)代码,今天在复制一篇文章的代码的时候,突然发现需要登录才能复制,但是我用github授权登录的时候居然失败了!突发奇想,写个脚本解除这个限制吧!稍微看一下文档结构...

    浏览器插件 160 2年前
  • 百度网盘提取码自动填写油猴脚本
    百度网盘提取码自动填写油猴脚本

    插件介绍百度网盘提取码自动填写油猴脚本,新上线的网盘油猴脚本,它可以实现识别网页中的网盘提取码并自动填写的功能。这款油猴脚本支持自动填充百度云、360盘等的提取码,还额外带有淘宝天猫找优惠...

    浏览器插件 756 3年前
  • js如何获取指定网址中的参数

    之前我的站长站分享的都是用JS获取当前网址URL中的参数,我们这次教大家如何获取指定网址中的参数。js获取网址参数代码JS获取网址的方法都一样,我们同样使用函数的方法。function getQueryParam(url, param) {// 创建一个新的URL对象const urlObj = ne...

    js教程 6 1个月前
  • JavaScript如何获取自己的加载路径

    我们都知道JavaScript获取当前路径的方法用:var currentFullPath = window.location.href;console.log(currentFullPath);这样就可以获取完整路径。今天我的站长站分享不是获取当前URL路径,而且获取JS自己本身的加载路径,比如获取:<script src="https://...

    js教程 7 1个月前
  • js获取字符长度函数分享

    js获取字符长度函数function objLen(str) { if (str == null) return 0; if (typeof str != "string") { str += ""; } return str.replace(/[^\x00-\xff]/g, "01").length;}函数使用方法var arr1 = &#39;ABCD1234&#39;console.log(objLen(...

    js教程 13 10个月前
最新更新
  • js返回上一页、刷新页面代码大全

    返回上一页代码:<a href="javascript:history.go(-1)">返回上一页</a>onclick返回上一页代码:<a href="javasc...

    js教程 2天前
  • js语言!=与!==的区别

    != (不等于)!= 是松散的不等于运算符。它在比较两个值时,会先进行类型转换(type coercion),然后再比较值是否不...

    js教程 6天前
  • JS防止网站被扒的解决方法

    这个代码能够直接保护整个站,而不再是单个页面,直接把代码放到自己的网站上,如果是博客建议放到header.php头部...

    js教程 3周前
  • Hexo插件开发实战教程

    Hexo的插件嵌入有两种方式,一种是通过脚本(Scripts)的方式引入,一种是通过插件(Packages)的方式将自定义的插件内...

    js教程 1个月前
  • JavaScript定时删除指定元素方法

    JavaScript定时删除指定元素一般用到自动隐藏的效果功能上面,主要用到了JS的setTimeout语法。下面是一个定时...

    js教程 1个月前