资讯专栏INFORMATION COLUMN

php curl抓取墙外图片及sftp上传【填坑指南】

ralap / 674人阅读

摘要:背景最近有需求下载头像到本地,以文件形式上传到第三方,遇坑就填第一版将获取的信息以字符串返回,而不是直接输出因为要写文件启用时会将头文件的信息作为数据流输出适合调试配置手册文档地址配置项需要什么翻着找找遇到几个问题部分图片所在主站防盗链机制

背景

最近有需求下载头像到本地,以文件形式上传到第三方,遇坑就填

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配置手册(文档地址),配置项需要什么翻着找找

遇到几个问题:

部分图片所在主站防盗链机制,header头部需要加refer

部分图片地址是facebook,要配代理,并且图片会重定向到其他图片服务器上

挂代理加超时,有时不定时拿不到,加重试机制

因此解决:

配置项加CURLOPT_REFERER => "xx地址"

配置项加

CURLOPT_FOLLOWLOCATION  => true, // TRUE 时将会根据服务器返回 HTTP 头中的 "Location: " 重定向
CURLOPT_PROXY           => "代理地址",
CURLOPT_PROXYPORT       => "代理端口",
CURLOPT_PROXYTYPE       => CURLPROXY_SOCKS5, // 可以是 CURLPROXY_HTTP (默认值) CURLPROXY_SOCKS4、 CURLPROXY_SOCKS5、 CURLPROXY_SOCKS4A 或 CURLPROXY_SOCKS5_HOSTNAME

随便加个循环,比如while

第二版
$curl_opts = [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => false,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_URL            => "图片地址",
    CURLOPT_REFERER        => "防盗链主站地址",
    CURLOPT_TIMEOUT        => 20,
];

foreach (["fbcdn", "facebook"] as $domain) {
    if (stripos("图片地址", $domain) !== false) {
        $curl_opts += [
            CURLOPT_PROXY     => "代理地址",
            CURLOPT_PROXYPORT => "代理端口",
            CURLOPT_PROXYTYPE => CURLPROXY_SOCKS5,
        ];

        break;
    }
}

$retry_time = 2;
while ($retry_time > 0) {
    $ch = curl_init();
    curl_setopt_array($ch, $curl_opts);

    try {
        $data = curl_exec($ch); //data即为文件流
        curl_close($ch);

        break;
    } catch (Exception $e) {
        // 可进行其他异常处理
        $retry_time--;
    }
}

进行curl_setopt配置时,注意参数有版本限制,低版过低本不支持,使用curl_version()确认当前环境版本

sftp

使用之前shell确认是已安装ssh2扩展,php -m | grep ssh2

$sftp_connection = ssh2_connect("地址", "端口");

// 如果是公钥认证,ssh2_auth_pubkey_file()
ssh2_auth_password($sftp_connection, "用户名","密码");

$sftp = ssh2_sftp($sftp_connection);

$remote_uri = sprintf("ssh2.sftp://%s/write/%s", (int) $sftp, "远程文件名"); // 强转资源句柄
file_put_contents($remote_uri, file_get_contents("本地文件地址")); // 上传写入远程

大坑注意
这里ssh2_sftp获取到的资源句柄使用时需要强转int,官方坑人示例

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28291.html

相关文章

  • CentOS 7.3 填坑之路

    摘要:微软也意识到了这个问题,于是来了,不仅开源而且跨平台,前不久已经发布了版本,号称已经兼容了下的的类库,并且开发了强大的服务器应用来替代用以跨平台部署。 前言:被linux和java虐了快1年,笔者的内心是崩溃的,这一年的经历,更加坚定了拥 护.NET之心,微软对于开发者真的是太友好了,无论从工具到文档,乃至技术应用性都是那么为用户着想,笔者认同一种说法JAVA之所以占有比...

    Caizhenhao 评论0 收藏0
  • PHP中使用CURL,“撩”服务器只需几行——php curl详细解析和常见大坑

    摘要:七夕啦,作为开发,妹子没得撩就撩下服务器吧,妹子有得撩的同学那就左拥妹子右抱服务器吧,况且妹子是要礼物的,服务器又不用。下面我们来看一些常用的情景,我们需要如何打扮自己配置参数才能正确撩妹正确撩到服务器。 七夕啦,作为开发,妹子没得撩就撩下服务器吧,妹子有得撩的同学那就左拥妹子右抱服务器吧,况且妹子是要礼物的,服务器又不用。好啦,长话短说再长说,祭出今天的工具——CURL(Client...

    SexySix 评论0 收藏0
  • 使用php调用微信接口上传永久素材

    摘要:功能需求公司新开的公众号需要将公司平台现在的所有精品文章都导入,手动导入会有很多的工作量,所以采用自动化同步文章的方式来达到效果开发说明微信提供了新增永久素材的接口,本次功能是基于这个接口进行数据同步的使用到的接口获取永久素材列表接口新增永 功能需求 公司新开的公众号需要将公司平台现在的所有精品文章都导入,手动导入会有很多的工作量,所以采用自动化同步文章的方式来达到效果 开发说明 微信...

    niuxiaowei111 评论0 收藏0
  • php爬虫】百万级别知乎用户数据爬取与分析

    摘要:本程序是抓取知乎的用户数据,要能访问用户个人页面,需要用户登录后的才能访问。经过查阅资料得知,是因为知乎对图片做了防盗链处理。最终的结果是,用了一个周末就抓取了万的用户数据。 代码托管地址:https://github.com/hoohack/zhihuSpider 这次抓取了110万的用户数据,数据分析结果如下:showImg(https://segmentfault.com/img...

    maxmin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<