新版py3封装pyhttp,ja3指纹

By money at 2021-09-15 • 0人收藏 • 910人看过
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,谢谢分享

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...