首页 > 其他分享 >Charles导入功能实现 代码说明

Charles导入功能实现 代码说明

时间:2023-12-14 11:15:12浏览次数:25  
标签:yapi url 代码 Charles 导入 headers api str method

需要用的的包:haralyzer 主要目的:解析har文件

下载包命令:pip3 install haralyzer



from haralyzer import HarParser, HarPage
from urllib.parse import urlparse, urlunparse
import json
import logging
import requests
import re
import os

logger = logging.getLogger('django')


class CharlesAnalysis:

    @staticmethod
    def charlesAnalysis(harFile, rjgc, token):
        """
        :param harFile: charles文件地址
        :param rjgc: 环境区分
        :param token: token值
        :return:
        """
        
        """
        解析har文件
        """
        with open(harFile, 'r') as f:
            har_parser = HarParser(json.loads(f.read()))

        charles = []
        for entry in har_parser.har_data['entries']:
            """
            过滤har文件 筛选出有效请求
            """
            if entry['request']['method'] == "OPTIONS":
                pass
            else:
                # 正则提取域名
                pattern = r"(https?://[^/]+)/.*"

                match = re.match(pattern, entry['request']['url'])
                if match:
                    domain_name = str(match.group(1)) + "/"
                    logger.info(domain_name)

                # 获取请求url
                url = entry['request']['url'].split(domain_name)[1].split("?")[0]
                logger.info("请求的url:" + str(url))
                
                # 获取 YaPiURL
                yaPiUrl = url.split("/", 1)[1]
                logger.info("yaPiUrl:" + str(yaPiUrl))

                # 获取请求方式
                method = entry['request']['method']
                logger.info("请求方式:" + str(method))
                
                # 请求头解析
                new_headers = {}
                headers = entry['request']['headers']
                for j in headers:
                    if ":" in j['name']:
                        pass
                    else:
                        new_headers[j['name']] = j['value']

                # 获取请求头
                logger.info("请求头:" + str(new_headers))
                
                # 变更请求头中 cookie的值
                new_headers.update({"cookie": rjgc + "=" + token})

                json_headers = json.dumps(new_headers)
                logger.info("转换cookie:" + str(new_headers))

                # 解析har文件 整体请求数据
                logger.info("整体请求数据:" + str(entry['request']))
                newQueryString = {}
                postData = "{}"
                if 'postData' in entry['request']:
                    postData = entry['request']['postData']['text']
                    if "queryString" in entry['request']:
                        if entry['request']['queryString'] == []:
                            queryString = entry['request']['queryString']
                            logger.info("请求参数queryString:" + str(queryString))

                        else:
                            newQueryString = entry['request']['queryString']
                            logger.info("请求参数queryString:" + str(newQueryString))

                    else:
                        pass
                    logger.info("请求参数postData:" + str(postData))
                else:
                    newQueryString = entry['request']['queryString']
                    logger.info("请求参数queryString:" + str(newQueryString))

                # 根据平台定义的规则 转换请求方式:1:get 2.post 3:put 4:delete
                api_method = ""
                if method == "GET":
                    api_method = 1
                elif method == "POST":
                    api_method = 2
                elif method == "PUT":
                    api_method = 3
                elif method == "DELETE":
                    api_method = 4
                    
                # 质量平台json传参必填,需要判断 如空则 赋值 {}
                if postData == "":
                    postData = "{}"
                else:
                    pass
                
                # 解析所有相关数据后,进行组合拼接 获取需要的数据
                charles_dict = {
                    "yaPiUrl": yaPiUrl,
                    "url": url,
                    "method": api_method,
                    "header": json_headers,
                    "postData": postData,
                    "queryString": newQueryString,
                    "domain_name": domain_name
                }
                charles.append(charles_dict)
        logger.info("解析后的参数:" + str(charles))

        return charles

    @staticmethod
    def yaPiDirectory(yaPi_url):
        """
        yaPi_url-搜索yapi的url
        """
        
        # 判断运行环境,生产环境:SERVER ,对应的URL值是YAPI请求的域名
        ENV_PROFILE = os.getenv("ENV")
        if ENV_PROFILE == "SERVER":
            url = 'xxxx'
        else:
            url = 'xxxx'

        yaPiBody = {"email": "xxxxxx", "password": "xxxxx"}

        header = {
            "Content-Type": "application/json"
        }

        # YaPi登录接口
        yaPi = requests.post(url="http://" + url + ":3000/api/user/login", json=yaPiBody)
        cookie = yaPi.cookies

        # yapi搜索接口
        # yaPi_url = "/api/operate/brand/list"

        # YaPi接口数据-搜索
        yapi_api_search = requests.get(url="http://" + url + ":3000/api/project/search?q=" + yaPi_url, headers=header, cookies=cookie).json()['data']['interface'][0]

        # yapi 获取接口详细信息
        yapi_interface = requests.get(url="http://" + url + ":3000/api/interface/get?id=" + str(yapi_api_search['_id']), headers=header, cookies=cookie).json()

        # 二级目录名称
        yapi_directory_two = requests.get(url="http://" + url + ":3000/api/interface/list_menu?project_id=" + str(yapi_interface['data']['project_id']), headers=header, cookies=cookie).json()
        
        # 获取二级目录名称
        for directory_two in yapi_directory_two['data']:

            if directory_two['_id'] == yapi_interface['data']['catid']:
                directory_two_yapi = directory_two['name']
                break
            else:
                pass

        # 一级目录名称
        yapi_directory_one = ""

        # 获取组id
        yapi_group_id = requests.get(url="http://" + url + ":3000/api/project/get?id=" + str(yapi_api_search['projectId']), headers=header, cookies=cookie).json()['data']['group_id']

        # yapi 项目信息-获取一级目录名称
        yapi_project = requests.get(url="http://" + url + ":3000/api/project/list?group_id=" + str(yapi_group_id) + "&page=1&limit=100", headers=header, cookies=cookie).json()
        
        # 获取 一级目录名称
        for project in yapi_project['data']['list']:

            if project['_id'] == yapi_api_search['projectId']:
                yapi_directory_one = project['name']
                break
            else:
                pass

        yaPiUrl = "http://" + url + ":3000/project/" + str(yapi_api_search['projectId']) + "/interface/api/" + str(yapi_api_search['_id'])
        
        # 获取的一、二、三级目录名称以及 该接口在yapi中的url访问地址,数据组合
        api_directory = {
            "yapi_directory_one": yapi_directory_one,
            "yapi_directory_two": directory_two_yapi,
            "yapi_directory_three": yapi_interface['data']['title'],
            "yaPiApiUrl": yaPiUrl,
        }
        return api_directory


