PHP Curl请求封装
php 中curl请求模块封装
<?php
namespace App\Utils;/*** http 工具类* @author Administrator**/
class HttpUtils
{private static $_instance;private function __construct(){}public static function getInstance(){if( null == self::$_instance ){self::$_instance = new HttpUtils();}return self::$_instance;}/*** http curl 请求* @param unknown $remote* @param unknown $method* @param array $data* @param array $headers* @return string*/public function curl( $remote, $method = 'GET', $data = [], $headers = [], $format = 'STRING' ){if( !$remote ){$arrMsg[ 'code' ] = 0;$arrMsg[ 'msg' ] = 'ERROR: undefined request url';return $arrMsg;}$ch = curl_init();curl_setopt( $ch, CURLOPT_URL, $remote );curl_setopt( $ch, CURLOPT_HEADER, false );curl_setopt( $ch, CURLOPT_TIMEOUT, 60 );curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );curl_setopt( $ch, CURLOPT_USERAGENT, $this->_getAgent() );if( isset( $headers ) && !empty( $headers ) ){curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );}switch ( $method ){case 'GET':break;case 'PUT':curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'PUT' );switch ( $format ){case 'STRING':curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $data, '', '&' ) ); //设置请求体,提交数据包break;case 'JSON':curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $data ) ); //设置请求体,提交数据包break;}break;case 'POST':curl_setopt( $ch, CURLOPT_POST, 1 );switch ( $format ){case 'STRING':curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $data, '', '&' ) );break;case 'JSON':curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $data ) );break;}break;case 'DELETE':curl_setopt ( $ch, CURLOPT_NOSIGNAL, true );curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'DELETE' );break;}curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );$result = curl_exec( $ch );$error = curl_error( $ch );$curl_info = curl_getinfo( $ch );curl_close( $ch );if( isset( $error ) && strlen( $error ) > 0 ){//异常$arrMsg[ 'code' ] = 0;$arrMsg[ 'request' ] = $remote;$arrMsg[ 'msg' ] = ' Curl ERROR: curl error code is ' . $error;return $arrMsg;}if( 400 <= $curl_info[ 'http_code' ] ){//异常$arrMsg[ 'code' ] = 0;$arrMsg[ 'http_code' ] = $curl_info[ 'http_code' ];$arrMsg[ 'request' ] = $remote;$arrMsg[ 'errmsg' ] = $result;$arrMsg[ 'msg' ] = ' CURL ERROR: http response error ';return $arrMsg;}$arrMsg[ 'code' ] = $curl_info[ 'http_code' ];$arrMsg[ 'request' ] = $remote;$arrMsg[ 'data' ] = $result;$arrMsg[ 'msg' ] = 'REMOTE: http code ' . $curl_info[ 'http_code' ];return $arrMsg;}/*** 获取远程数据是否正常* @param unknown $remote* @return string*/public function curlGet( $remote, $headers = [], $proxy = false ){if( !$remote ){$arrMsg[ 'code' ] = 0;$arrMsg[ 'msg' ] = 'ERROR: undefined request url';return $arrMsg;}$curl = curl_init();curl_setopt( $curl, CURLOPT_URL, $remote );curl_setopt( $curl, CURLOPT_HEADER, false );curl_setopt( $curl, CURLOPT_TIMEOUT, 75 );curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, false );// 可配置随机取 USERAGENT$strUserAgent = $this->_getAgent();curl_setopt( $curl, CURLOPT_USERAGENT, $strUserAgent );curl_setopt( $curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 ); if( !empty( $headers ) ){curl_setopt( $curl, CURLOPT_HTTPHEADER, $headers );}if( $proxy ){// 配置多代理模式, 可进行随机切换或者指定模式切换使用代理$arrAgentINfo = $this->_getProxy();curl_setopt( $curl, CURLOPT_HTTPPROXYTUNNEL, false );curl_setopt( $curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP );curl_setopt( $curl, CURLOPT_PROXYAUTH, CURLAUTH_BASIC );// 设置代理服务器curl_setopt( $curl, CURLOPT_PROXY, $arrAgentINfo[ 'server' ] );// 设置隧道验证信息curl_setopt( $curl, CURLOPT_PROXYUSERPWD, "{$arrAgentINfo['user']}:{$arrAgentINfo['passwd']}");}$iStart = microtime( true );try{$data = curl_exec( $curl );$error_code = curl_errno( $curl );$error_info = curl_error( $curl );$curl_info = curl_getinfo( $curl );curl_close( $curl );$iUserSec = sprintf( '%0.2f', microtime( true ) - $iStart );if( isset( $error_info ) && strlen( $error_info ) > 0 ){$arrMsg[ 'code' ] = 0;$arrMsg[ 'curl_code' ]= $error_code;$arrMsg[ 'request' ]= $remote;$arrMsg[ 'msg' ] = 'CURL ERROR: '. $error_info;$arrMsg[ 'time' ] = $iUserSec;return $arrMsg;}$arrMsg[ 'code' ] = $curl_info[ 'http_code' ];$arrMsg[ 'request' ] = $remote;$arrMsg[ 'data' ] = $data;$arrMsg[ 'msg' ] = 'REMOTE: http code ' . $curl_info[ 'http_code' ];$arrMsg[ 'time' ] = $iUserSec;}catch ( \Exception $e ){$arrMsg[ 'code' ] = 0;$arrMsg[ 'request' ] = $remote;$arrMsg[ 'msg' ] = 'CURL ERROR: '. $e->getMessage();$arrMsg[ 'time' ] = $iUserSec;}return $arrMsg;}/*** 模拟post提交* @param unknown $remoteUrl* @param unknown $data* @return boolean|string*/public function curlPost( $remoteUrl, $data, $headers = [], $format = 'STRING' ){if( !$remoteUrl || !$data || empty( $data ) ){return false;}$ch = curl_init();curl_setopt( $ch, CURLOPT_URL, $remoteUrl );curl_setopt( $ch, CURLOPT_POST, true );switch ( $format ){case 'STRING':curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $data, '', '&' ) );break;case 'JSON':curl_setopt( $ch, CURLOPT_POSTFIELDS, \GuzzleHttp\json_encode( $data ) );break;}curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 20 );curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );curl_setopt( $ch, CURLOPT_TIMEOUT, 180 );if( !empty( $headers ) ){curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );}curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );$result = curl_exec( $ch );$error = curl_error( $ch );$curl_info = curl_getinfo( $ch );curl_close( $ch );if( isset( $error ) && strlen( $error ) > 0 ){//异常$arrMsg[ 'code' ] = 0;$arrMsg[ 'request' ] = $remoteUrl;$arrMsg[ 'msg' ] = ' Curl ERROR: curl error code is ' . $error;return $arrMsg;}if( 200 != $curl_info[ 'http_code' ] ){//异常$arrMsg[ 'code' ] = 0;$arrMsg[ 'http_code' ] = $curl_info[ 'http_code' ];$arrMsg[ 'request' ] = $remoteUrl;$arrMsg[ 'data' ] = $result;$arrMsg[ 'msg' ] = ' CURL ERROR: http response error ';return $arrMsg;}$arrMsg[ 'code' ] = $curl_info[ 'http_code' ];$arrMsg[ 'request' ] = $remoteUrl;$arrMsg[ 'data' ] = $result;$arrMsg[ 'msg' ] = 'REMOTE: http code ' . $curl_info[ 'http_code' ];return $arrMsg;}/*** 模拟post提交* @param unknown $remoteUrl* @param unknown $data* @return boolean|string*/public function curlPut( $remoteUrl, $data, $headers = [], $format = 'STRING' ){if( !$remoteUrl || !$data || empty( $data ) ){return false;}$ch = curl_init();curl_setopt( $ch, CURLOPT_URL, $remoteUrl );curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'PUT' );switch ( $format ){case 'STRING':curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $data, '', '&' ) );break;case 'JSON':curl_setopt( $ch, CURLOPT_POSTFIELDS, \GuzzleHttp\json_encode( $data ) );break;}curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 0 );curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );curl_setopt( $ch, CURLOPT_TIMEOUT, 180 );curl_setopt( $ch, CURLOPT_USERAGENT, $this->_getAgent() );if( !empty( $headers ) ){curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );}curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );$result = curl_exec( $ch );$error = curl_error( $ch );$curl_info = curl_getinfo( $ch );curl_close( $ch );if( isset( $error ) && strlen( $error ) > 0 ){//异常$arrMsg[ 'code' ] = 0;$arrMsg[ 'request' ] = $remoteUrl;$arrMsg[ 'msg' ] = ' Curl ERROR: curl error code is ' . $error;return $arrMsg;}if( 200 != $curl_info[ 'http_code' ] ){//异常$arrMsg[ 'code' ] = 0;$arrMsg[ 'http_code' ] = $curl_info[ 'http_code' ];$arrMsg[ 'request' ] = $remoteUrl;$arrMsg[ 'data' ] = $result;$arrMsg[ 'msg' ] = ' CURL ERROR: http response error ';return $arrMsg;}$arrMsg[ 'code' ] = $curl_info[ 'http_code' ];$arrMsg[ 'request' ] = $remoteUrl;$arrMsg[ 'data' ] = $result;$arrMsg[ 'msg' ] = 'REMOTE: http code ' . $curl_info[ 'http_code' ];return $arrMsg;}/*** 模拟post提交* @param unknown $remoteUrl* @param unknown $data* @return boolean|string*/public function curlDelete( $remoteUrl, $headers = [] ){if( !$remoteUrl ){return false;}$ch = curl_init();curl_setopt( $ch, CURLOPT_URL, $remoteUrl );curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );curl_setopt( $ch, CURLOPT_TIMEOUT, 60 );curl_setopt( $ch, CURLOPT_USERAGENT, $this->_getAgent() );if( !empty( $headers ) ){curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );}curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'DELETE' );curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );$result = curl_exec( $ch );$error = curl_error( $ch );$curl_info = curl_getinfo( $ch );curl_close( $ch );if( isset( $error ) && strlen( $error ) > 0 ){//异常$arrMsg[ 'code' ] = 0;$arrMsg[ 'request' ] = $remoteUrl;$arrMsg[ 'msg' ] = ' Curl ERROR: curl error code is ' . $error;return $arrMsg;}if( 200 <= $curl_info[ 'http_code' ] && 400 > $curl_info[ 'http_code' ]){//异常$arrMsg[ 'code' ] = 0;$arrMsg[ 'http_code' ] = $curl_info[ 'http_code' ];$arrMsg[ 'request' ] = $remoteUrl;$arrMsg[ 'msg' ] = ' CURL ERROR: http response error ';return $arrMsg;}$arrMsg[ 'code' ] = $curl_info[ 'http_code' ];$arrMsg[ 'request' ] = $remoteUrl;$arrMsg[ 'data' ] = $result;$arrMsg[ 'msg' ] = 'REMOTE: http code ' . $curl_info[ 'http_code' ];return $arrMsg;}/*** 随机取 代理信息* @return unknown[]*/private function _getProxy(){$arrRet = array();$arrCacheProxy = config( 'agents.proxys' );$proxy = array_shift( $arrCacheProxy );$arrRet[ 'name' ] = $proxy[ 'name' ];$arrRet[ 'server' ] = $proxy[ 'proxy' ] . ':' . $proxy[ 'port' ];if( isset( $proxy[ 'user' ] ) && $proxy[ 'user' ] ){$arrRet[ 'user' ] = $proxy[ 'user' ];}if( isset( $proxy[ 'passwd' ] ) && $proxy[ 'passwd' ] ){$arrRet[ 'passwd' ] = $proxy[ 'passwd' ];}return $arrRet;}/*** 随机获取 user-agent*/private function _getAgent(){$agent = config( 'agents.agents' );$iGNum = count( $agent );$iCurrent = rand( 0, intval( $iGNum - 1 ) );return $agent[$iCurrent];}/*** 模拟post提交* @param unknown $remoteUrl* @param unknown $data* @return boolean|string*/public function curlPostWithCookie( $remoteUrl, $data,$cookie, $headers = [], $format = 'STRING' ){if( !$remoteUrl || !$data || empty( $data ) ){return false;}$ch = curl_init();curl_setopt( $ch, CURLOPT_URL, $remoteUrl );curl_setopt( $ch, CURLOPT_POST, true );curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie ); //设置Cookie信息保存在指定的文件中switch ( $format ){case 'STRING':curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $data, '', '&' ) );break;case 'JSON':curl_setopt( $ch, CURLOPT_POSTFIELDS, \GuzzleHttp\json_encode( $data ) );break;}curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 0 );curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );curl_setopt( $ch, CURLOPT_TIMEOUT, 240 );if( !empty( $headers ) ){curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );}curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );$result = curl_exec( $ch );$error = curl_error( $ch );$curl_info = curl_getinfo( $ch );curl_close( $ch );if( isset( $error ) && strlen( $error ) > 0 ){//异常$arrMsg[ 'code' ] = 0;$arrMsg[ 'request' ] = $remoteUrl;$arrMsg[ 'msg' ] = ' Curl ERROR: curl error code is ' . $error;return $arrMsg;}if( 200 != $curl_info[ 'http_code' ] ){//异常$arrMsg[ 'code' ] = 0;$arrMsg[ 'http_code' ] = $curl_info[ 'http_code' ];$arrMsg[ 'request' ] = $remoteUrl;$arrMsg[ 'data' ] = $result;$arrMsg[ 'msg' ] = ' CURL ERROR: http response error ';return $arrMsg;}$arrMsg[ 'code' ] = $curl_info[ 'http_code' ];$arrMsg[ 'request' ] = $remoteUrl;$arrMsg[ 'data' ] = $result;$arrMsg[ 'msg' ] = 'REMOTE: http code ' . $curl_info[ 'http_code' ];return $arrMsg;}/*** 获取链接详细信息* @author Administrator* @datetime 2019年5月7日 下午5:39:16* @comment * * @param unknown $url* @return array|string[]|unknown[]|mixed[]*/public function curlGetHeader( $url ){$arrRet = array();if( !$url || strlen( $url ) <= 0 ){return $arrRet;}if( !starts_with( $url , [ 'http', 'https', 'Http', 'Https', 'HTTP', 'HTTPS' ] ) ){return $arrRet;}try{$header = get_headers( $url, TRUE );if ( strpos( $header[0], 302 ) || strpos( $header[0], 301 ) ){if( isset( $header[ 'Location' ] ) && is_array( $header[ 'Location' ] ) && !empty( $header[ 'Location' ] ) ) {$url = $header[ 'Location' ][count( $header['Location'] )-1 ];}else if( isset( $header[ 'Location' ] ) ){$url = $header[ 'Location' ];}}$urlInfo = parse_url( $url );if( isset( $urlInfo ) && !empty( $urlInfo ) ){$scheme = strtolower( $urlInfo[ 'scheme' ] );$arrRet[ 'scheme' ] = $scheme;$arrRet[ 'host' ] = strtolower( $urlInfo[ 'host' ] );$arrRet[ 'url' ] = $scheme . '://' . $urlInfo[ 'host' ];}}catch( \Exception $e ){if( preg_match( "/ssl3_get_server_certificate/i" , $e->getMessage() ) ){return $this->curlGetHeader( str_replace( 'https://' , 'http://', $url ) );}}return $arrRet;}
}
相关文章:
PHP Curl请求封装
php 中curl请求模块封装 <?php namespace App\Utils;/*** http 工具类* author Administrator**/ class HttpUtils {private static $_instance;private function __construct(){}public static function getInstance(){if( null self::$_instance ){self::$_instance n…...
java list set 特性
List的常用实现类 ArrayList (常用) JDK1.2 底层数组实现 查询快,增删慢 线程不安全,效率高 LinkedList JDK1.2 底层链表实现 查询慢,增删快 线程不安全,效率高 Vector JDK1.0 底层数组实现 都慢 线程安全,效率低 List 集合名new 实现类(); 常用方法 集合名.方法名(实参列表…...
Docker 用centos 编译安装apache
Docker 用centos 编译安装apache 前提条件: 安装docker 如果想安装docker请查阅:安装docker 环境准备:centos8 拉取centos镜像 [rootlvs docker]# docker pull centos:8 8: Pulling from library/centos a1d0c7532777: Pull complete Di…...
专访虚拟人科技:如何利用 3DCAT 实时云渲染打造元宇宙空间
自古以来,人们对理想世界的探索从未停止,而最近元宇宙的热潮加速了这一步伐,带来了许多新的应用。作为元宇宙的关键入口,虚拟现实(VR)将成为连接虚拟和现实的桥梁。苹果发布的VISION PRO头戴设备将人们对VR…...
第三章:人工智能深度学习教程-基础神经网络(第二节-ANN 和 BNN 的区别)
在本文中,我们将了解单层感知器及其使用 TensorFlow 库在Python中的实现。神经网络的工作方式与我们的生物神经元的工作方式相同。 生物神经元的结构 生物神经元具有三个基本功能 接收外部信号。 处理信号并增强是否需要发送信息。 将信号传递给目标细胞&#x…...
回归模型原理总结及代码实现
前言 本文将介绍回归模型算法,并总结了一些常用的除线性回归模型之外的模型,其中包括一些单模型及集成学习器。 保序回归、多项式回归、多输出回归、多输出K近邻回归、决策树回归、多输出决策树回归、AdaBoost回归、梯度提升决策树回归、人工神经网络、…...
游戏开发中的“御用中介“
点击上方亿元程序员关注和★星标 引言 大家好,我是亿元程序员,一位有着8年游戏行业经验的主程。 本系列是《和8年游戏主程一起学习设计模式》,让糟糕的代码在潜移默化中升华,欢迎大家关注分享收藏订阅。 游戏开发中的"御用…...
flink1.15报错 processElement_split
flink sql 完整报错 Caused by: java.lang.NullPointerExceptionat StreamExecCalc$1148.processElement_split178(Unknown Source) ~[?:?]at StreamExecCalc$1148.processElement(Unknown Source) ~[?:?]at org.apache.flink.streaming.runtime.tasks.CopyingChainingOutp…...
电脑投屏到TCL电视鼠标延迟
问题描述 提示:这里描述项目中遇到的问题: 笔记本电脑使用HDMI投屏到TCL电视,页面显示正常但是鼠标延迟反应太慢了 解决方案: 提示:这里填写该问题的具体解决方案: TCL电视设置中选择图像 → 图像类型改…...
220v插座led指示灯维修
由于220v是交流电,有反向电压的情况,而led反向通电的时候电阻无穷大,所以分压也无穷大,220v一导通就击穿,即使加了很大的电阻也没用,串联电阻只能作用于二极管正向的时候。 目前有两种方案: 方…...
软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】
软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】 课本里章节里所有蓝色字体的思维导图...
javascript自定义事件的观察者模式写法和用法以及继承
<html><head><meta http-equiv"Context-Type:text/html;charsetutf-8"/><title>自定义事件之观察者模式</title><script type"text/javascript" src"common.js"></script></head><body>&…...
蓝桥杯官网练习题(正则问题)
题目描述 考虑一种简单的正则表达式: 只由 x ( ) | 组成的正则表达式。 小明想求出这个正则表达式能接受的最长字符串的长度。 例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是 6。 输入描述 一个由 x()| 组成的正则表…...
iOS使用NSURLSession实现后台上传
NSURLSession后台上传的基本逻辑是:首先创建一个后台模式的NSURLSessionConfiguration,然后通过这个configuration创建一个NSURLSession,接着是创建相关的NSURLSessionTask,最后就是处理相关的代理事件。 1、创建NSURLSession -…...
linux之信号
Linux之信号 什么是信号信号的产生方式signalsignactionkill信号集信号屏蔽 什么是信号 信号机制是一种使用信号来进行进程之间传递消息的方法,信号的全称为软中断信号,简称软中断。 信号的本质是软件层次上对中断的一种模拟(软中断ÿ…...
golang工程中间件——redis常用结构及应用(string, hash, list)
Redis 命令中心 【golang工程中间件——redisxxxxx】这些篇文章专门以应用为主,原理性的后续博主复习到的时候再详细阐述 string结构以及应用 字符数组,redis字符串是二进制安全字符串,可以存储图片等二进制数据,同时也可以存…...
Java中数据结构(基本数据类型+引用数据类型)介绍+整理+例子+对比
一、Java数据类型分类 在Java中,数据类型可以分为两大类:内置数据类型(Primitive Data Types)和引用数据类型(Reference Data Types)。 **内置数据类型(Primitive Data Types)**是…...
SpringSecurity原理
Spring Security是Spring框架中的一个安全性框架,用于保护Web应用程序。以下是Spring Security的工作原理: 1.认证 认证是指验证用户身份。Spring Security使用过滤器链来拦截用户的请求。在对请求进行处理之前,它需要对用户进行认证。Spri…...
云表平台突破传统,企业级低代码让软件开发速度提升
随着数字化进程的加速推进,软件开发效率和成本的要求也在日益提高。在这个背景下,低代码技术的出现为企业软件开发提供了新的解决方案。低代码开发平台以其简单易用、高效灵活的特点,已经成为各行各业企业进行应用开发的首选工具。 企业中低代…...
三数之和(双指针)
15. 三数之和 - 力扣(LeetCode) 题目描述 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三…...
深度解析HS2-HF Patch:从技术框架到创作工具链的完整升级方案
深度解析HS2-HF Patch:从技术框架到创作工具链的完整升级方案 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 你是否曾因Honey Select 2的原版体验受…...
C语言(12) 指针的常见操作
指针的常见操作指针变量,有两方面的意思:一个指针指向的内容(数据值,一级)指针变量本身存储的数据 (地址值)#include <stdio.h>int main() {int a 10;int b 0 ;int c 50;int *p NULL;int *q NULL;p &a; // 对指针变量本身进行修改// 对指…...
从《吃豆人》到开放世界:聊聊Unity Navigation里Agent Radius和Cost的那些‘潜规则’
从《吃豆人》到开放世界:Unity Navigation中Agent Radius与Cost的隐藏逻辑1980年诞生的《吃豆人》用简单的迷宫路径定义了早期游戏AI的移动规则——幽灵们沿着固定路线巡逻,遇到转角时随机选择方向。这种设计在当时堪称革命性,但以今天的标准…...
3分钟快速上手:bilibili-parse视频解析API终极指南
3分钟快速上手:bilibili-parse视频解析API终极指南 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse bilibili-parse是一款高效专业的B站视频解析工具,为开发者和内容创作者提供…...
安卓用户如何免费获取大模型API密钥并开始调用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 安卓用户如何免费获取大模型API密钥并开始调用 对于安卓开发者或移动端技术爱好者而言,直接体验和调用多种大模型的能力…...
SharpKeys终极指南:Windows键盘重映射的专业解决方案
SharpKeys终极指南:Windows键盘重映射的专业解决方案 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh/sharpkeys 在…...
LinkSwift:九大网盘直链下载助手终极指南,告别限速烦恼
LinkSwift:九大网盘直链下载助手终极指南,告别限速烦恼 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动…...
从工程师到架构师:跨越这道坎的三个关键能力
从工程师到架构师:跨越这道坎的三个关键能力 一、很多人卡在这道坎上 在IT行业,有个普遍现象:从工程师到架构师,很多人卡住了。 不是说技术不够好,有些人代码写得比架构师还好。但就是跨不过去这道坎。 原因是什么呢?我观察了很多人,发现关键在于能力结构的变化。 …...
扫地机器人行业 企业篇-科沃斯
科沃斯成立于1998年,早期为海外品牌代工吸尘器,2009年发布全球首款量产扫地机器人"地宝",正式拉开中国扫地机市场序幕。公司为A股上市公司,总部位于苏州,公司性质为民营企业。 2025年全年营收达190亿元&…...
JMeter实战:从接口测试到性能基线的全链路压测指南
1. 这不是“点点点就能跑通”的测试,而是用JMeter撬动系统稳定性的杠杆很多人第一次打开JMeter,以为它就是个“高级版Postman”:填URL、选方法、点执行,看到Response里有JSON就松一口气——“接口通了,测试完了”。我带…...
