当前位置: 首页 > 后端技术 > PHP

PHPcurl抓墙外图片并通过sftp上传【填坑指南】

时间:2023-03-30 05:53:39 PHP

背景最近需要把头像下载到本地,以文件的形式上传到第三方,遇到坑填curl第一个版本$ch=curl_init();curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>true,//TRUE会将curl_exec()得到的信息作为字符串返回,而不是直接输出(因为需要写入文件)CURLOPT_HEADER=>false,//启用时,头文件会作为数据流输出(适合调试)CURLOPT_URL=>'url',]);$data=curl_exec($ch);curl_close($ch);curl_setopt配置手册(文档地址),whatis配置项需要?翻了翻,发现几个问题:有的图片位于主站防盗??链机制,headerheader有的图片需要引用的地址是facebook,需要配置代理,图片会被重定向到其他图片服务器。proxy会加超时,有时会时不时获取不到,所以加了重试机制来解决:在配置项中添加CURLOPT_REFERER=>'xx地址'在配置项中添加CURLOPT_FOLLOWLOCATION=>true,//当为TRUE时,会根据服务器返回的HTTP头中的“Location:”进行重定向CURLOPT_PROXY=>'代理地址',CURLOPT_PROXYPORT=>'代理端口',CURLOPT_PROXYTYPE=>CURLPROXY_SOCKS5,//可以是CURLPROXY_HTTP(默认值)CURLPROXY_SOCKS4,CURLPROXY_SOCKS5,CURLPROXY_SOCKS4AorCURLPROXY_SOCKS5_HOSTNAME随意加个循环,比如while第二个版本$curl_opts=[CURLOPT_RETURNTRANSFER=>true,CURLOPT_HEADER=>false,CURLOPT_FOLLOW_true,CURLOCA=>'图片地址',CURLOPT_REFERER=>'防盗链主站地址',CURLOPT_TIMEOUT=>20,];foreach(['fbcdn','facebook']as$domain){if(stripos('imageaddress',$domain)!==false){$curl_opts+=[CURLOPT_PROXY=>'代理地址',CURLOPT_PROXYPORT=>'代理端口',CURLOPT_PROXYTYPE=>CURLPROXY_SOCKS5,];休息;}}$retry_time=2;while($retry_time>0){$ch=curl_init();curl_setopt_array($ch,$curl_opts);尝试{$data=curl_exec($ch);//数据是文件流curl_close($ch);休息;}catch(\Exception$e){//可以处理其他异常$retry_time--;}}配置curl_setopt时注意参数的版本限制,版本太低不支持。使用curl_version()确认当前环境版本sftp在使用shell前确认ssh2扩展已经安装,php-m|grepssh2$sftp_connection=ssh2_connect('address','port');//如果是公钥认证,ssh2_auth_pubkey_file()ssh2_auth_password($sftp_connection,'username','password');$sftp=ssh2_sftp($sftp_connection);$remote_uri=sprintf('ssh2.sftp://%s/write/%s',(int)$sftp,'远程文件名');//强制传输资源句柄file_put_contents($remote_uri,file_get_contents('localfileaddress'));//上传写入远程的坑,这里注意ssh2_sftp获取到的资源句柄在使用的时候需要转换成int,官方作弊示例