首页 > 其他分享 >【原创】抖音关键词搜索

【原创】抖音关键词搜索

时间:2022-12-05 22:24:09浏览次数:47  
标签:info log get url text 关键词 ctx 抖音 搜索

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!

抖音关键词搜索脚本

环境

  • win10
  • 雷电5
  • Android7.1
  • Python3.9
  • Auto.js 7 PRO
  • mitmproxy4.0

Auto.js 根据关键词搜索并滑动

function main(url, num, gap, timeout) {
    // 这里写脚本的主逻辑
    threads.start(function () {
        //脚本开始时间
        var starttime = new Date();
        console.info("脚本开始时间:"+Time_format(starttime))
        console.info("启动脚本")
        console.info("滑动执行次数:"+num+"次")
        console.info("滑动间隔时间:"+gap+"秒")
        console.info("数据加载超时时间:"+timeout+"秒")
        //悬浮窗 控制台
        console.show(); 

        //启用按键监听
        events.observeKey();
        //监听音量上键按下
        events.onKeyDown("volume_down", function(event){
            console.info("停止脚本");
            exit();
        });
        // 效验代理
        proxy();

        //启动APP
        toast("启动APP")
        opendy();
        
        // 点击搜索按钮
        console.info("定位搜索按钮");
        while(!(id("ex5").exists())){
            console.info("搜索按钮定位失败");
            sleep(5000)
        };
        console.info("成功定位搜索按钮");
        search = id("ex5").findOne();
        right =  search.bounds().centerX(); //X值中间位置
        top = search.bounds().centerY();  //Y值中间位置
        // console.info(right, top);
        click(right, top);
        console.info("点击搜索按钮");
        sleep(3000);
        // 请求搜索关键词接口
        var url1 = url.toString(); //需要强转一下数据类型
        var wds = get_wd(url1);
        // 循环执行搜索任务
        for (var i=0;i<wds.length;i++){    
            var wd=wds[i]; //获取数组指定下标内容  下标从零算起
            console.log("获取关键词:" +wd)
            // 设置搜索文本
            console.info("定位搜索输入框");
            while(!(id("fl_intput_hint_container").exists())){
                console.info("搜索输入框定位失败");
                sleep(5000)
            };
            console.info("输入关键词:");
            id("et_search_kw").setText(wd)
            console.info("点击搜索");
            // 点击搜索
            // id("l+h").text("搜索").click()
            // console.info("成功定位搜索按钮");
            search_1 = id("l+h").findOne();
            // 提取控件坐标中心位置并点击
            coordinate_1 = JSON.parse(JSON.stringify(search_1.bounds())); //提取组工动态坐标值
            centerX = search_1.bounds().centerX();
            centerY = search_1.bounds().centerY();
            console.info(centerX, centerY);
            click(centerX, centerY);

            console.info("数据加载中。。。");

            // 判断数据是否加载成功
            id_name = "ifj" //数据加载小图标id
            if (!(Refresh(timeout, id_name))){
                toast('数据加载失败!重试')
                toast("关闭抖音APP")
                var packagename = getPackageName("抖音");
                killApp(packagename);
                sleep(2000)
                return
            };
            console.info("数据加载成功")

            // 开始滑动
            // num=滑动执行次数
            // gap=滑动间隔时间
            // 页面加载超时时间
            if (!(slide(wd, num, gap, timeout))){
                exit;  
            };
        };
        console.info("结束脚本")
        var endTime = new Date();
        console.info("脚本结束时间:"+Time_format(endTime))
        console.info("脚本执行用时:"+Time_calculation(endTime-starttime));
    });
};

在这里插入图片描述

mitm数据抓包并存储

import json
import datetime
import mitmproxy.http
from mitmproxy import ctx, http


