├── index.php ├── README.md └── src └── images_spider.php /index.php: -------------------------------------------------------------------------------- 1 | 2 | weibo($url); 13 | } elseif (strpos($url, 'kuaishou') !== false){ 14 | $arr = $api->kuaishou($url); 15 | } elseif (strpos($url, 'pipix') !== false){ 16 | $arr = $api->pipixia($url); 17 | } elseif (strpos($url, 'izuiyou') !== false){ 18 | $arr = $api->zuiyou($url); 19 | } elseif (strpos($url, 'xhslink') !== false){ 20 | $arr = $api->xhs($url); 21 | } elseif (strpos($url, 'douyin') !== false){ 22 | $arr = $api->douyin($url); 23 | } else { 24 | $arr = array( 25 | 'code' => 201, 26 | 'msg' => '不支持您输入的链接' 27 | ); 28 | } 29 | if (!empty($arr)){ 30 | echo json_encode($arr, JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); 31 | } 32 | else{ 33 | $arr = array( 34 | 'code' => 201, 35 | 'msg' => '解析失败', 36 | ); 37 | echo json_encode($arr, JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); 38 | } 39 | 40 | 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![images_spider](https://socialify.git.ci/5ime/images_spider/image?description=1&descriptionEditable=%E6%94%AF%E6%8C%815%E4%B8%AA%E7%9F%AD%E8%A7%86%E9%A2%91%E5%B9%B3%E5%8F%B0%E5%8E%BB%E6%B0%B4%E5%8D%B0%E4%B8%8B%E8%BD%BD&font=Inter&forks=1&language=1&owner=1&pattern=Circuit%20Board&stargazers=1&theme=Light) 2 | 3 | 目前支持5个平台图集去水印下载,欢迎各位Star,**提交issues时请附带图集链接**。 4 | 5 | 短视频解析请移步:https://github.com/5ime/video_spider 6 | 7 | 演示站源码请移步:https://github.com/5ime/vue-page 8 | 9 | ## 支持平台 10 | 11 | | 平台 | 状态| 平台 | 状态| 平台 | 状态| 平台 | 状态| 平台 | 状态| 12 | | ---- | ---- | ---- | --- |----|----|----|----|----|----| 13 | | 皮皮虾 | ✔ | 抖音短视频 | ✔ | 最右 | ✔| 小红书 | ✔ | 微博 | ✔ | 14 | | 快手 | ✔ | | | | | | | | | 15 | 16 | 17 | ## 请求示例 18 | 19 | 支持GET/POST `url`参数必填,请优先使用 `POST` 请求,`GET` 请求自行 `urlencode` 编码 20 | 21 | ### 解析思路 22 | 23 | 请前往博客查看 24 | 25 | ## FAQ 26 | 27 | **为什么小红书/微博/快手会失败** 28 | 29 | 小红书/微博需要定时更新cookies,快手请求频繁会出现滑块验证 30 | 31 | **抖音X-Bogus校验** 32 | 33 | 目前使用的 https://github.com/B1gM8c/X-Bogus 提供的服务 34 | 35 | 你也可以基于我的模板 https://github.com/5ime/Tiktok_Signature 一键部署到 vercel,需要修改的地方如下 36 | 37 | ```php 38 | $url = 'https://tiktok.iculture.cc/X-Bogus'; 39 | $data = json_encode(array('url' => 'https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=' . $id[1] . '&aid=1128&version_name=23.5.0&device_platform=android&os_version=2333','userAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36')); 40 | $header = array('Content-Type: application/json'); 41 | $url = json_decode($this->curl($url, $data, $header), true)['param']; 42 | // 改为 43 | $url = '你的 vercel 地址'; 44 | $data = json_encode(array('url' => 'https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=' . $id[1] . '&aid=1128&version_name=23.5.0&device_platform=android&os_version=2333','userAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36')); 45 | $header = array('Content-Type: application/json'); 46 | $url = json_decode($this->curl($url, $data, $header), true)['data']['url']; 47 | ``` 48 | 49 | ## 免责声明 50 | 51 | 本仓库只为学习研究,如涉及侵犯个人或者团体利益,请与我取得联系,我将主动删除一切相关资料,谢谢! 52 | -------------------------------------------------------------------------------- /src/images_spider.php: -------------------------------------------------------------------------------- 1 | 'https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=' . $id[1] . '&aid=1128&version_name=23.5.0&device_platform=android&os_version=2333','user_agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36')); 18 | $header = array('Content-Type: application/json'); 19 | $url = json_decode($this->curl($url, $header, $data), true)['param']; 20 | 21 | $msToken = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 107); 22 | $header = array('User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36', 'Referer: https://www.douyin.com/', 'Cookie: msToken='.$msToken.';odin_tt=324fb4ea4a89c0c05827e18a1ed9cf9bf8a17f7705fcc793fec935b637867e2a5a9b8168c885554d029919117a18ba69; ttwid=1%7CWBuxH_bhbuTENNtACXoesI5QHV2Dt9-vkMGVHSRRbgY%7C1677118712%7C1d87ba1ea2cdf05d80204aea2e1036451dae638e7765b8a4d59d87fa05dd39ff; bd_ticket_guard_client_data=eyJiZC10aWNrZXQtZ3VhcmQtdmVyc2lvbiI6MiwiYmQtdGlja2V0LWd1YXJkLWNsaWVudC1jc3IiOiItLS0tLUJFR0lOIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLVxyXG5NSUlCRFRDQnRRSUJBREFuTVFzd0NRWURWUVFHRXdKRFRqRVlNQllHQTFVRUF3d1BZbVJmZEdsamEyVjBYMmQxXHJcbllYSmtNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVKUDZzbjNLRlFBNUROSEcyK2F4bXAwNG5cclxud1hBSTZDU1IyZW1sVUE5QTZ4aGQzbVlPUlI4NVRLZ2tXd1FJSmp3Nyszdnc0Z2NNRG5iOTRoS3MvSjFJc3FBc1xyXG5NQ29HQ1NxR1NJYjNEUUVKRGpFZE1Cc3dHUVlEVlIwUkJCSXdFSUlPZDNkM0xtUnZkWGxwYmk1amIyMHdDZ1lJXHJcbktvWkl6ajBFQXdJRFJ3QXdSQUlnVmJkWTI0c0RYS0c0S2h3WlBmOHpxVDRBU0ROamNUb2FFRi9MQnd2QS8xSUNcclxuSURiVmZCUk1PQVB5cWJkcytld1QwSDZqdDg1czZZTVNVZEo5Z2dmOWlmeTBcclxuLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tXHJcbiJ9'); 23 | 24 | $arr = json_decode($this->curl($url, $header), true); 25 | $img = $arr["aweme_detail"]["images"]; 26 | $images = array(); 27 | for($i=0;$i 200, 34 | 'msg' => 'success', 35 | 'count' => count($img), 36 | 'images' => $images 37 | ); 38 | return $Json; 39 | } 40 | } 41 | 42 | public function pipixia($url){ 43 | $loc = get_headers($url, true)['Location']; 44 | preg_match('/item\/(.*)\?/',$loc,$id); 45 | $arr = json_decode(file_get_contents('https://is.snssdk.com/bds/cell/detail/?cell_type=1&aid=1319&app_name=super&cell_id='.$id[1]),true); 46 | $img = $arr['data']["data"]['item']['note']["multi_thumb"]; 47 | $images = array(); 48 | for($i=0;$i 200, 55 | 'msg' => 'success', 56 | 'count' => count($img), 57 | 'images' => $images 58 | ); 59 | return $Json; 60 | } 61 | } 62 | 63 | public function weibo($url){ 64 | $cookie = "login_sid_t=6b652c77c1a4bc50cb9d06b24923210d; cross_origin_proto=SSL; WBStorage=2ceabba76d81138d|undefined; _s_tentry=passport.weibo.com; Apache=7330066378690.048.1625663522444; SINAGLOBAL=7330066378690.048.1625663522444; ULV=1625663522450:1:1:1:7330066378690.048.1625663522444:; TC-V-WEIBO-G0=35846f552801987f8c1e8f7cec0e2230; SUB=_2AkMXuScYf8NxqwJRmf8RzmnhaoxwzwDEieKh5dbDJRMxHRl-yT9jqhALtRB6PDkJ9w8OaqJAbsgjdEWtIcilcZxHG7rw; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9W5Qx3Mf.RCfFAKC3smW0px0; XSRF-TOKEN=JQSK02Ijtm4Fri-YIRu0-vNj"; 65 | $data = $this->get_curl($url,$cookie); 66 | preg_match('/&pic_ids=(.*?)&mid=/',$data,$arr); 67 | $img = explode(",",$arr[1]); 68 | $images = array(); 69 | for($i=0;$i 200, 76 | 'msg' => 'success', 77 | 'count' => count($img), 78 | 'images' => $images 79 | ); 80 | return $arr; 81 | } 82 | } 83 | 84 | public function zuiyou($url){ 85 | $text = file_get_contents($url); 86 | preg_match_all('/ 200, 95 | 'msg' => 'success', 96 | 'count' => count($img[1]), 97 | 'images' => $images 98 | ); 99 | return $arr; 100 | } 101 | } 102 | 103 | public function xhs($url){ 104 | $loc = get_headers($url,1)["Location"]; 105 | $cookie = "xhsTrackerId=e6018ab9-6936-4b02-cb65-a7f9f9e22ea0; xhsuid=y2PCwPFU9GCQnJH8; timestamp2=20210607d2293bcc8dcad65834920376; timestamp2.sig=QFn2Zv9pjUr07KDlnh886Yq43bZxOaT6t3WCzZdzcgM; xhsTracker=url=noteDetail&xhsshare=CopyLink; extra_exp_ids=gif_exp1,ques_exp2'"; 106 | $text = $this->get_curl($loc,$cookie); 107 | preg_match_all('/imageList\":(.*?)\,\"cover/',$text,$img); 108 | $img = json_decode(str_replace('\\','/',str_replace('u002F','',$img[1][0])),1); 109 | $images = array(); 110 | for($i=0;$i 200, 117 | 'msg' => 'success', 118 | 'count' => count($img), 119 | 'images' => $images 120 | ); 121 | return $Json; 122 | } 123 | } 124 | 125 | public function kuaishou($url){ 126 | $loc = get_headers($url,1)['Location']; 127 | $url = $this->curl($loc[0]); 128 | preg_match('/imageCDN\":\"tx2.a.yximgs.com\",\"images\":(.*?)\],\"width/',$url,$arr); 129 | $img = json_decode($arr[1].']',true); 130 | $images = array(); 131 | for($i=0;$i 200, 138 | 'msg' => 'success', 139 | 'count' => count($img), 140 | 'images' => $images 141 | ); 142 | return $arr; 143 | } 144 | } 145 | 146 | private function curl($url, $header = null, $data = null) { 147 | $con = curl_init((string)$url); 148 | curl_setopt($con, CURLOPT_HEADER, false); 149 | curl_setopt($con, CURLOPT_SSL_VERIFYPEER, false); 150 | curl_setopt($con, CURLOPT_RETURNTRANSFER, true); 151 | curl_setopt($con, CURLOPT_FOLLOWLOCATION, 1); 152 | curl_setopt($con, CURLOPT_AUTOREFERER, 1); 153 | if (isset($header)) { 154 | curl_setopt($con, CURLOPT_HTTPHEADER, $header); 155 | } 156 | if (isset($data)) { 157 | curl_setopt($con, CURLOPT_POST, true); 158 | curl_setopt($con, CURLOPT_POSTFIELDS, $data); 159 | } 160 | curl_setopt($con, CURLOPT_TIMEOUT, 5000); 161 | $result = curl_exec($con); 162 | return $result; 163 | } 164 | 165 | private function get_curl($url,$cookie){ 166 | $ch = curl_init(); 167 | curl_setopt($ch, CURLOPT_URL, $url); 168 | curl_setopt($ch, CURLOPT_COOKIE, $cookie); 169 | curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36"); 170 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 171 | curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); 172 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 173 | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 174 | curl_setopt($ch, CURLOPT_TIMEOUT, 5); 175 | $output = curl_exec($ch); 176 | curl_close($ch); 177 | return $output; 178 | } 179 | } 180 | ?> 181 | --------------------------------------------------------------------------------