新版py3封装pyhttp,ja3指纹

By money at 2021-09-15 • 0人收藏 • 458人看过
import py3; 
import web.json;

class pyhttp{
	ctor(cookies, agent, proxy){
		this.ses =  requests.Session();
		this.proxies = proxy||{}
		this.headers={}
		this.addHeaders = {
			["Accept"] = "*/*;q=0.8";
			["Accept-Language"]="zh-CN,zh;q=0.9";
			["Accept-Encoding"]="gzip, deflate, br"; 
			//["Connection"]="Close";
			["User-Agent"]=agent||"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36";
		};
		this.cookies = {@{_readonly = false}};
		this.setCookies=function(cookies){
			var tp = type(cookies)
			if(tp==type.table){
				..table.mixin(this.cookies,cookies)
			}elseif(tp==type.string){
				cookies = ..string.replace(cookies,"[\r\n]","")
				var tab = ..string.split(cookies,';')
				for(i=1;#tab;1){
					var tmp = ..string.split(..string.trim(tab[i]),'=',2);
					if(#tmp) this.cookies[tmp[1]]=tmp[2];
				}
			}
		}
		this.setCookies(cookies)
	};
	setHeaders=function(headers){
		this.headers:={}
		var tp = type(headers)
		if(tp==type.table){
			for(k,v in headers){
				this.headers[headerFirstCharToUper(k)]=v
			}
		}elseif(tp==type.string){
			var tmp = ..string.splitEx(headers, "<\r\n>|\r|\n");
			for(i=1;#tmp;1){
				var tmp1 = ..string.split(tmp[i],':',2);
				if(#tmp1==2){
					var name = ..string.trim(tmp1[1])
					var val = ..string.trim(tmp1[2]);
					if(name and val){
						this.headers[name]=val
					}	
				}
			}
		}
	}
	setHeader=function(name, value){
		this.headers:={}
		this.headers[headerFirstCharToUper(name)]=value;
	}
	setCookie=function(name, value){
		this.cookies[name]=value;
	}
	setReferer=function(Referer){
		this.headers:={}
		this.headers["Referer"]=Referer;
	}
	post = function(url, postdata, timeout=30000, autoRedirect=true){
		this._beforeSend()
		if(type(postdata)==type.table and postdata.http_post_type=="json"){
			postdata.http_post_type=null
			this.headers["Content-Type"]="application/json";
			postdata = json.dumps.invoke(postdata)
		}
		var res = this.ses.post.invoke(verify=false, data=postdata, headers=this.headers, proxies=this.proxies, timeout=timeout/1000, allow_redirects=autoRedirect, url);
		return this._parseData(res);
	};
	get = function(url, datas, timeout=30000, autoRedirect=true){
		this._beforeSend()
		var res = this.ses.get.invoke(verify=false, headers=this.headers, proxies=this.proxies, timeout=timeout/1000, allow_redirects=autoRedirect, url);
		return this._parseData(res);
	}
	_beforeSend = function(){
		this.headers = ..table.mix(this.headers, this.addHeaders)
		var cookie_str = "";
		for(k,v in this.cookies){
			cookie_str ++= k++"="++tostring(v)+"; "
		}
		
		if(#cookie_str){
			cookie_str = ..string.left(cookie_str,#str-2);
			this.headers["Cookie"] = cookie_str
		}else {
			this.headers["Cookie"] = null;
		}
	}
	
	_parseData = function(res){
		var ret = tostring(res.text);
		if(type(this.beforeDecrypt)==type.function){
			ret = this.beforeDecrypt(ret)
		}
	  	if(type(this.decrypt)==type.function){
			ret = this.decrypt(ret)
		}
		if(type(this.afterDecrypt)==type.function){
			ret = this.afterDecrypt(ret)
		}
		if(#ret and (..string.startWith(ret,"{") or ..string.startWith(ret,"["))){
			var json = ..web.json.tryParse(ret);
			if(type(json)==type.table){
				ret = json
			}
		}
		this.cookies = ..web.json.tryParse(tostring(requests.utils.dict_from_cookiejar.invoke(res.cookies)))
		return ret, this.cookies;
	}
	ja3 = function(url){
		this.adapter := DESAdapter.DESAdapter();
		this.ses.mount.invoke(url, this.adapter)
	}
}

namespace pyhttp{
	DESAdaptercode = /**
import requests
import random
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.ssl_ import create_urllib3_context

ORIGIN_CIPHERS = ('ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES')
class DESAdapter(HTTPAdapter):
    def __init__(self, *args, **kwargs):
        """
        A TransportAdapter that re-enables 3DES support in Requests.
        """
        CIPHERS = ORIGIN_CIPHERS.split(':')
        random.shuffle(CIPHERS)
        CIPHERS = ':'.join(CIPHERS)
        self.CIPHERS = CIPHERS + ':!aNULL:!eNULL:!MD5'
        super().__init__(*args, **kwargs)
        
    def init_poolmanager(self, *args, **kwargs):
        context = create_urllib3_context(ciphers=self.CIPHERS)
        kwargs['ssl_context'] = context
        return super(DESAdapter, self).init_poolmanager(*args, **kwargs)

    def proxy_manager_for(self, *args, **kwargs):
        context = create_urllib3_context(ciphers=self.CIPHERS)
        kwargs['ssl_context'] = context
        return super(DESAdapter, self).proxy_manager_for(*args, **kwargs)
**/
	..string.save("/DESAdapter.py", DESAdaptercode );//创建一个创建的模块文件
	DESAdapter = ..py3.import("DESAdapter");
	requests = ..py3.import("requests");
	json = ..py3.import("json");
}

使用方式

import console; 
import pyhttp;

var http = pyhttp();
http.ja3("https://ja3er.com")//吼吼,这句是亮点
console.dump(http.get("https://ja3er.com/json"))

console.pause(true);

aardio有很多非常棒的http库,本库主要作用是模拟ja3指纹

1 个回复 | 最后更新于 2021-09-15
2021-09-15   #1

专门去搜了下什么是ja3,谢谢分享

登录后方可回帖

登 录
信息栏
公告:
个人博客
专注分享
谢谢合作!

本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...