class Joker:
    def request(self, flow: mitmproxy.http.HTTPFlow):
        """
        flow: 自变量写法,用来定义变量类型
        发送请求的所有数据
        可以修改发送的请求参数
        """
        url = "https://aweme.snssdk.com/aweme/v1/general/search/"
        # 调试用
        # 筛选出以上面url为开头的url
        if flow.request.url.startswith(url):
            # 打印请求的url
            ctx.log.warn(111111111)
            ctx.log.warn(f'{flow.request.url}')
            ctx.log.warn(f'{flow.request.pretty_url}')
            ctx.log.warn(2222222222)
            ctx.log.warn(f'{flow.request.host}')
            ctx.log.warn(flow.__dict__)

    def response(self, flow: mitmproxy.http.HTTPFlow):
        """
        flow: 自变量写法,用来定义变量类型
        接收到的响应数据
        """
        # 筛选出以上面url为开头的url
        if flow.request.url.startswith(url):
            # ctx.log.error(111111111111)
            text = flow.response.get_text()
            # 将已编码的json字符串解码为python对象
            content = json.loads(text)
            # 评论内容
            comments = content['data']
            # 提取关键词
            keyword = content.get("global_doodle_config").get("keyword")
            ctx.log.warn(f'关键词:{keyword}')
            for comment in comments:
                doc_type = comment.get('doc_type')
                # ctx.log.info(doc_type)
                # ctx.log.info(type(doc_type))   
                if doc_type != 3:
                    # ctx.log.info("不是广告跳过")
                    continue    
                # 标题
                desc = comment.get('aweme_info').get("desc")
                # 视频链接
                share_url = comment.get('aweme_info').get("share_url")
                # 视频id
                aweme_id = comment.get('aweme_info').get("aweme_id")
                text = f'{keyword}|{desc}|{share_url}|{aweme_id}'
                ctx.log.error(text)
                self.save_connect(text=text)
                ctx.log.error("数据保存成功!")

        # 筛选出以上面url为开头的url
        if flow.request.url.startswith(url_2):
            # ctx.log.error(22222222222222)
            # 提取出来是一个不规则的字符串,有时是5行,有时是9行
            text = flow.response.get_text()
            text = text.split("\n")
            for i in text:
                # 将已编码的json字符串解码为python对象
                try:
                    content = json.loads(i)
                    # 评论内容
                    comments = content['data']
                    # 提取关键词
                    keyword = content.get("global_doodle_config").get("keyword")
                    ctx.log.warn(f'关键词:{keyword}')
                    for comment in comments:
                        doc_type = comment.get('doc_type')
                        # ctx.log.info(doc_type)
                        # ctx.log.info(type(doc_type))   
                        if doc_type != 3:
                            # ctx.log.info("不是广告跳过")
                            continue    
                        # 标题
                        desc = comment.get('aweme_info').get("desc")
                        # 视频链接
                        share_url = comment.get('aweme_info').get("share_url")
                        # 视频id
                        aweme_id = comment.get('aweme_info').get("aweme_id")
                        text = f'{keyword}|{desc}|{share_url}|{aweme_id}'
                        ctx.log.error(text)
                        self.save_connect(text=text)
                        ctx.log.error("数据保存成功!")
                except:
                    continue

    def save_connect(self, text):
        """
        保存数据
        """
        filename = datetime.datetime.now().strftime('%Y-%m-%d') + '.txt'
        with open(filename, 'a+', encoding='utf-8') as f:
            f.write(text)
            f.write('\n')


addons = [
    Joker()
]

在这里插入图片描述

效果

请添加图片描述

资源下载

https://download.csdn.net/download/qq_38154948/87245284


本文仅供学习交流使用,如侵立删!

标签:info,log,get,url,text,关键词,ctx,抖音,搜索
From: https://www.cnblogs.com/c1033383881/p/16953716.html

相关文章

  • Springboot 系列 (20) - Springboot+ElasticSearch 实现全文搜索(二)
    在“Springboot系列(19)-Springboot+ElasticSearch实现全文搜索(一)”里我们演示了安装配置ElasticSearch和使用curl调用ElasticSearchAPI,本文将演示在Springb......
  • Springboot 系列 (19) - Springboot+ElasticSearch 实现全文搜索(一)
    全文检索(Full-textSearch)是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索......
  • 常见业务 | 搜索框的筛选
    1.筛选重置2.下拉筛选3.操作-编辑/取消4.分标签分页展示(全部、进行中、已完成)  1.全部订单2.操作-查看3刷新......
  • 【A*路径搜索算法】基于A星的最优避障路径搜索算法的MATLAB仿真+GUI界面
    1.软件版本MATLAB2021a2.基本原理A算法是启发式算法重要的一种,主要是用于在两点之间选择一个最优路径,而A的实现也是通过一个估值函数F=G+HG表示该点到起始点位所需要......
  • 力扣 99. 恢复二叉搜索树 [Morris]
    99.恢复二叉搜索树给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。示例1:输入:root=[1,3,......
  • vim搜索功能
    1、退出insert模式2、输入/3、输入想要搜索的词4、回车5、此时会标记第一个找到的词6、n跳转到下一个匹配点,N跳转到上一个匹配点 注:也可以用?代替/ ......
  • 使用Sencha Touch框架开发Twitter搜索应用
    目前,Android和iphone两大主流手机的应用开发吸引了大批开发人员的眼光。而开发人员最期望的是能尽可能运用旧有的技术知识,去设计这些新的应用,因此出......
  • 每日算法之二叉搜索树的后序遍历序列
    JZ33二叉搜索树的后序遍历序列描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数......
  • CentOS7.0下完美部署Solr 搜索引擎
    一、环境准备:系统环境:CentOS-7.0.1406       tomcat-7.0.29       jdk-7u9       solr-4.7.0首先将软件包上传到/tmp目录下1、 jdk安装[ro......
  • 力扣 98. 验证二叉搜索树
    98.验证二叉搜索树给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节......