快手开放平台对接内容管理demo
其中包括用户授权,获取accessToken,获取用户信息,自动上传视频,发布视频,视频列表,删除视频等
<?php
namespace app\controller;use app\BaseController;
use think\Exception;
use think\facade\App;class KuaiShou extends BaseController
{private $accessToken = "";private $appId = "";private $appSecret = "";private $uploadToken; // 上传令牌private $endpoint;//上传网关的域名private $redirectUri = '';/*** 用户授权* */public function authorize($name = 'ThinkPHP6'){// 要请求的 URL$url = 'https://open.kuaishou.com/oauth2/authorize?';$params = ['app_id' => $this->appId, // 应用唯一标识'scope' => 'user_info,user_base,user_video_publish,user_video_delete,user_video_info', // code'response_type' => 'code','redirect_uri' => $this->redirectUri,// 应用授权作用域,多个授权作用域以英文逗号(,)分隔'state' => '123456789', //安全参数,标识和用户或者设备相关的授权请求。建议开发者实现。回调的时候会带回。'ua' => 'pc', // 运行环境,普通网页传pc, H5网页不传此参数即可];//// 调用 CURL GET 请求方法$result = $this->performCurlGetRequestWithParameters($url,$params);exit;}/*** 获取access_token* */public function getAccessToken(){$url = "https://open.kuaishou.com/oauth2/access_token?";$data = ['app_id' => $this->appId,'app_secret' => $this->appSecret,'code' => 'b0881372a93aa4434335c4d3e9a1773dcc8cd759c65b965a727a6ec18b85699867841685','grant_type' => 'authorization_code',];$result = $this->performCurlGetRequestWithParameters($url,$data);dd($result);}/*** 刷新token* */public function refreshAccessToken(){$url = "https://open.kuaishou.com/oauth2/refresh_token?";$data = ['app_id' => $this->appId,'app_secret' => $this->appSecret,"refresh_token" => "ChJvYXV0aC5yZWZyZXNoVG9rZW4SoAEWZ1a48M_hdbBMnUf1R2Tep9mcpFOllaVLX_uHdVL-1D7pLxV1PrdS-cy44h1ecc8LaWeyA6By76joHJXUE8LHnPjWSq1lotOS1a4GczDxoDo9bAzkoln3lGdTxh3OaHkuXUAPku_IW7H7ql81DPORYZmVK6RQHNb3EVkLBuelvp9nxTwThxZxUYe1LZcMsKGAsbFrXtfMaIhrXclDfIVTGhJmpGi_HIZyL3299lSodYIPN3UiIInoA_U1haHPefAICe8rsnU1-tjTZu3NxcCPR3vzLlERKAUwAQ",'grant_type' => 'refresh_token',];$result = $this->performCurlGetRequestWithParameters($url,$data);dd($result);}/*** 获取用户信息* */public function getUserInfo(){$url = "https://open.kuaishou.com/openapi/user_info?";$data = ['app_id' => $this->appId,'access_token' => $this->accessToken];$result = $this->performCurlGetRequestWithParameters($url,$data);dd($result);}/*** 获取用户手机号码* */public function getUserPhone(){$url = "https://open.kuaishou.com/openapi/user_phone?";$data = ['app_id' => $this->appId,'access_token' => $this->accessToken];$result = $this->performCurlGetRequestWithParameters($url,$data);dd($result);}/*** 发起上传* */public function startUpload(){$url = "https://open.kuaishou.com/openapi/photo/start_upload?";$data = ['app_id' => $this->appId,'access_token' => $this->accessToken];$params = '';foreach ($data as $key => $val) {$params .= "$key=$val&";}$url .= rtrim($params, '&');$res = $this->sendPostRequest($url);$res = json_decode($res, true);if ($res['result'] == 1) {$this->uploadToken = $res['upload_token'];$this->endpoint = $res['endpoint'];}}/*** 视频上传 FormData* */public function uploadForFormData(){$basePath = App::getBasePath();// 构造runtime文件夹的完整路径$runtimePath = $basePath . '../runtime/storage/';;// 获取表单上传文件 例如上传了001.jpg$file = request()->file('file');// 上传到本地服务器$savename = \think\facade\Filesystem::putFile( 'topic', $file);$url = "http://{$this->endpoint}/api/upload/multipart?upload_token={$this->uploadToken}";$file_path = $runtimePath.$savename;$result = $this->sendPostFileRequest($url, $file_path);dd($result);}/*** body二进制 视频上传* */public function uploadForBinaryData(){$basePath = App::getBasePath();// 构造runtime文件夹的完整路径$runtimePath = $basePath . '../runtime/storage/';;// 获取表单上传文件 例如上传了001.jpg$file = request()->file('file');// 上传到本地服务器$savename = \think\facade\Filesystem::putFile( 'topic', $file);$url = "http://{$this->endpoint}/api/upload?upload_token={$this->uploadToken}";$file_path = $runtimePath.$savename;$result = $this->sendPostBinaryDataRequest($url, $file_path);dd($result);}/*** 分片上传* */public function uploadFragment(){$basePath = App::getBasePath();// 构造runtime文件夹的完整路径$runtimePath = $basePath . '../runtime/storage/';;// 获取表单上传文件 例如上传了001.jpg$file = request()->file('file');// 上传到本地服务器$savename = \think\facade\Filesystem::putFile( 'topic', $file);$file_path = $runtimePath.$savename;// 使用示例$chunkSize = 1024 * 1024 * 2; // 分片大小,例如:1MB$chunks = $this->splitFileIntoChunks($file_path, $chunkSize);$is_file = false;foreach ($chunks as $k => $chunk) {// 对每个分片进行处理,例如上传到服务器或写入到另一个文件$url = "http://{$this->endpoint}/api/upload/fragment?fragment_id={$k}&upload_token={$this->uploadToken}";$result = $this->sendPostBinaryDataRequest($url, $chunk, $is_file);}echo $k;}/*** 断点续传* */public function uploadResume(){$endpoint = "upload.kuaishouzt.com";$url = "http://{$endpoint}/api/upload/resume?upload_token={$this->uploadToken}";$this->performCurlGetRequestWithParameters($url);}/*** 完成分片上传* */public function uploadComplete(){$fragment_count = 10;$url = "http://{$this->endpoint}/api/upload/complete?upload_token={$this->uploadToken}&fragment_count={$fragment_count}";$this->sendPostRequest($url);}function splitFileIntoChunks($filePath, $chunkSize) {$fileHandle = fopen($filePath, 'rb'); // 以二进制读取模式打开文件if ($fileHandle === false) {return false;// 如果文件打开失败,返回false}$chunks = [];while (!feof($fileHandle)) {$buffer = fread($fileHandle, $chunkSize);// 读取文件的一个片段if ($buffer === false) {break;// 如果读取失败,跳出循环}$chunks[] = $buffer; // 将片段添加到数组中}fclose($fileHandle); // 关闭文件句柄return $chunks;// 返回包含所有片段的数组}/*** 发布视频* */public function publish(){$basePath = App::getBasePath();// 构造runtime文件夹的完整路径$runtimePath = $basePath . '../runtime/storage/';;// 获取表单上传文件 例如上传了001.jpg$file = request()->file('file');// 上传到本地服务器$savename = \think\facade\Filesystem::putFile( 'topic', $file);$file_path = $runtimePath.$savename;$url = "https://open.kuaishou.com/openapi/photo/publish?";$data = ['app_id' => $this->appId,'access_token' => $this->accessToken,'upload_token' => $this->uploadToken,];$params = '';foreach ($data as $key => $val) {$params .= "$key=$val&";}$url .= rtrim($params, '&');$title = "分片";$res = $this->sendPostFileRequest1($url,$file_path,$title);dd($res);}/*** 查询用户视频列表* */public function userVideoList(){$url = "https://open.kuaishou.com/openapi/photo/list?";$data = ['access_token' => $this->accessToken,'app_id' => $this->appId];$this->performCurlGetRequestWithParameters($url, $data);}/*** 删除视频* */public function deleteVideo(){$url = "https://open.kuaishou.com/openapi/photo/delete?";$data = ['access_token' => $this->accessToken,'app_id' => $this->appId,'photo_id' => '3xurpbkusbyh6hw'];$params = '';foreach ($data as $key => $val) {//if ($key=='redirect_uri') $val = urlEncode($val);$params .= "$key=$val&";}$url .= rtrim($params, '&');$res = $this->sendPostRequest($url);dd($res);}/*** params string $url 请求的url* $file_path 文件路径* */public function sendPostFileRequest1($url,$file_path, $title){// 初始化cURL会话$ch = curl_init();// 设置目标URLcurl_setopt($ch, CURLOPT_URL, $url);// 启用POST方法,并设置请求体的类型为multipart/form-datacurl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, array('cover' => new \CURLFile($file_path),'caption' => $title));curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 为cURL会话设置适当的请求头curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));// 设置cURL选项,以便将响应结果直接作为字符串返回,而不是输出到浏览器curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 执行cURL请求并获取结果$response = curl_exec($ch);// 检查是否有错误发生if (curl_errno($ch)) {echo 'cURL error: ' . curl_error($ch);}// 关闭cURL会话curl_close($ch);// 输出响应结果echo $response;return $response;}public function sendPostBinaryDataRequest($url, $binaryData, $is_file = true){// 初始化cURL会话$ch = curl_init();// 设置目标URL,替换{endpoint}为实际的服务器地址// 设置请求头$headers = array('Content-Type: video/mp4');if ($is_file) {// 准备二进制数据,这里假设$binaryData是文件的二进制内容$binaryData = file_get_contents($binaryData);}// 替换为实际的文件二进制内容// 设置cURL选项curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);curl_setopt($ch, CURLOPT_POSTFIELDS, $binaryData);// 设置cURL选项,以便将响应结果直接作为字符串返回,而不是输出到浏览器curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 执行cURL请求$response = curl_exec($ch);// 检查是否有错误发生if(curl_errno($ch)) {echo 'cURL error: ' . curl_error($ch);}// 关闭cURL会话curl_close($ch);// 输出响应结果return $response;}public function sendPostFileRequest($url,$file_path ){// 初始化cURL会话$ch = curl_init();// 设置目标URLcurl_setopt($ch, CURLOPT_URL, $url);// 启用POST方法,并设置请求体的类型为multipart/form-datacurl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, array('file' => new \CURLFile($file_path),));// 为cURL会话设置适当的请求头curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));// 设置cURL选项,以便将响应结果直接作为字符串返回,而不是输出到浏览器curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 执行cURL请求并获取结果$response = curl_exec($ch);// 检查是否有错误发生if (curl_errno($ch)) {echo 'cURL error: ' . curl_error($ch);}// 关闭cURL会话curl_close($ch);// 输出响应结果echo $response;return $response;}public function sendPostRequest($url, $data = array(), $headers = array()) {// 创建 curl 实例$ch = curl_init();// 设置请求 URLcurl_setopt($ch, CURLOPT_URL, $url);// 设置 POST 请求方式curl_setopt($ch, CURLOPT_POST, 1);// 设置请求头为 application/json//$headers[] = "Content-Type: application/json";if ($data) {// 将数据以 JSON 格式发送curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));}curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);// 忽略 SSL 认证curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);// 设置cURL选项,以便将响应结果直接作为字符串返回,而不是输出到浏览器curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 执行 curl 请求$response = curl_exec($ch);// 获取响应代码$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);// 关闭 curl 连接curl_close($ch);return $response;}function performCurlGetRequestWithParameters($url, $parameters = []) {// 构建带有参数的 URL$params = '';foreach ($parameters as $key => $val) {//if ($key=='redirect_uri') $val = urlEncode($val);$params .= "$key=$val&";}$url .= rtrim($params, '&');header("Content-Type: application/json");header("Location: $url");die();var_dump($url);exit;// 执行 CURL GET 请求$this->performCurlGetRequest($url);}/*** 执行 CURL GET 请求的方法** @param string $url 要请求的 URL* @return string 请求的结果*/function performCurlGetRequest($url,$data = array()) {// 初始化 CURL$ch = curl_init();// 设置请求方式为 GETcurl_setopt($ch, CURLOPT_HTTPGET, true);// 设置要请求的 URLcurl_setopt($ch, CURLOPT_URL, $url);// 禁用 SSL 证书验证curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 设置默认的头部信息$headers = ['Content-Type: application/json'];curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);// 将数据以 JSON 格式发送curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));// 执行请求$result = curl_exec($ch);// 检查请求是否成功if (curl_errno($ch)) {// 处理请求失败的情况echo "CURL 请求失败: ". curl_error($ch);return;}// 关闭 CURL 连接curl_close($ch);// 返回请求结果return $result;}}
相关文章:
快手开放平台对接内容管理demo
其中包括用户授权,获取accessToken,获取用户信息,自动上传视频,发布视频,视频列表,删除视频等 <?php namespace app\controller;use app\BaseController; use think\Exception; use think\facade\App;…...

2024年32款数据分析工具分五大类总览
数据分析工具在现代商业和科学中扮演着不可或缺的角色,为组织和个人提供了深入洞察和明智决策的能力。这些工具不仅能够处理大规模的数据集,还能通过强大的分析和可视化功能揭示隐藏在数据背后的模式和趋势。数据分析工具软件主要可以划分为以下五个类别…...

WPS的JS宏如何批量实现文字的超链接
表格中需要对文字进行超链接,每个链接指引到不同的地址。例如: 实现如下表格中,文件名称超级链接到对应的文件路径上,点击对应的文件名称,即可打开对应的文件。 序号文件名称文件路径1变更申请与处理表.xls文档\系统…...
0203逆矩阵-矩阵及其运算-线性代数
文章目录 一、逆矩阵的定义、性质和求法二、逆矩阵的初步应用结语 一、逆矩阵的定义、性质和求法 定义7 对于 n n n阶矩阵A,如果有一个 n n n阶矩阵B,使 A B B A E ABBAE ABBAE 则说矩阵A是可逆的,并把矩阵B称为A的逆矩阵,简称逆…...

加州大学欧文分校英语基础语法专项课程03:Simple Past Tense 学习笔记(完结)
Learn English: Beginning Grammar Specialization Specialization Certificate course 3: Simple Past Tense Course Certificate 本文是学习 https://www.coursera.org/learn/simple-past-tense 这门课的学习笔记,如有侵权,请联系删除。…...

基于Java微信小程序的医院挂号小程序,附源码
博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇dz…...
7.网络编程-安全
目录 引言 Session Cookie JWT (JSON Web Token) 网络攻击 CSRF DDoS 其他常见网络攻击类型及应对措施 引言 Session、Cookie 和 JWT 都是Web开发中用于实现用户状态管理和身份验证的技术。它们各自有不同的特点和应用场景: Session Session 是一种服务器…...

信息泄露漏洞的JS整改方案
引言 🛡️ 日常工作中,我们经常会面临线上环境被第三方安全厂商扫描出JS信息泄露漏洞的情况,这给我们的系统安全带来了潜在威胁。但幸运的是,对于这类漏洞的整改并不复杂。本文将介绍几种可行的整改方法,以及其中一种…...
WKWebView的使用
一、简介 在iOS中,WKWebView是WebKit框架提供的一个用于展示网页内容的控件,相比UIWebView有更好的性能和功能。 以下是在iOS中使用WKWebView的基本步骤: 1.1 导入WebKit框架 import WebKit1.2 创建WKWebView实例 let webView WKWebVie…...
iOS MT19937随机数生成,结合AES-CBC加密算法实现。
按处理顺序说明: 1. 生成随机数序列字符串函数 生成方法MT19937,初始种子seed,利用C库方法,生成: #include <random> //C 库头文件引入NSString * JKJMT19937Seed(uint32_t seed) {NSLog("MT19937Seed种…...

阿里云2024年优惠券获取方法及使用教程详解
阿里云是阿里巴巴集团旗下的云计算服务提供商,是全球领先的云计算及人工智能科技公司之一。提供免费试用、云服务器、云数据库、云安全、云企业应用等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。 阿里云2024年优惠券的获取方…...
hadoop中hdfs的fsimage文件与edits文件
hadoop中hdfs的fsimage文件与edits文件的作用 首先,我们抛出fsimage和edits文件的功能描述。 Fsimage文件: HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的 所有目录和文件inode的序列化信息。 Edits文件:存放HDFS文件系统的所有更…...

最新版两款不同版SEO超级外链工具PHP源码
可根据个人感觉喜好自行任意选择不同版本使用(版V1或版V2) 请将zip文件全部解压缩即可访问! 源码全部开源,支持上传二级目录访问 已更新增加大量高质量外链(若需要增加修改其他外链请打开txt文件)修复优…...

.net框架和c#程序设计第二次测试
一、实验内容 1、设计一个用户登录页面webform1.aspx,效果如下图所示: 2、点击webform1.aspx中“还未注册”连接进入register.aspx,注册页面效果如下图所示:点击用户注册信息到usershow.aspx页面,并显示注册的用户信息…...

芒果YOLOv8改进组合157:动态标签分配ATSS+新颖高效AsDDet检测头组合改进,共同助力VisDrone涨点1.8%,小目标高效涨点
💡本篇内容:【芒果YOLOv8改进ATSS标签分配策略|第三集】芒果YOLOv8改进组合157:动态标签分配ATSS+新颖高效AsDDet检测头组合改进,共同助力VisDrone涨点1.8%,小目标高效涨点 💡🚀🚀🚀本博客 标签分配策略ATSS改进+ 新颖高效AsDDet检测头组合改进,适用于 YOLOv8 …...

自媒体内容创作助手:7款必备ai写作工具一览! #学习方法#科技#其他
这些工具不仅可以快速生成高质量的文本内容,还可以根据用户的需求进行个性化定制。它们可以帮助我们节省大量的时间和精力,让我们更加专注于创意和细节的打磨。本文将为大家详细介绍几个AI写作工具,让你在写作领域更上一层楼。 1.七燕写作 这…...
文心一言 vs GPT-4 -- 全面横向比较
文心一言和GPT-4都是当前非常先进的自然语言处理模型,它们在语言理解、生成和翻译等方面都展现出了出色的能力。以下是对这两个模型的全面横向比较: 核心技术基础: 文心一言:是基于BERT(Bidirectional Encoder Repre…...

Leetcode C语言习题
Leetcode习题27:移除元素 题目: 说明: 示例: 题解: 方法一:(开辟额外的数组空间) 我们可以创建一个新的数组,然后用循环来遍历原数组,将原数组中不为 val…...

比 Nest.js 更优雅的 TS 控制反转策略 - 依赖查找
一、Cabloy5.0 内测预告 Cabloy5.0 采用 TS 对整个全栈框架进行了脱胎换骨般的大重构,并且提供了更加优雅的 ts 控制反转策略,让我们的业务开发更加快捷顺畅 1. 新旧技术栈对比: 后端前端旧版js、egg2.0、mysqljs、vue2、framework7新版ts…...

java算法day43 | 动态规划part05 ● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零
1049. 最后一块石头的重量 II 核心思想: 尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。 是不是感觉和昨天讲解的416. 分割等和子集 (opens new window)非常像了。那么分成两堆石头,一堆石头的…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...

JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...