if __name__ == '__main__':
    domain = "https://xxxxxx"
    harfile = "/Users/xxxxxx"

    a = CharlesAnalysis()
    print(a.charlesAnalysis(harfile, "${token}", "${jgc}"))
    yaPi_url = "/api/xxxxx"

    print(a.yaPiDirectory(yaPi_url))

  

标签:yapi,url,代码,Charles,导入,headers,api,str,method
From: https://www.cnblogs.com/wangyinghao/p/17900744.html

相关文章

  • php底层代码执行流程
    PHP在底层(C语言层面)的代码执行流程可以大致分为以下几个步骤:解析器初始化:当PHP服务启动时,会调用解析器(ZendEngine)的初始化函数进行初始化,包括各种全局变量的初始化,内存池的初始化。文件读取和解析:解析器会读取并解析PHP文件,将其转换为语法树,并将其中的函数和变量信息保......
  • 修改推送代码的github账户
    原文地址: https://www.cnblogs.com/zbliao/p/14142234.html一、修改本地一个仓库的用户名和邮箱//查看本目录下仓库的邮箱gitconfiguser.email //查看本目录下仓库的用户名gitconfiguser.name//修改本目录下仓库的邮箱gitconfiguser.email"邮......
  • 深度学习笔记4:在卷积基上添加数据增强代码块和分类器
    特征提取的另一种方式是将原有模型与一个新的密集分类器相连接,以构建一个新的模型,然后对整个模型进行端到端的训练。这种方法在输入数据上进行整体训练,使模型能够更好地适应数据特性并提取更有效的特征。通过这种方式,模型的性能可以得到进一步提高,同时也能更好地捕捉到数据中......
  • R语言贝叶斯Metropolis-Hastings Gibbs 吉布斯采样器估计变点指数分布分析泊松过程车
    原文链接:http://tecdat.cn/?p=26578 原文出处:拓端数据部落公众号最近我们被客户要求撰写关于吉布斯采样器的研究报告,包括一些图形和统计输出。指数分布是泊松过程中事件之间时间的概率分布,因此它用于预测到下一个事件的等待时间,例如,您需要在公共汽车站等待的时间,直到下一班车......
  • 【TFTP】客户端下载文件代码
    1//客户端下载文件2#include<stdio.h>3#include<string.h>4#include<unistd.h>5#include<arpa/inet.h>6#include<netinet/in.h>7#include<sys/types.h>8#include<sys/stat.h>9#include<fcntl.h>......
  • 【多播】编写UDP代码,可以接受224.0.0.2组内消息
    #include<stdio.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<netinet/in.h>intmain(intargc,charconst*argv[]){//1.创建套接字intsockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd......
  • 广播代码(C语言)
    #include<stdio.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<netinet/in.h>intmain(intargc,charconst*argv[]){//1.创建套接字intsockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd......
  • TCP简单的服务端代码(C语言)
    1#include<stdio.h>2#include<strings.h>//bzero3#include<unistd.h>//close4#include<sys/socket.h>//socket5#include<netinet/in.h>//structsockaddr_in6#include<arpa/inet.h>//inet_addr7i......
  • 求其最大公约数和最小公倍数,一行代码完成
    题目:输入两个正整数m和n,求其最大公约数和最小公倍数。求出最大公约数就行,最小公倍数用m*n除以最大公约数就行packagemyself;importjava.util.Scanner;/***@AutherQY*@Date2023/12/11*/publicclassSix{publicstaticvoidmain(String[]args){......
  • 代码随想录算法训练营第一天|704.二分查找、27.移除元素
    LeetCode704二分查找题目链接704.二分查找二分法确定区间(循环不变量):对于有序数组,定义循环区间二分查找元素 LeetCode27.移除元素题目链接:27.移除元素快慢指针,快指针查,慢指针存 ......